Comment puis-je prendre en compte la covariance spatiale dans un modèle linéaire?

10

Contexte

J'ai des données d'une étude de terrain dans laquelle il y a quatre niveaux de traitement et six répétitions dans chacun des deux blocs. (4x6x2 = 48 observations)

Les blocs sont distants d'environ 1 mile, et à l'intérieur des blocs, il y a une grille de 42 parcelles de 2m x 4m et une passerelle de 1m de large; mon étude n'a utilisé que 24 parcelles dans chaque bloc.

Je voudrais évaluer évaluer la covariance spatiale.

Voici un exemple d'analyse utilisant les données d'un seul bloc, sans tenir compte de la covariance spatiale. Dans l'ensemble de données, plotest l'ID du tracé, xl'emplacement x et yl'emplacement y de chaque tracé avec le tracé 1 centré sur 0, 0. levelest le niveau de traitement et responsela variable de réponse.

layout <- structure(list(plot = c(1L, 3L, 5L, 7L, 8L, 11L, 12L, 15L, 16L, 
17L, 18L, 22L, 23L, 26L, 28L, 30L, 31L, 32L, 35L, 36L, 37L, 39L, 
40L, 42L), level = c(0L, 10L, 1L, 4L, 10L, 0L, 4L, 10L, 0L, 4L, 
0L, 1L, 0L, 10L, 1L, 10L, 4L, 4L, 1L, 1L, 1L, 0L, 10L, 4L), response = c(5.93, 
5.16, 5.42, 5.11, 5.46, 5.44, 5.78, 5.44, 5.15, 5.16, 5.17, 5.82, 
5.75, 4.48, 5.25, 5.49, 4.74, 4.09, 5.93, 5.91, 5.15, 4.5, 4.82, 
5.84), x = c(0, 0, 0, 3, 3, 3, 3, 6, 6, 6, 6, 9, 9, 12, 12, 12, 
15, 15, 15, 15, 18, 18, 18, 18), y = c(0, 10, 20, 0, 5, 20, 25, 
10, 15, 20, 25, 15, 20, 0, 15, 25, 0, 5, 20, 25, 0, 10, 20, 
25)), .Names = c("plot", "level", "response", "x", "y"), row.names = c(NA, 
-24L), class = "data.frame")

model <- lm(response ~ level, data = layout)      
summary(model)

Des questions

  1. Comment puis-je calculer une matrice de covariance et l'inclure dans ma régression?
  2. Les blocs sont très différents et il existe de fortes interactions entre les blocs de traitement et les blocs. Est-il approprié de les analyser séparément?
David LeBauer
la source
1
Les parcelles 37 et 39 sont toutes les deux à x = 18, y = 10. Faute de frappe?
Aaron a quitté Stack Overflow
@Aaron merci de l'avoir signalé. y = [0,10]. Fixé.
David LeBauer

Réponses:

10

1) Vous pouvez modéliser la corrélation spatiale avec la nlmebibliothèque; vous pouvez choisir plusieurs modèles. Voir pages 260-266 de Pinheiro / Bates.

Une bonne première étape consiste à faire un variogramme pour voir comment la corrélation dépend de la distance.

library(nlme)
m0 <- gls(response ~ level, data = layout)  
plot(Variogram(m0, form=~x+y))

Ici, le semi-variogramme de l'échantillon augmente avec la distance, ce qui indique que les observations sont effectivement spatialement corrélées.

Une option pour la structure de corrélation est une structure sphérique; qui pourrait être modélisé de la manière suivante.

m1 <- update(m0, corr=corSpher(c(15, 0.25), form=~x+y, nugget=TRUE))

Ce modèle semble mieux correspondre au modèle sans structure de corrélation, bien qu'il soit tout à fait possible qu'il puisse également être amélioré avec l'une des autres structures de corrélation possibles.

> anova(m0, m1)
   Model df     AIC      BIC    logLik   Test  L.Ratio p-value
m0     1  3 46.5297 49.80283 -20.26485                        
m1     2  5 43.3244 48.77961 -16.66220 1 vs 2 7.205301  0.0273

2) Vous pouvez également essayer d'inclure xet ydirectement dans le modèle; cela pourrait être approprié si le modèle de corrélation dépend de plus que de la distance. Dans votre cas (en regardant les photos de sesqu), il semble que pour ce bloc de toute façon, vous pouvez avoir un motif diagonal.

