1

当我尝试在插补对象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. 如果我不能使用subsetwith ,有没有直接子集列表对象glm.mids的好方法?mids

4

2 回答 2

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.mids 中的 glm 函数调用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,...)

于 2014-10-20T22:30:23.080 回答
1

解决方案是使用

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 的答案:在 R 函数中将参数传递给 glm我们可以稍微改变函数

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将替换函数环境中的参数(这需要更多细节 - 请随时更新)

于 2014-10-20T22:33:00.383 回答