Pythonで可能であれば、経験的/サンプルコバリオグラムを計算する良い方法を知っている人はいますか?
これは、コバリアグラムの適切な定義を含む本のスクリーンショットです。
私がそれを正しく理解していれば、特定のラグ/幅 h に対して、h (または h 未満) で区切られたすべてのポイントのペアを取得し、その値を乗算し、これらのポイントのそれぞれについて、その平均を計算することになっています、この場合、m(x_i) として定義されます。ただし、m(x_{i}) の定義によれば、m(x1) を計算するには、x1 から距離 h 内にある値の平均を取得する必要があります。これは非常に集中的な計算のように見えます。
まず、私はこれを正しく理解していますか?もしそうなら、2次元空間を仮定してこれを計算する良い方法は何ですか? これを Python で (numpy と pandas を使用して) コーディングしようとしましたが、数秒かかり、正しいかどうかさえわかりません。そのため、ここにコードを投稿することは控えます。非常に単純な実装の別の試みを次に示します。
from scipy.spatial.distance import pdist, squareform
distances = squareform(pdist(np.array(coordinates))) # coordinates is a nx2 array
z = np.array(z) # z are the values
cutoff = np.max(distances)/3.0 # somewhat arbitrary cutoff
width = cutoff/15.0
widths = np.arange(0, cutoff + width, width)
Z = []
Cov = []
for w in np.arange(len(widths)-1): # for each width
# for each pairwise distance
for i in np.arange(distances.shape[0]):
for j in np.arange(distances.shape[1]):
if distances[i, j] <= widths[w+1] and distances[i, j] > widths[w]:
m1 = []
m2 = []
# when a distance is within a given width, calculate the means of
# the points involved
for x in np.arange(distances.shape[1]):
if distances[i,x] <= widths[w+1] and distances[i, x] > widths[w]:
m1.append(z[x])
for y in np.arange(distances.shape[1]):
if distances[j,y] <= widths[w+1] and distances[j, y] > widths[w]:
m2.append(z[y])
mean_m1 = np.array(m1).mean()
mean_m2 = np.array(m2).mean()
Z.append(z[i]*z[j] - mean_m1*mean_m2)
Z_mean = np.array(Z).mean() # calculate covariogram for width w
Cov.append(Z_mean) # collect covariances for all widths
ただし、コードにエラーがあることを確認しました。バリオグラムを使用してコバリオグラムを計算したため(コバリオグラム(h)=コバリオグラム(0)-バリオグラム(h))、別のプロットが得られたことがわかりました。
そして、それは次のようになるはずです:
最後に、経験的コバリオグラムを計算するための Python/R/MATLAB ライブラリを知っている場合は、お知らせください。少なくとも、そのようにして、自分が何をしたかを確認できます。