Я пытаюсь закодировать функцию-обертку для другой функции. Исходная функция 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