Pourquoi est-ce que j'obtiens des résultats extrêmement différents pour poly (raw = T) et poly ()?

10

Je souhaite modéliser deux variables temporelles différentes, dont certaines sont fortement colinéaires dans mes données (âge + cohorte = période). Ce faisant, j'ai rencontré des problèmes avec lmeret et les interactions de poly(), mais ce n'est probablement pas limité à lmer, j'ai obtenu les mêmes résultats avec l' nlmeIIRC.

De toute évidence, ma compréhension de ce que fait la fonction poly () fait défaut. Je comprends ce qui poly(x,d,raw=T)fait et je pensais que sans raw=Tcela, cela fait des polynômes orthogonaux (je ne peux pas dire que je comprends vraiment ce que cela signifie), ce qui facilite l'ajustement, mais ne vous permet pas d'interpréter directement les coefficients.
J'ai lu que parce que j'utilise la fonction de prédiction, les prédictions devraient être les mêmes.

Mais ce n'est pas le cas, même lorsque les modèles convergent normalement. J'utilise des variables centrées et j'ai d'abord pensé que peut-être le polynôme orthogonal conduit à une corrélation à effet fixe plus élevée avec le terme d'interaction colinéaire, mais il semble comparable. J'ai collé deux modèles de résumés ici .

Espérons que ces graphiques illustrent l'ampleur de la différence. J'ai utilisé la fonction prédire qui n'est disponible que dans le dev. version de lme4 (entendu à ce sujet ici ), mais les effets fixes sont les mêmes dans la version CRAN (et ils semblent également éteints par eux-mêmes, par exemple ~ 5 pour l'interaction lorsque mon DV a une plage de 0-4).

L'appel lmer était

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 prédiction était des effets fixes uniquement, sur de fausses données (tous les autres prédicteurs = 0) où j'ai marqué la plage présente dans les données originales comme extrapolation = F.

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

Je peux fournir plus de contexte si nécessaire (je n'ai pas réussi à produire un exemple reproductible facilement, mais je peux bien sûr essayer plus fort), mais je pense que c'est un moyen plus simple: expliquez- poly()moi la fonction, très bien s'il vous plaît.

Polynômes bruts

Polynômes bruts

Polynômes orthogonaux (coupés, non coupés à Imgur )

Polynômes orthogonaux

Ruben
la source

Réponses:

10

Je pense que c'est un bug dans la fonction de prédiction (et donc ma faute), qui en fait nlme ne partage pas . ( Modifier : devrait être corrigé dans la version la plus récente de R-forge lme4.) Voir ci-dessous pour un exemple ...

Je pense que votre compréhension des polynômes orthogonaux est probablement très bien. La chose délicate que vous devez savoir à leur sujet si vous essayez d'écrire une méthode de prédiction pour une classe de modèles est que la base des polynômes orthogonaux est définie en fonction d'un ensemble de données donné, donc si vous naïvement (comme je l'ai fait! ) utiliser model.matrixpour essayer de générer la matrice de conception pour un nouvel ensemble de données, vous obtenez une nouvelle base - qui n'a plus de sens avec les anciens paramètres. Jusqu'à ce que ce problème soit résolu, je devrais peut-être mettre un piège qui indique aux personnes qui predictne fonctionnent pas avec des bases polynomiales orthogonales (ou des bases splines, qui ont la même propriété).

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)
Ben Bolker
la source
Merci, c'est rassurant. Pour réitérer: j'ai lu que vous ne pouvez pas prendre les effets fixes polynomiaux orthogonaux à leur valeur nominale, mais parfois ils semblent incroyablement grands. Par exemple, si je lance une interaction de deux polynômes cubiques, j'obtiens des effets fixes pour les polynômes et leurs interactions dans la plage de -22 à -127400. Cela me semble loin, surtout si l'on considère que tous les effets fixes sont négatifs. Une fonction de prévision révisée donnerait-elle un sens à ces effets fixes ou les modèles convergent-ils faussement ou est-ce que quelque chose ne va pas après tout?
Ruben
Encore une fois, je soupçonne (mais évidemment je ne sais pas avec certitude) que tout va bien. Orth. les polynômes sont bons pour la stabilité numérique et les tests d'hypothèses, mais (comme vous le savez) les valeurs réelles des paramètres peuvent être plus difficiles à interpréter. La version actuelle de lme4-devel (je viens de publier une version qui devrait passer des tests, il pourrait prendre ~ 24 heures pour reconstruire sur r-forge, à moins que vous puissiez construire à partir de SVN vous-même) devrait vous donner des prédictions correspondantes entre les polynômes bruts / ortho. Une alternative est de centrer et de mettre à l'échelle des prédicteurs continus à la Schielzeth 2010 Méthodes en écologie et évolution ...
Ben Bolker
Oui, les deux polynômes s'accordent parfaitement bien maintenant. Merci beaucoup! J'avais mis à l'échelle et centré mes prédicteurs, mais certains modèles ne correspondaient pas aux polynômes bruts.
Ruben