【问题标题】:Run glm.mids on a subset of imputed data from mice (R)对来自小鼠 (R) 的估算数据子集运行 glm.mids
【发布时间】:2014-10-20 19:46:30
【问题描述】:

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

【问题讨论】:

  • 试试with(data=imp2, exp=glm((hyp==2)~bmi+chl, family=binomial , subset=(age==1) ))。我不知道为什么子集在glm.mids 中不起作用。
  • 欢迎您。我不确定,但我认为在glm.mids 代码中使用... 不太正确(至少在当前版本的R 中)。如果您用eval(substitute(glm 更改glm 调用(大约在glm.mids 的一半),它会按预期工作。看看这里stackoverflow.com/questions/10858318/…
  • 会看看。所有这些都会是一个很好的答案,我会接受:)

标签: r subset r-mice


【解决方案1】:

我冒昧地重写了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 analyses[[i]] &lt;- do.call("glm",list(formula=quote(formula),family=quote(family),data=quote(data.i),...)) 中的 glm 函数调用

在旧版本中它显示为analyses[[i]] &lt;- glm(formula, family = family, data = data.i,...)

【讨论】:

    【解决方案2】:

    解决方法是使用

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


    (我认为)您问题中的问题是在glm.mids 函数中使用...。它们在函数参数中使用以允许“传递给 glm 的附加参数”。但是,当... 传递给glm.mids 函数中的glm 调用时,它们不会以这种方式处理。在?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 : Pass argument to glm inside an R 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))
    

    substitute 的使用将替换来自函数环境的参数(这需要更多细节 - 请随时更新)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 2019-03-31
      • 2016-03-30
      相关资源
      最近更新 更多