Почему я получаю совершенно разные результаты для poly (raw = T) и poly ()?

10

Я хочу смоделировать две разные переменные времени, некоторые из которых сильно коллинеарны в моих данных (возраст + группа = период). Делая это, я столкнулся с некоторыми проблемами lmerи взаимодействиями poly(), но это, вероятно, не ограничивалось lmer, я получил те же результаты с nlmeIIRC.

Очевидно, что мое понимание того, что делает функция poly (), отсутствует. Я понимаю, что poly(x,d,raw=T)делает, и я думал, что без raw=Tнего получается ортогональный многочлен (я не могу сказать, что я действительно понимаю, что это значит), что облегчает подгонку, но не позволяет вам интерпретировать коэффициенты напрямую.
Я прочитал это, потому что я использую функцию предсказания, предсказания должны быть такими же.

Но это не так, даже если модели сходятся нормально. Я использую центрированные переменные, и я сначала подумал, что, возможно, ортогональный многочлен приводит к более высокой корреляции фиксированного эффекта с членом коллинеарного взаимодействия, но он кажется сопоставимым. Я вставил две модели резюме здесь .

Надеемся, что эти графики иллюстрируют разницу. Я использовал функцию предсказания, которая доступна только в dev. версия lme4 (слышал об этом здесь ), но фиксированные эффекты те же, что и в версии CRAN (и они также кажутся отключенными, например, ~ 5 для взаимодействия, когда мой DV имеет диапазон 0-4).

Звонок был

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

Предсказание было только с фиксированными эффектами, на поддельных данных (все другие предикторы = 0), где я отметил диапазон, присутствующий в исходных данных, как экстраполяцию = F.

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

В случае необходимости я могу предоставить больше контекста (мне не удалось легко воспроизвести воспроизводимый пример, но я, конечно, могу попробовать больше), но я думаю, что это более простая просьба: объясните poly()мне эту функцию, довольно пожалуйста.

Сырые полиномы

Сырые полиномы

Ортогональные полиномы (обрезается, nonclipped в Imgur )

Ортогональные полиномы

Ruben
источник

Ответы:

10

Я думаю, что это ошибка в функции предсказания (и, следовательно, моя ошибка), которая фактически не разделяет nlme . ( Правка : должна быть исправлена ​​в самой последней версии R-forge lme4.) См. Пример ниже ...

Я думаю, что ваше понимание ортогональных полиномов, вероятно, просто отлично. Если вы пытаетесь написать метод прогнозирования для класса моделей , вам нужно знать, что основа для ортогональных полиномов определяется на основе заданного набора данных, так что если вы наивно (как я! ) используйте, model.matrixчтобы попытаться сгенерировать матрицу проектирования для нового набора данных, вы получите новую основу - что больше не имеет смысла со старыми параметрами. Пока я не исправлю это, мне может понадобиться ловушка, которая сообщает людям, которые predictне работают с ортогональными полиномиальными базами (или сплайновыми базами, которые имеют то же свойство).

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)
Бен Болкер
источник
Спасибо, это обнадеживает. Повторим: я читал, что вы не можете принимать ортогональные полиномиальные фиксированные эффекты за чистую монету, но иногда они кажутся безумно большими. Например, если я запускаю взаимодействие двух кубических полиномов, я получаю фиксированные эффекты для полиномов и их взаимодействий в диапазоне от -22 до -127400. Это просто кажется мне далеким, особенно если учесть, что все фиксированные эффекты отрицательны. Будет ли пересмотренная функция предсказания иметь смысл этих фиксированных эффектов, или модели ошибочно сходятся, или они все-таки что-то не так?
Рубен
Опять же, я подозреваю (но, очевидно, не знаю наверняка), что все в порядке. Орт. полиномы хороши для проверки числовой устойчивости и гипотез, но (как вы выясняете) фактические значения параметров могут быть сложнее интерпретировать. Текущая версия lme4-devel (я только что опубликовал версию, которая должна пройти тесты, может потребоваться ~ 24 часа для перекомпоновки на r-forge, если вы не можете собрать из SVN самостоятельно), должна давать вам предсказания соответствия между необработанными / орто-полиномами. Альтернативой является центрирование и масштабирование непрерывных предикторов à la Schielzeth 2010 Методы в области экологии и эволюции ...
Бен Болкер
Да, два полинома теперь прекрасно согласуются. Большое спасибо! Я масштабировал и центрировал свои предикторы, но некоторые модели не соответствовали необработанным полиномам.
Рубен