Wolfgang,
Thanks for this awesome submission. It was very helpful. I however have a questions..
On line 165 you perform the following operation
edges(end) = inf;
Can you explain the logic behind it?
The reason that I ask it that when the data is uniformly distributed in space the number of data pairs separated by a lag (h) decreases as h increases.
However, as written line 165 then makes later lines (l78 and 179)
S.val = accumarray(ixedge,...
lam,[numel(edges) 1],fvar,nan);
S.num = accumarray(ixedge,ones(size(lam))...
,[numel(edges) 1],@sum,nan);
Calculate the gamma value and the number of pairs using the the rest of the data set. You then do a final modification of the arrays but that does eliminate the extra data poins used int he Variogram calculation..
Let me give you an example.
My edges vector before line 165
250 500 750 1000 1250 1500 1750 2000 2250 2500 2750 3000
My edges vector after line 165
250 500 750 1000 1250 1500 1750 2000 2250 2500 2750 Inf
Then on lines
178,179 and 186, 187
you produce the S.distance,S.num and S.val struct arrays
This is what the S.distance says:
625
875
1125
1375
1625
1875
2125
2375
2625
2875
Then this is what the S.num says:
41
40
39
38
37
36
35
34
33
32
31
59
You see That 59 should not be there there are no 59 number of data pairs with an average lag distance of 2875. In fact there are only 30.
If I comment line 165 then I get the expected result of monotonically decreasing number of pairs as lag distance increases.
Let me know what you think...
Carlos Soto
Fantastic code - just what I needed. However, I am trying to modify it a bit for cross-variogram. Can I do it this way: save the
lam = (y(iid(:,1))-y(iid(:,2)));
for two separate variable (say A and B) Combine=bsxfun(@times, lamA,lamB);
Combine_cross = accumarray([ixedge ixtheta],Combine,...
[21 7],fvar,nan);
Combine_cross(:,end)=Combine_cross(:,1);
Is this approach correct?
Thanks
Hi Wolfgang!
Thank you for this, it is a very good one!
Could you please explain me, where is your algorithm calculate the separation (or lag) vector(h). Theoretically, if I am calculating a variogram, I use this formula:
gamma^2(h)=(1/2N(h))*sum(f(u+h)-f(u))^2
Did you used the same? If yes, how do you calculated h? (in which row?)
Thank you!
Zoltán
@JG: Yes, [x y] can also be a nx1 vector with n number of points in time. Use datenum to calculate a numeric vector from your dates. Variogram doesn't do the conversion for you.
Comment only