Использование $ для ссылки на несколько переменных в пользовательской функции R - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь запустить функцию, которая вычисляет предельные эффекты для разных моделей смешанных эффектов на основе двух разных основных предикторов (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) {
.....
})

  })

Это также приводит к нулевому результату. Как мне ссылаться на разные переменные в неприкрепленном фрейме данных ?? Код работает с прямыми вводами, поэтому необходимо правильно определить аргументы функции. Я ценю любую помощь!

...