Формула модели тильды R применяется к Matlab?

Я столкнулся с проблемой, которая меня очень беспокоит в данный момент... Я пытаюсь получить вариограмму остатков с помощью Matlab и набора инструментов "BMElib2.0" из известных данных "Meuse" (пакет "sp" в "R" ). Проблема в том, что функция "lscov" возвращает что-то не то (я так думаю) и мои остатки завышаются Matlab (см. вложение https://i.stack.imgur.com/8hXc8.png). Он превышает 0,5 по оси Y! Однако я должен получить это (см. вложение https://i.stack.imgur.com/v0bU8.png). Это заголовок из статьи Minasny & McBratney 2007 года «Пространственное прогнозирование свойств почвы с использованием EBLUP с ковариационной функцией Матерна», и, как вы видите, невязки не превышают 0,3. Я пытался получить результаты от "R", и это то же самое, что Минасны и Макбратни (см. вложение https://i.stack.imgur.com/0a4YZ.png). Синие кружки (остаточные данные) достигают максимума при 0,3 по оси Y. Я обнаружил, что «R» использует специальную команду под названием «формула модели», которая позволяет указать регрессор для другой переменной. Это «тильда» в приведенном ниже коде. Мне нужно установить зависимость между log(zinc) и sqrt(dist).

Мой вопрос прост: есть ли команда в стиле "формулы модели" для Matlab, чтобы получить те же остатки, что и "R" и статья Minasny & McBratney? Или, может быть, моя функция "lscov" не подходит для этого?

Заранее благодарим за любую помощь, которую вы окажете!

Мой код "R" (интересующая меня "тильда" видна в команде "v1"):

library(lattice)
library(gstat)
library(sp)
load(system.file("data", "meuse.rda", package = "sp"))
v1 = variogram(log(zinc) ~ sqrt(dist), locations = ~x + y, data = meuse, width=50, cutoff=2000)
v2 = variogram(log(zinc) ~ 1, locations = ~x + y, data = meuse, width=50, cutoff=2000)
m1 = fit.variogram(v1, vgm(psill = 0.1089, "Mat", range = 40, nugget = 0.084, kappa = 8)) 
m2 = fit.variogram(v2, vgm(psill = 4.9335, "Exp", range = 1412, nugget = 0.086, kappa = 1)) 
plot(gamma~dist, v2, ylim = c(0, 1.05*max(v2$gamma)),col='red', ylab = 
       'semivariance', xlab = 'distance') 
lines(variogramLine(m2, 2000), col='red',ylab ='',xlab='') 
points(gamma~dist, v1, col='blue') 
lines(variogramLine(m1, 2000), col='blue')

Мой код Matlab для остатков ("BMElib2.0" используется для получения вариограмм):

% "coord" (coordinates of the 155 points) and "z" (log of zinc concentration for these 155 points) 
X_Zn = [ones(size(coord(:,2))) coord(:,2) coord(:,1)];
b_derive_Zn = lscov(X_Zn,z);
Zn_derive = X_Zn*b_derive_Zn;
Zn_vec = z - Zn_derive;
figure
plZn_vec = (0:40:2000);
[dZn_vec,vZn_vec,oZn_vec] = vario(coord,Zn_vec,plZn_vec,'kron');
plot(dZn_vec,vZn_vec,'r*');
xlabel('Distance (m)','FontSize',11); ylabel('Variogram','FontSize',11);

person Kabaaz    schedule 24.04.2020    source источник


Ответы (1)


Итак, я отвечаю себе: «lscov» идеально подходит, но мой код Matlab был неправильным. Я попытался:

X_Zn = [ones(size(coord(:,2))) coord(:,2) coord(:,1)];

но это неправильно. Координаты здесь не имеют значения, важно "sqrt(ndist)"! Итак, правильный код:

X_Zn = [ones(size(coord(:,2))) sqrt(ndist)];

Запуск скрипта дает правильную вариограмму остатков :-)... Надеюсь, это поможет другим пользователям!

person Kabaaz    schedule 24.04.2020