Как перебрать список выводов lmerTest для извлечения компонента отклонения - PullRequest
2 голосов
/ 09 мая 2019

Я оцениваю многоуровневые модели, используя 80 множественно вмененных наборов данных с пакетом mitml. Я могу использовать команду testModels() для сравнения вложенных моделей, но хочу просмотреть компоненты соответствия модели (в частности, отклонение) для каждой из 80 отдельных моделей вменения и рассчитать общее усредненное значение отклонения.

Оценки моей модели сохраняются в mitml.result списке под названием modelt1.

Я могу извлечь значение отклонения для первой модели (из 80), используя индексацию:

> modelt1[[1]]@devcomp[["cmp"]][["dev"]]
[1] 22637.1

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

Моя попытка была похожа на:

> for(i in modelt1){print(modelt1[[1]]@devcomp[["cmp"]][["dev"]])}
[1] 22637.1

Неудивительно, что это возвращает только отклонение для первой модели в пределах modelt1.

Я попытался заменить [[1]] на [[i]] и получил ошибку.

Я также попытался просмотреть все модели следующим образом:

> for(i in modelt1){print(modelt1)}

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

Как мне написать цикл, который будет печатать все 80 значений отклонения?

1 Ответ

2 голосов
/ 09 мая 2019

Вы были близки. Хитрость заключается в использовании последовательности i in 1:length(fit). Просто i in fit дает только одно значение, и поэтому вы получаете только один коэффициент.

for (i in 1:length(fit)) print(fit[[i]]@devcomp[["cmp"]][["dev"]])
# [1] 8874.517
# [1] 8874.517
# [1] 8874.517
# [1] 8874.517
# [1] 8874.517

Однако, поскольку R является векторизованным языком, я предлагаю (в большинстве случаев) не использовать циклы for и привыкнуть к sapply & Co. по соображениям скорости и удобства.

Пример:

library(mitml)
fml <- ReadDis + SES ~ ReadAchiev + (1|ID)
imp <- panImpute(studentratings, formula=fml, n.burn=1000, n.iter=100, m=5)
implist <- mitmlComplete(imp, print=1:5)

library(lme4)
fit <- with(implist, lmer(ReadAchiev ~ (1|ID), REML=FALSE))

sapply(seq(fit), function(i) fit[[i]]@devcomp[["cmp"]][["dev"]])
# [1] 8874.517 8874.517 8874.517 8874.517 8874.517
...