Чому я отримую різко різні результати для poly (raw = T) проти poly ()?


10

Я хочу моделювати дві різні змінні часу, деякі з яких сильно колінеарні в моїх даних (вік + когорта = період). Роблячи це, у мене виникли проблеми з lmerвзаємодією та взаємодією poly(), але, мабуть, це не обмежується lmer, я отримав однакові результати з nlmeIIRC.

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

Але їх немає, навіть коли моделі сходяться нормально. Я використовую орієнтовані змінні, і я спершу подумав, що, можливо, ортогональний поліном призводить до більш високої корекції фіксованого ефекту із терміном колінеарної взаємодії, але це здається порівнянним. Тут я вставив два зразки моделей .

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

Lmer дзвінок був

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()мені функцію, досить будь ласка.

Сирі многочлени

Сирі многочлени

Ортогональні поліноми (відрізані, відрізані в Імгурі )

Ортогональні многочлени

Відповіді:


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. Мені це просто здається, особливо враховуючи, що всі фіксовані ефекти негативні. Чи має переглянута функція прогнозування сенсу цих фіксованих ефектів, чи моделі помилково зближуються, чи все-таки щось не так у lmer?
Рубен

Знову я підозрюю (але явно не знаю точно), що все в порядку. Орт. поліноми корисні для чисельної стійкості та перевірки гіпотез, але (як ви з'ясували) фактичні значення параметрів можуть бути важче інтерпретувати. Поточна версія lme4-devel (я щойно опублікував версію, яка повинна пройти тести, для відновлення на r-forge може знадобитися ~ 24 години, якщо ви не зможете самостійно створити SVN), ви повинні передбачити відповідність між необробленими / орто-поліномами. Альтернативою є цензування та масштабування безперервних передбачувачів à la Schielzeth 2010 Методи екології та еволюції ...
Бен Болкер

Так, два поліноми зараз цілком згодні. Дуже дякую! Я масштабував і зосереджував свої прогнози, але деякі моделі не підходили до сирих многочленів.
Рубен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.