当我尝试在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
列表对象进行子集化?
答案 0 :(得分:1)
我冒昧改写glm.mids
。这有点笨拙。这个问题似乎源于将属性传递给glm的隐含性质。
也看到这些帖子:
https://stat.ethz.ch/pipermail/r-help/2003-November/041537.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]] <- do.call("glm",list(formula=quote(formula),family=quote(family),data=quote(data.i),...))
中的glm函数调用
在旧版本中,它会显示analyses[[i]] <- glm(formula, family = family, data = data.i,...)
答案 1 :(得分: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 : 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
将替换函数环境中的参数(这需要更多详细信息 - 请随时更新)