我有一个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对象是一个多重填补对象,但计算不正确。我的问题是如何编写一个函数,返回数学上正确的值?
1条答案
按热度按时间sczxawaw1#
这是相当棘手的,因为
with
和lm()
使用环境/评估对象的方式不同。这似乎是有效的:字符串
(我尝试使用
reformulate("1", response = deparse(substitute(varname)))
来构造lm
公式,但这不起作用-原因我不容易弄清楚.)请注意,即使在函数之外使用
with()
和lm()
仍然很棘手,即使示例不涉及mice
(“无啮齿动物”):型
然而,
lm
的data=
参数确实解决了这个问题。型