Извлечение имен переменных L2 из модели lmer - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь закодировать функцию-обертку для другой функции. Исходная функция r2MLM (найдено здесь ) вычисляет значения R-квадрата для многоуровневых моделей. Тем не менее, он требует непосредственного ввода оценок - оценок фиксированных эффектов, случайных эффектов, матрицы тау и т. Д. c - что затрудняет использование.

Я хотел бы создать функцию-оболочку, в которую можно просто ввести имя модели, а затем оболочка извлечет все эти оценки и передаст их в r2MLM. Я добился хорошего прогресса в этом, предоставив списки функций переменных L1 и L2, а затем извлекая вывод оттуда, но я бы хотел, чтобы пользователь мог вводить только имя своей модели. Кто-нибудь знает, как извлечь имена переменных L1 и L2 из объекта lmer?

Я пробовал множество обходных путей, используя getME(), но мне удалось только таким образом вывести фиксированные и случайные эффекты. Самое близкое, что я получил, это model.frame(model), который возвращает переменные, используемые в формуле модели, и я полагаю, что тогда вы могли бы фильтровать по тем, которые имеют одно и то же значение снова и снова, и вызывать эти переменные L2? Но это кажется очень грязным и подверженным ошибкам, и теоретически вы можете иметь переменную L1, которая повторяется снова и снова в одном кластере.

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

# 1 Dependencies ----------------------------------------------------------

library(tidyverse)
library(lme4)
library(lmerTest)

# 2 Sample data -----------------------------------------------------------

df <- tribble(
  ~school, ~math, ~ses, ~public,
  #--------#-----#-----#-------
  1, 8, 3, 0,
  1, 7, 2, 0,
  1, 6, 4, 0,
  1, 8, 5, 0,
  1, 6, 2, 0,
  2, 9, 5, 1,
  2, 10, 3, 1,
  2, 4, 4, 1,
  2, 5, 4, 1,
  2, 9, 2, 1,
  3, 7, 3, 0, 
  3, 8, 2, 0,
  3, 9, 4, 0,
  3, 10, 2, 0,
  3, 8, 1, 0
)

# school = school ID
# math = math score, out of 10
# ses = socioeconomic status, out of 5
# public = public school (0 = private, 1 = public)

# 3 Run model with ses at L1, public at L2 --------------------------------

model <- lmer(math ~ 1 + ses + public + (1|school), data = df, REML = TRUE)
summary(model)

as.matrix(Matrix::bdiag(VarCorr(model))) # Print Tau matrix

# 4 Input to r2MLM to generate R-squared measures -------------------------

# this is the input required by the original function
# r2MLM(as.data.frame(df), within_covs = c(3), between_covs = c(4), random_covs = NULL, gamma_w = c(-0.2397), gamma_b = c(8.3712, -0.1082), Tau = matrix(c(0.09583922), 1, 1), sigma2 = 3.46968, has_intercept = TRUE, clustermeancentered = FALSE)

# r2MLM_wrapper_v1(model, "ses", "public", NULL, TRUE, df) # this is how far I've gotten in streamlining the input

# r2MLM_wrapper_final(model) # this is where I would like to get

...