"Тильда" модель формулы "R" применяется к Matlab? - PullRequest
0 голосов
/ 24 апреля 2020

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

Мой вопрос прост: есть ли команда "формула модели" -i sh для Matlab в Чтобы получить те же остатки, что и в статье «R» и в статье «Минасны и Макбратни»? Или, может быть, моя функция «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);

1 Ответ

0 голосов
/ 24 апреля 2020

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...