在将鼠标(Multiple Equations by Chained Equations)软件包更新到版本> 3之后,我的代码停止工作。我希望从多重插补数据集上的线性回归中检索估计的方差-协方差矩阵。在2.46.0版中,可以使用 pool 函数轻松访问此数量(鼠标称为 t )。在版本> 3.0的小鼠中,pool函数不再返回完整的方差-协方差矩阵,而仅返回方差-协方差矩阵的对角线元素。
这是一个有效的示例:
首先创建一些缺少值的数据集:
set.seed(243)
iris$Sepal.Length[sample(length(iris$Sepal.Length), size = 5)] <- NA
iris$Sepal.Width[sample(length(iris$Sepal.Width), size = 5)] <- NA
iris$Petal.Length[sample(length(iris$Petal.Length), size = 5)] <- NA
iris$Species[sample(length(iris$Species), size = 5)] <- NA
第二次乘法计算丢失的数据
iris.mi <- mice(iris, 5)
第三次在每个插补数据集上执行线性回归,将结果存储在一个miira对象中
mira.out <- with(iris.mi, lm(Sepal.Width ~ Sepal.Length + Petal.Length + Petal.Width + Species))
第四,使用鲁宾法则汇总这些分析的结果。这是通过小鼠的池功能实现的。
pool.out <- pool(analyses)
在小鼠软件包的2.46.0版本中,可以输入
来检索完整方差协方差矩阵 tpool.out$t
在mouses包的较新版本(> 3.0)中,不存在pool.out $ t对象。所有可以做的就是通过输入
来检索方差pool.out$pooled
,然后选择标记为 t 的列。似乎没有办法访问完整的方差-协方差矩阵。所有人都可以访问矩阵的对角元素,这些元素存储在pool.out $ pooled data.frame的 t 列中。
我想访问完整的方差协方差矩阵,因为我需要在具有多重估算数据的线性回归中计算交互项的边际效应和置信区间。这些置信区间可以仅通过使用方差-协方差矩阵的对角元素来近似,但是使用完整的方差-协方差矩阵会更有意义。
我想知道为什么在mouses包中实现了这一更改,以及我如何能够访问较新版本中的方差-协方差矩阵。
谢谢您的帮助。
答案 0 :(得分:0)
遇到同样的问题。现在,我使用Using devtools安装了较旧的鼠标包版本,以便能够进行分析。
答案 1 :(得分:0)
关于为什么它不再可用,我认为它与mice > 3.0
有关,这取决于broom
收集模型输出的功能。小插图(https://cran.r-project.org/web/packages/broom/vignettes/broom.html)表示:“扫帚包将R中内置函数(如lm,nls或t.test)的混乱输出,并转换为整洁的数据帧。”尽管确实尝试过,但这并不能轻易容纳导出完整矩阵vcov
所需要的各个模型的t
矩阵,而不是当前显示的先前t
对角线。
作为一种变通方法,您可以使用以下代码(包括带有少量重命名的示例代码)自己派生它(例如,参见Dong和Peng 2013 http://springerplus.springeropen.com/articles/10.1186/2193-1801-2-222):
set.seed(243)
iris$Sepal.Length[sample(length(iris$Sepal.Length), size = 5)] <- NA
iris$Sepal.Width[sample(length(iris$Sepal.Width), size = 5)] <- NA
iris$Petal.Length[sample(length(iris$Petal.Length), size = 5)] <- NA
iris$Species[sample(length(iris$Species), size = 5)] <- NA
iris.mi <- mice(iris, 5)
fit.mi <- with(iris.mi, lm(Sepal.Width ~ Sepal.Length + Petal.Length + Petal.Width + Species))
fil.pooled <- pool(fit.mi)
# get the full matrix ubar (instead of only the diagonal)
m <- fil.pooled$m
ubar <- Reduce("+", lapply(fit.mi$analyses, vcov)) / (m)
b <- fil.pooled$pooled$b # this one is still provided by mice
# # or by hand as well
# qbar <- getqbar(fil.pooled) # pooled estimates
# b <- 1 / (m-1) * rowSums((sapply(fit.mi$analyses, coef) - qbar)^2)
t <- ubar + (1 + 1 / (m)) * b # this is t as it used to be
# check versus the diagonal of t that is still provided
all.equal(as.numeric(diag(t)), fil.pooled$pooled$t) # check
答案 2 :(得分:0)
这是如何推导完整(t)协方差矩阵的最小工作示例。它使用了Enders(2010)的《 Applied Missing Data Analysis》(第234页)中的方程,该方程很好地介绍了方程的多变量版本以汇总方差。对于那些无法阅读本文的人,Krause,Huisman和Snijders(2018)在本文的第42页上也给出了方程式。
http://sa-ijas.stat.unipd.it/sites/sa-ijas.stat.unipd.it/files/10.26398-IJAS.0030-002.pdf
合并协方差矩阵 Vt 是插补方差 Vw 和插补方差 Vb 之间的组合。
Vw 是 m 个推定数据集的平均协方差矩阵。
Vw = 1 / m * * m 协方差矩阵的总和。
Vb 是插补中参数估计的差异程度,以及不同参数的协变量变化程度。它大致是根据每个 m 估算的参数估计值, Qhat-m 和合并的值之间的差值矢量创建的 m 矩阵的平均值参数估算值, Qbar 。
Vb = 1 /(<< strong> m -1))总和 m [( Qhat-m - Qbar )*转置( Qhat-m - Qbar )]。
这是一个基于Jeroen Hoogland对这个问题的回答的可行示例。
# data preparation ---------------------
# generating missingness
set.seed(243)
iris$Sepal.Length[sample(length(iris$Sepal.Length), size = 5)] <- NA
iris$Sepal.Width[sample(length(iris$Sepal.Width), size = 5)] <- NA
iris$Petal.Length[sample(length(iris$Petal.Length), size = 5)] <- NA
iris$Species[sample(length(iris$Species), size = 5)] <- NA
# imputing data
iris.mi <- mice(iris, 5)
# fiting models
fit.mi <- with(iris.mi,
lm(Sepal.Width ~ Sepal.Length + Petal.Length +
Petal.Width + Species))
# pooling
fit.pooled <- pool(fit.mi)
# deriving the full variance covariance matrix ----------------------
# m different imputations
m <- fit.pooled$m
# Vw, the within imputation covariance matrix
vw <- Reduce("+", lapply(fit.mi$analyses, vcov)) / (m)
# Vb, the between imputation covariance matrix
# mice now only provides the diagonal elements
bdiag <- fit.pooled$pooled$b
# getting the full Vb matrix by hand
# Qbar, pooled parameter estimates
qbar <- getqbar(fit.pooled)
# Qhats, each imputations parameter estimates
qhats <- sapply(fit.mi$analyses, coef)
vb <- (1 / (m-1)) * (qhats - qbar) %*% t(qhats - qbar)
vt <- vw + (1 + 1 / (m)) * vb # this is t as it used to be
# checking against the diagonal of t that is still provided
all.equal(as.numeric(diag(vt)), fit.pooled$pooled$t)