Ici, je mets à jour le modèle d'origine au lieu de m0 car je ne modifie que les effets fixes, donc les modèles doivent tous les deux être ajustés en utilisant le maximum de vraisemblance.

> model2 <- update(model, .~.+x*y)
> anova(model, model2)
Analysis of Variance Table

Model 1: response ~ level
Model 2: response ~ level + x + y + x:y
  Res.Df    RSS Df Sum of Sq      F   Pr(>F)   
1     22 5.3809                                
2     19 2.7268  3    2.6541 6.1646 0.004168 **

Pour comparer les trois modèles, vous devez tous les ajuster avec glsla méthode du maximum de vraisemblance au lieu de la méthode par défaut de REML.

> m0b <- update(m0, method="ML")
> m1b <- update(m1, method="ML")
> m2b <- update(m0b, .~x*y)
> anova(m0b, m1b, m2b, test=FALSE)
    Model df      AIC      BIC     logLik
m0b     1  3 38.22422 41.75838 -16.112112
m1b     2  5 35.88922 41.77949 -12.944610
m2b     3  5 29.09821 34.98847  -9.549103

N'oubliez pas que, surtout avec votre connaissance de l'étude, vous pourriez être en mesure de trouver un modèle meilleur que n'importe lequel d'entre eux. Autrement dit, le modèle m2bne doit pas nécessairement être considéré comme le meilleur à ce jour.

Remarque: Ces calculs ont été effectués après avoir changé la valeur x du tracé 37 en 0.

Aaron a laissé Stack Overflow
la source
merci pour votre réponse utile; il n'est pas clair pourquoi dans la partie 2 vous avez mis à jour modelau lieu de m0, par exemple. m2 <- update(m0, .~.+x*y)afin que les trois modèles puissent être comparés en utilisant anova(m0,m1,m2); après avoir fait cela, m2est un gros perdant (AIC = 64) il semble que votre part
David LeBauer
ps la dernière ligne doit être «après avoir changé la valeur y du tracé 37 en 5»; la valeur réelle est 0, mais les résultats sont équivalents.
David LeBauer
Si vous comparez m0, m1et m2comme vous le suggérez, vous obtenez l'avertissement: Fitted objects with different fixed effects. REML comparisons are not meaningful. Pour comparer les effets fixes, vous devez utiliser la probabilité maximale régulière au lieu de REML. Voir modifier.
Aaron a quitté Stack Overflow
Merci pour tout votre aide. Je ne sais pas pourquoi, mais j'obtiens des erreurs lorsque j'essaie d'adapter d'autres structures de corrélation, par exemple en utilisant corExp comme dans l'exemple de Pinheiro et Bates. J'ai ouvert une question sur SO à propos de cette erreur, mais votre contribution serait appréciée.
David LeBauer
4

1) Quelle est votre variable explicative spatiale? On dirait que le plan x * y serait un mauvais modèle pour l'effet spatial.

tracé des traitements et des réponses

i=c(1,3,5,7,8,11,14,15,16,17,18,22,23,25,28,30,31,32,35,36,39,39,41,42)
l=rep(NA,42)[i];l[i]=level
r=rep(NA,42)[i];r[i]=response
image(t(matrix(-l,6)));title("treatment")
image(t(matrix(-r,6)));title("response")

2) Étant donné que les blocs sont distants d'un mile et que vous vous attendez à voir des effets sur seulement 30 mètres, je dirais qu'il est tout à fait approprié de les analyser séparément.

sesqu
la source
La visualisation est utile, mais si vous comparez le coin inférieur droit au coin supérieur droit des figures, il me semble que l'emplacement a un effet plus fort que le niveau. (ps je pense que l [i] = la réponse devrait être r [i] = ...)
David LeBauer
Oui. L'effet de localisation est remarquable, et vous voudriez donc vraiment un bon modèle pour cela avant de commencer à estimer les effets du traitement. Malheureusement, il y a beaucoup de données manquantes, il est donc difficile de dire ce que cela devrait être - le mieux que je puisse trouver serait un effet de localisation de la modélisation en tant que moyenne de la réponse des voisins + composante aléatoire, puis d'essayer le traitement sur cela . C'est très suspect, donc toute connaissance supplémentaire du domaine serait précieuse. faute de frappe.
sesqu
@sesqu ... il n'y a pas de données manquantes, les données des 24 parcelles situées au hasard sont là.
David LeBauer
Il manque des données dans le sens où toutes les paires x, y n'ont pas de données.
Aaron a quitté Stack Overflow