Я пытаюсь запустить функцию, которая вычисляет предельные эффекты для разных моделей смешанных эффектов на основе двух разных основных предикторов (var1 и var2). Оригинальный код можно найти здесь: https://stats.idre.ucla.edu/r/dae/mixed-effects-logistic-regression/. Ниже приведен воспроизводимый пример:
Я создаю фрейм данных (ex):
time <- seq(from = 1, to = 500, by =1)
var1 <- factor(sample(0:1, 500, replace = TRUE))
var2 <- factor(sample(0:1, 500, replace = TRUE))
var3 <- sample(1:500, 500, replace = TRUE)
group <- rep(1001:1005, 500)
out <- sample(0:1, 500, replace = TRUE)
group <- as.factor(group)
ex <- data.frame(time,var1,var2,var3,group,out)
Запустите модели:
m1a <- glmer(out ~ time + var1 + (1|group), data=ex, family = binomial(link = "logit"), nAGQ = 1,
control = glmerControl(calc.derivs = FALSE))
m1b <- glmer(out ~ time + var2 + (1|group), data=ex, family = binomial(link = "logit"), nAGQ = 1,
control = glmerControl(calc.derivs = FALSE))
Создайте подмножества данных только с предикторы для полных случаев:
sub1a <- na.omit(ex[, c("time", "var1", "group")])
sub1b <- na.omit(ex[, c("time", "var2", "group")])
Я не могу прикрепить свой фрейм данных, например, потому что R говорит, что var1 и var2 замаскированы. Поэтому единственный известный мне способ обращения к переменным - это использование $. Однако каждая функция, которую я создаю, дает неправильный или нулевой результат. Сначала я попробовал:
marg <- function(v1, v2, d, m) {
biprobs <- lapply(levels(v1), function(var) {
v2[ ] <- var
lapply(time, function(ti) {
d$time <- ti
predict(m, newdata = d, type = "response")
})
})
plotdat <- lapply(biprobs, function(X) {
temp <- t(sapply(X, function(x) {
c(M=mean(x), quantile(x, c(.25, .75)))
}))
temp <- as.data.frame(cbind(temp,time))
colnames(temp) <- c("PP", "Lower", "Upper", "Dayssince")
return(temp)
})
plotdat <- do.call(rbind, plotdat)
}
result1 <- marg(ex$var1, sub1a$var1, sub1a, m1a)
Хотя при этом создается фрейм данных, он выдает одинаковые предсказанные вероятности для каждого уровня var1 (0 против 1) в данный момент времени (1-500), что не что я хочу. Тогда я попробовал:
marg <- function(v, d, m) {
biprobs <- lapply(levels(ex$v), function(var) {
d$v[ ] <- var
lapply(time, function(ti) {
d$time <- ti
predict(m, newdata = d, type = "response")
})
})
.....
}
result2 <- marg(var1,sub1a, m1a)
Это дает нулевой результат. Я также пытался, который приводит к нулевому результату:
marg <- function(d1,v,d2,m) {
biprobs <- lapply(levels(d1$v), function(var) {
d2$v[ ] <- var
lapply(time, function(ti) {
d2$time <- ti
predict(m, newdata = d2, type = "response")
})
})
......
}
result3 <- marg(ex,var1,sub1a,m1a)
Я также пытался создать новый объект для ввода непосредственно в функцию:
v1 <- ex$var1
marg <- function(d, m) {
biprobs <- lapply(levels(v1), function(var) {
.....
})
})
Это также приводит к нулевому результату. Как мне ссылаться на разные переменные в неприкрепленном фрейме данных ?? Код работает с прямыми вводами, поэтому необходимо правильно определить аргументы функции. Я ценю любую помощь!