Run glm.mids on a subset of imputed data from mice (R)

拈花ヽ惹草 提交于 2019-12-11 11:35:49

问题


I get an error when I try to run glm.mids on a subset of a mids imputation object:

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

gives the cryptic error message

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

even though the syntax works with regular glm on the original dataset:

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

The documentation ?glm.mids doesn't specifically address subset but says that you can pass additional parameters onto glm. If I can't use subset with glm.mids, is there a good way to subset the mids list object directly?


回答1:


I have taken the liberty of rewriting glm.mids. It is a bit kludgy. The issue seems to stem from the implicit nature by which attributes are passed into glm.

also see these post:

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))

The only part that I rewrote was the glm function call within glm.mids analyses[[i]] <- do.call("glm",list(formula=quote(formula),family=quote(family),data=quote(data.i),...))

In the old version it read analyses[[i]] <- glm(formula, family = family, data = data.i,...)




回答2:


Solution is to use

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


(I think) the problem in your question is the use of ... within the glm.mids function. They are used in the function argument to allow “Additional parameters passed to glm”. However, when ... are passed to the glm call in the glm.mids function they are not processed this way. In ?glm the ... are “For glm: arguments to be used to form the default control argument if it is not supplied directly.”. So the additional arguments will not work.

To see this, simplify the function

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

So the subset argument is not passed to the glm function call

Using the answer from R : Pass argument to glm inside an R function we can slightly alter the function

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))

The use of substitute will substitute the arguments from the function environment (This needs more details - please feel free to update)



来源:https://stackoverflow.com/questions/26473684/run-glm-mids-on-a-subset-of-imputed-data-from-mice-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!