Запустите glm.mids для подмножества вмененных данных от мышей (R)

Я получаю сообщение об ошибке при попытке запустить glm.mids на подмножестве mids Вменение объекта:

library(mice)
imp2 = mice(nhanes)
glm.mids( (hyp==2)~bmi+chl, data=imp2, subset=(age==1) )

выдает загадочное сообщение об ошибке

"Error in eval(expr, envir, enclos) :
..1 used in an incorrect context, no ... to look in"

хотя синтаксис работает с обычным glm на исходном наборе данных:

glm( (hyp==2)~bmi+chl, data=nhanes, subset=(age==1) )

Документация ?glm.mids конкретно не обращается subset но говорит, что вы можете передать дополнительные параметры на glm, Если я не могу использовать subset с glm.midsЕсть ли хороший способ подмножества mids список объектов напрямую?

2 ответа

Решение

Я взял на себя смелость переписать glm.mids, Это немного глупо. Кажется, проблема связана с неявной природой, с помощью которой атрибуты передаются в glm.

также смотрите эти посты:

https://stat.ethz.ch/pipermail/r-help/2003-November/041537.html

http://r.789695.n4.nabble.com/Question-on-passing-the-subset-argument-to-an-lm-wrapper-td3009725.html

library(mice)

glm.mids=function (formula, family = gaussian, data, ...) 
{
  call <- match.call()
  if (!is.mids(data)) 
    stop("The data must have class mids")
  analyses <- as.list(1:data$m)
  for (i in 1:data$m) {
    data.i <- complete(data, i)
    analyses[[i]] <- do.call("glm",list(formula=quote(formula),family=quote(family),data=quote(data.i),...))
  }
  object <- list(call = call, call1 = data$call, nmis = data$nmis, 
                 analyses = analyses)
  oldClass(object) <- c("mira", "glm", "lm")
 return(object)
}

imp2 = mice(nhanes)
glm.mids( (hyp==2)~bmi+chl, data=imp2 ,subset=quote(age==1))

Единственной частью, которую я переписал, был вызов функции glm из glm.mids. analyses[[i]] <- do.call("glm",list(formula=quote(formula),family=quote(family),data=quote(data.i),...))

В старой версии это читалось analyses[[i]] <- glm(formula, family = family, data = data.i,...)

Решение заключается в использовании

with(data=imp2, exp=glm((hyp==2)~bmi+chl, family=binomial , subset=(age==1) ))


(Я думаю) проблема в вашем вопросе заключается в использовании ... в пределах glm.mids функция. Они используются в аргументе функции, чтобы разрешить "Дополнительные параметры, передаваемые в glm". Однако когда ... передаются в glm позвонить в glm.mids функции они не обрабатываются таким образом. В ?glm ... являются "Для glm: аргументы, которые будут использоваться для формирования управляющего аргумента по умолчанию, если он не предоставлен напрямую". Таким образом, дополнительные аргументы не будут работать.

Чтобы увидеть это, упростим функцию

f1 <- function (formula, family = binomial, data, ...) 
{
 glm(formula, family = family, data = data, ...)
  }

f1(formula=((hyp==2)~bmi+chl), data=nhanes, subset=(age==2)) 
#Error in eval(expr, envir, enclos) : 
#  ..1 used in an incorrect context, no ... to look in

Таким образом, аргумент подмножества не передается glm вызов функции

Используя ответ от R: передать аргумент glm внутри функции R, мы можем немного изменить функцию

f2 <- function (formula, family = binomial, data, ...) 
{
  eval(substitute(glm(formula, family = family, data = data, ...)))
}

# This now runs
f2(formula=((hyp==2)~bmi+chl), data=nhanes, subset=(age==2))

# check
glm((hyp==2)~bmi+chl, data=nhanes, family="binomial", subset=(age==2))

Использование substitute будет подставлять аргументы из функциональной среды (это требует более подробной информации - пожалуйста, не стесняйтесь обновлять)

Другие вопросы по тегам