Come posso spiegare la covarianza spaziale in un modello lineare?


10

sfondo

Ho dati da uno studio sul campo in cui ci sono quattro livelli di trattamento e sei repliche in ciascuno dei due blocchi. (4x6x2 = 48 osservazioni)

I blocchi si trovano a circa 1 miglio di distanza e all'interno dei blocchi vi è una griglia di 42, 2 mx 4 m e una passerella larga 1 m; il mio studio ha usato solo 24 grafici in ciascun blocco.

Vorrei valutare valutare la covarianza spaziale.

Ecco un'analisi di esempio usando i dati di un singolo blocco, senza tenere conto della covarianza spaziale. Nel set di dati, plotè l'id della trama, xè la posizione xe la posizione yy di ogni diagramma con il diagramma 1 centrato su 0, 0. levelè il livello di trattamento ed responseè la variabile di risposta.

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)

Domande

  1. Come posso calcolare una matrice di covarianza e includerla nella mia regressione?
  2. I blocchi sono molto diversi e ci sono forti interazioni tra blocchi di trattamento *. È opportuno analizzarli separatamente?

1
I grafici 37 e 39 sono entrambi in x = 18, y = 10. Errore di battitura?
Aaron ha lasciato Stack Overflow

@Aaron grazie per averlo sottolineato. y = [0,10]. Fisso.
David LeBauer,

Risposte:


10

1) È possibile modellare la correlazione spaziale con la nlmelibreria; ci sono diversi modelli che potresti scegliere. Vedi le pagine 260-266 di Pinheiro / Bates.

Un buon primo passo è fare un variogramma per vedere come la correlazione dipende dalla distanza.

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

Qui il semivariogramma del campione aumenta con la distanza indicando che le osservazioni sono effettivamente spazialmente correlate.

Un'opzione per la struttura di correlazione è una struttura sferica; che potrebbe essere modellato nel modo seguente.

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

Questo modello sembra adattarsi meglio del modello senza struttura di correlazione, anche se è del tutto possibile che anche esso possa essere migliorato con una delle altre possibili strutture di correlazione.

> 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) Potresti anche provare a includere xe ydirettamente nel modello; questo potrebbe essere appropriato se il modello di correlazione dipende da qualcosa di più della semplice distanza. Nel tuo caso (guardando le foto di sesqu) sembra che per questo blocco potresti avere un motivo diagonale.

Qui sto aggiornando il modello originale invece di m0 perché sto cambiando solo gli effetti fissi, quindi i modelli dovrebbero adattarsi entrambi con la massima probabilità.

> 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 **

Per confrontare tutti e tre i modelli, è necessario adattarli tutti con glsil metodo di massima verosimiglianza anziché il metodo predefinito di 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

Ricorda che soprattutto con la tua conoscenza dello studio, potresti essere in grado di elaborare un modello migliore di uno di questi. Cioè, il modello m2bnon dovrebbe necessariamente essere considerato il migliore ancora.

Nota: questi calcoli sono stati eseguiti dopo aver modificato il valore x del grafico 37 su 0.


grazie per la tua utile risposta; non è chiaro il motivo per cui nella parte 2 è stato aggiornato modelanziché m0, ad es. m2 <- update(m0, .~.+x*y)in modo che tutti e tre i modelli possano essere confrontati usando anova(m0,m1,m2); dopo aver fatto questo, m2è un grande perdente (AIC = 64) sembra che la tua parte
David LeBauer,

ps l'ultima riga dovrebbe essere 'dopo aver modificato il valore y del diagramma 37 a 5'; il valore effettivo è 0, ma i risultati sono equivalenti.
David LeBauer,

Se confronti m0, m1e m2come suggerisci di ricevere l'avvertimento: Fitted objects with different fixed effects. REML comparisons are not meaningful. Per confrontare gli effetti fissi devi usare la verosimiglianza massima normale invece di REML. Vedi modifica.
Aaron ha lasciato Stack Overflow

grazie per tutto il tuo aiuto. Non sono sicuro del perché, ma ricevo errori quando provo ad adattare altre strutture di correlazione, ad esempio usando corExp come nell'esempio di Pinheiro e Bates. Ho aperto una domanda su SO su questo errore, ma il tuo contributo sarebbe apprezzato.
David LeBauer,

4

1) Qual è la tua variabile esplicativa spaziale? Sembra che il piano x * y sarebbe un modello scadente per l'effetto spaziale.

trama di trattamenti e risposte

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) Visto che i blocchi sono distanti 1 miglio e ti aspetti di vedere effetti per soli 30 metri, direi che è del tutto appropriato analizzarli separatamente.


La visualizzazione è utile, ma se si confronta in basso a destra in alto a destra delle figure, mi sembra che la posizione abbia un effetto più forte del livello. (ps penso che l [i] = la risposta dovrebbe essere r [i] = ...)
David LeBauer,

Sì. L'effetto della posizione è notevole e quindi vorresti davvero un buon modello prima di iniziare a stimare gli effetti del trattamento. Sfortunatamente, ci sono molti dati mancanti, quindi è difficile dire cosa dovrebbe essere - il meglio che posso trovare sarebbe un effetto di localizzazione di modellazione come media della risposta dei vicini + componente casuale, e quindi provare il trattamento su quello . È molto sospetto, quindi qualsiasi ulteriore conoscenza del dominio sarebbe preziosa. errore di battitura.
sabato

@sesqu ... non ci sono dati mancanti, i dati di tutti i 24 grafici posizionati casualmente sono lì.
David LeBauer,

Mancano dati nel senso che non ogni coppia x, y ha dati.
Aaron ha lasciato Stack Overflow
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.