Determination of Heterogeneity Index(HI) by Dykstra-Parsons Coefficient (Vk)

“Saif Abdul Razzaq”

“Basra University For Oil and Gas”

“2024-10-27”

Dykstra-parsons Coefficient

The Dykstra-Parsons method involves plotting the frequency distribution of the permeability on a log-normal probability graph paper. This is done by arranging the permeability values in descending order and then calculating for each permeability, the percent of the samples with permeability greater than that value. to avoid values of zero or 100%, the percent greater than or equal to value is normalized by n+1, where n it is the number of samples.

first, let’s import the data

data = read.csv("karpur.csv")
k_core = data$k.core
summary(k_core)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##     0.42   657.33  1591.22  2251.91  3046.82 15600.00

second, let’s take the permeability and sort in descending order

sorted_k = sort(k_core, decreasing = TRUE)
head(sorted_k)
## [1] 15600.00 14225.31 13544.98 13033.53 11841.74 11117.40

next, for each permeability, calculate the percent of the samples with permeability greater than that value. since the permeability is sorted descending order, we simply made a list with the numbers 1, 2, 3, …, n and each number in the list is divided by (n+1).

n = length(sorted_k) #the total number of samples
k_percent = c(1:n)/(n+1) 
head(k_percent)
## [1] 0.001219512 0.002439024 0.003658537 0.004878049 0.006097561 0.007317073

polt the data on a log-normal probability graph, k_percent on the x-axis, sorted_k on the y-axis

plot(
  x = k_percent, 
  y = sorted_k,
  type="l",
  xlab = "% >= k",
  ylab = "k",
  log='y',
  lwd=2
  )

in the interval [0.1, 0.9] can be approximated vary well with a straight line, so let’s fit a straight line to this portion of the data

nearly_linear_k_values = sorted_k[floor(0.1*n): floor(0.9*n)]
nearly_linear_k_percent = k_percent[floor(0.1*n): floor(0.9*n)]
linear_model = lm(log10(nearly_linear_k_values) ~ nearly_linear_k_percent)
summary(linear_model)
## 
## Call:
## lm(formula = log10(nearly_linear_k_values) ~ nearly_linear_k_percent)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.19128 -0.03880  0.02148  0.04110  0.07176 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              3.885895   0.005010   775.7   <2e-16 ***
## nearly_linear_k_percent -1.461904   0.009112  -160.4   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.05402 on 655 degrees of freedom
## Multiple R-squared:  0.9752, Adjusted R-squared:  0.9751 
## F-statistic: 2.574e+04 on 1 and 655 DF,  p-value: < 2.2e-16
plot(
  x = k_percent, 
  y = sorted_k,
  type="l",
  xlab = "% >= k",
  ylab = "k",
  log='y',
  lwd=2
  )
abline(linear_model, col="red", lwd=2)

The Dykstra-Parsons coefficient of permeability variation, V, is determined from the graph as

V=(k50−k84.1)/k50

where:

k50 = permeability value at %k>= 50 (log mean)

k84.1= permeability value at %k >= 84.1 (one standard deviation)

log_k50_and_84.1 = predict(
  linear_model, 
  data.frame(nearly_linear_k_percent=c(0.50, 0.841))
  )
print(10^log_k50_and_84.1)
##         1         2 
## 1428.7056  453.3498
k50   = 10^log_k50_and_84.1[1]
k84.1 = 10^log_k50_and_84.1[2]
permeability_variation = (k50 - k84.1)/k50
print(permeability_variation)
##        1 
## 0.682685