Perché ottengo risultati incredibilmente diversi per poly (raw = T) vs. poly ()?


10

Voglio modellare due diverse variabili temporali, alcune delle quali sono fortemente collineari nei miei dati (età + coorte = periodo). In questo modo mi sono imbattuto in alcuni problemi con ee lmerinterazioni di poly(), ma probabilmente non è limitato a lmer, ho ottenuto gli stessi risultati con nlmeIIRC.

Ovviamente manca la mia comprensione di ciò che fa la funzione poly (). Capisco cosa poly(x,d,raw=T)fa e ho pensato senza di raw=Tesso rende polinomi ortogonali (non posso dire di capire davvero cosa significhi), il che rende più semplice l'adattamento, ma non consente di interpretare direttamente i coefficienti.
Ho letto che poiché sto usando la funzione di previsione, le previsioni dovrebbero essere le stesse.

Ma non lo sono, anche quando i modelli convergono normalmente. Sto usando variabili centrate e per prima cosa ho pensato che forse il polinomio ortogonale porta a una maggiore correlazione di effetti fissi con il termine di interazione collineare, ma sembra comparabile. Ho incollato due riepiloghi di modelli qui .

Si spera che questi grafici illustrino l'entità della differenza. Ho usato la funzione predict che è disponibile solo nello sviluppatore. versione di lme4 (ne ho sentito parlare qui ), ma gli effetti fissi sono gli stessi nella versione CRAN (e sembrano anche spenti da soli, ad esempio ~ 5 per l'interazione quando il mio DV ha un intervallo di 0-4).

La chiamata più lenta era

cohort2_age =lmer(churchattendance ~ 
poly(cohort_c,2,raw=T) * age_c + 
ctd_c + dropoutalive + obs_c + (1+ age_c |PERSNR), data=long.kg)

La previsione era solo effetti fissi, su dati falsi (tutti gli altri predittori = 0) in cui ho contrassegnato l'intervallo presente nei dati originali come estrapolazione = F.

predict(cohort2_age,REform=NA,newdata=cohort.moderates.age)

Posso fornire più contesto se necessario (non sono riuscito a produrre facilmente un esempio riproducibile, ma ovviamente posso fare di più), ma penso che questo sia un motivo di base: spiegami la poly()funzione, per favore, per favore.

Polinomi grezzi

Polinomi grezzi

Polinomi ortogonali (troncati, non ritagliati a Imgur )

Polinomi ortogonali

Risposte:


10

Penso che questo sia un bug nella funzione di previsione (e quindi colpa mia), che in effetti non condivide. ( Modifica : dovrebbe essere risolto nella versione più recente di R-forge di lme4.) Vedi sotto per un esempio ...

Penso che la tua comprensione dei polinomi ortogonali sia probabilmente giusta. La cosa difficile che devi sapere su di loro se stai cercando di scrivere un metodo di previsione per una classe di modelli è che la base per i polinomi ortogonali è definita sulla base di un dato set di dati, quindi se ingenuamente (come ho fatto io! ) model.matrixper provare a generare la matrice di progettazione per un nuovo set di dati, si ottiene una nuova base, che non ha più senso con i vecchi parametri. Fino a quando non lo avrò risolto, potrei aver bisogno di inserire una trappola che dice alle persone che predictnon funzionano con basi polinomiali ortogonali (o basi spline, che hanno la stessa proprietà).

d <- expand.grid(x=seq(0,1,length=50),f=LETTERS[1:10])
set.seed(1001)
u.int <- rnorm(10,sd=0.5)
u.slope <- rnorm(10,sd=0.2)
u.quad <- rnorm(10,sd=0.1)
d <- transform(d,
               ypred = (1+u.int[f])+
               (2+u.slope[f])*x-
               (1+u.quad[f])*x^2)
d$y <- rnorm(nrow(d),mean=d$ypred,sd=0.2)
ggplot(d,aes(x=x,y=y,colour=f))+geom_line()+
    geom_line(aes(y=ypred),linetype=2)

library(lme4)
fm1 <- lmer(y~poly(x,2,raw=TRUE)+(1|f)+(0+x|f)+(0+I(x^2)|f),
            data=d)


fm2 <- lmer(y~poly(x,2)+(1|f)+(0+x|f)+(0+I(x^2)|f),
            data=d)
newdat <- data.frame(x=unique(d$x))
plot(predict(fm1,newdata=newdat,REform=NA))
lines(predict(fm2,newdata=newdat,REform=NA),col=2)
detach("package:lme4")

library(nlme)
fm3 <- lme(y~poly(x,2,raw=TRUE),
           random=list(~1|f,~0+x|f,~0+I(x^2)|f),
            data=d)
VarCorr(fm3)

fm4 <- lme(y~poly(x,2),
           random=list(~1|f,~0+x|f,~0+I(x^2)|f),
            data=d)

newdat <- data.frame(x=unique(d$x))
lines(predict(fm3,newdata=newdat,level=0),col=4)
lines(predict(fm4,newdata=newdat,level=0),col=5)

Grazie, è rassicurante. Per ribadire: ho letto che non puoi prendere gli effetti fissi polinomiali ortogonali al valore nominale, ma a volte sembrano follemente grandi. Ad esempio, se eseguo un'interazione di due polinomi cubici, ottengo effetti fissi per i polinomi e le loro interazioni nell'intervallo da -22 a -127400. Questo mi sembra lontano, soprattutto considerando che tutti gli effetti fissi sono negativi. Una funzione di previsione rivista avrebbe senso per questi effetti fissi o i modelli convergessero erroneamente o il loro qualcosa non andava bene in fondo?
Ruben,

Ancora una volta, sospetto (ma ovviamente non lo so per certo) che tutto vada bene. Orth. i polinomi sono buoni per la stabilità numerica e il test delle ipotesi, ma (come stai immaginando) i valori dei parametri effettivi possono essere più difficili da interpretare. L'attuale versione di lme4-devel (ho appena pubblicato una versione che dovrebbe superare i test, potrebbero essere necessarie ~ 24 ore per ricostruire su r-forge, a meno che non sia possibile compilare da SVN da soli) dovrebbe fornire previsioni corrispondenti tra polinomi grezzi / orto. Un'alternativa è centrare e ridimensionare i predittori continui alla Schielzeth 2010 Metodi in ecologia ed evoluzione ...
Ben Bolker,

Sì, i due polinomi concordano perfettamente ora. Molte grazie! Avevo ridimensionato e centrato i miei predittori, ma alcuni modelli non si adattavano ai polinomi grezzi.
Ruben,
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.