R+mice:我想写一个函数,用于在估算后从一个mice对象中提取信息

ulydmbyx  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(71)

我有一个mice mids对象,大约有300个变量,我想写一个函数来获取信息,作为一个简单的例子,一组变量中每个变量的缺失信息分数(FMI),而不是一次一个变量地写出拟合步骤。我可以写一个函数来返回“一些东西”,看起来像mice合并的估计输出,但不是我在开放代码中得到的结果,即一次一个变量。
我认为以下是一个可复制的例子。

### some blank lines deleted
library(mice)

## <masking warnings>

### simple example from JSS article on mice 
imp <- mice(nhanes, seed = 23109)
iter imp variable
  1   1  bmi  hyp  chl
  1   2  bmi  hyp  chl
  1   3  bmi  hyp  chl
  1   4  bmi  hyp  chl
  1   5  bmi  hyp  chl
  .....
### standard way to fit and get FMI plus other info
fit <- with(imp, lm(chl ~ 1))
print(pool(fit))
Class: mipo    m = 5 
         term m estimate     ubar       b       t dfcom       df       riv    lambda       fmi
1 (Intercept) 5  **192.944** 65.01424 5.91888 72.1169    24 19.10544 0.1092477 0.0984881 **0.1800528**

我写的傻函数

why.wont.this.work <- function(dsn, varname){
  pars <- as.list(match.call()[-1]) ### match call dsn
 var2use <- dsn$data[, as.character(pars$varname)]
 fit <- with(dsn,  lm(var2use ~ 1))
 return(pool(fit))  
}
why.wont.this.work(imp,  chl)
Class: mipo    m = 5 
         term m estimate     ubar b        t dfcom       df riv lambda       fmi
1 (Intercept) 5    **191.4** 136.2933 0 136.2933    14 12.35171   0      **0 0.1302787**

手工检查表明截距的值实际上是192.944,FMI实际上是0.18。不知何故,这个愚蠢的函数识别出imp对象是一个多重填补对象,但计算不正确。我的问题是如何编写一个函数,返回数学上正确的值?

sczxawaw

sczxawaw1#

这是相当棘手的,因为withlm()使用环境/评估对象的方式不同。这似乎是有效的:

myfun <- function(dsn, varname) {
   fit <- eval(bquote(with(dsn, lm(.(substitute(varname)) ~ 1))))
   return(pool(fit))
}
myfun(imp, chl)

字符串
(我尝试使用reformulate("1", response = deparse(substitute(varname)))来构造lm公式,但这不起作用-原因我不容易弄清楚.)
请注意,即使在函数之外使用with()lm()仍然很棘手,即使示例不涉及mice(“无啮齿动物”):

## don't need substitute() since we're not processing a formula argument
varname <- quote(chl)
form <- reformulate("1", response = deparse(varname))
try(with(mice::nhanes, lm(form))) ## object 'chl' not found
eval(bquote(with(mice::nhanes, lm(.(varname) ~ 1))))  ## works


然而,lmdata=参数确实解决了这个问题。

lm(form, data = mice::nhanes)

相关问题