用老鼠进行的被动插补给出了错误的总分
Passive imputation with mice gives wrong sumscore
我正在处理一个包含 76 个人和 374 个变量的大型数据集。我的主要结果变量是抑郁症严重程度问卷 (PHQ-9) 上的抑郁症总分。大约有 4% 的数据缺失,所以我想使用插补。我一直在按照 Buuren, S. van, & Groothuis-Oudshoorn, K. (2011) 中的说明使用 mice 包。小鼠:R 中链式方程的多元插补。统计软件杂志,45(3)。 https://doi.org/10.18637/jss.v045.i03。我试图复制他们关于如何使用被动插补生成总分的说明。但是,我得到了错误的结果。我不明白为什么 - 我想我已经正确地遵循了说明。
我不能 post 数据,因为它很敏感,但我可以使用这段代码来复制错误,它基本上复制了我的原始代码:
library("mice")
library("lattice")
set.seed(1234)
m<-matrix(sample(c(NA, 1:10), 100, replace = T), 10)
df<-as.data.frame(m)
ini<-mice(cbind(df, sumScore=NA), max = 0, print=F)
meth<-ini$method
meth[1:4]<-""
meth[5:10]<-"pmm"
meth["sumScore"]<-"~I(rowSums(df[,5:10]))"
pred<-ini$predictorMatrix
pred[, 1:4]<-0
pred[5:10, "sumScore"]<-0
pred[1:4, "sumScore"]<-1
imp<-mice(cbind(df, sumScore=NA), predictorMatrix = pred, method = meth)
com<-complete(imp, "long", indlude=T)
我得到以下输出:
.imp .id V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 sumScore
1 1 1 1 7 3 5 6 1 9 1 10 1 0.9224428
2 1 2 6 5 3 2 7 3 3 9 5 9 0.6210974
3 1 3 6 3 1 3 3 7 3 5 1 1 0.3563335
4 1 4 6 10 NA 5 6 5 5 8 5 1 0.0711464
5 1 5 9 3 2 1 3 1 2 3 2 1 0.7318026
6 1 6 7 9 8 8 5 5 7 5 9 5 0.6197897
你的预测矩阵搞砸了(我不确定 df
上的 rowSums
是否也可以使用 - 我不这么认为,因为 df
指的是原始数据而不是估算版本)。
预测矩阵应该这样理解:对于每一行,使用哪些变量(列)来预测这个变量。你的矩阵看起来像这样
> pred
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 sumScore
V1 0 0 0 0 1 1 1 1 1 0 1
V2 0 0 0 0 1 1 1 1 1 1 1
V3 0 0 0 0 1 1 1 1 1 1 1
V4 0 0 0 0 1 1 1 1 1 1 1
V5 0 0 0 0 0 1 1 1 1 1 0
V6 0 0 0 0 1 0 1 1 1 1 0
V7 0 0 0 0 1 1 0 1 1 1 0
V8 0 0 0 0 1 1 1 0 1 1 0
V9 0 0 0 0 1 1 1 1 0 1 0
V10 0 0 0 0 1 1 1 1 1 0 0
sumScore 0 0 0 0 0 0 0 0 0 0 0
当一行仅包含零时,它不会使用 any 变量进行插补。这意味着 none 个变量真正用于 sumScore
的预测,你最终会得到随机噪声。
改用此代码
library("mice")
library("lattice")
set.seed(1234)
m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
df <- cbind(as.data.frame(m), sumScore=NA)
ini<-mice(df, max = 0, print=FALSE)
meth<-ini$method
meth[1:4] <- "" # Never impute for these variables
meth[5:10]<-"pmm" # Use pmm to impute for these
meth["sumScore"] <- "~I(V5+V6+V7+V8+V9+V10)"
pred <- ini$predictorMatrix
pred[, 1:4] <- 0 # Never use V1-V4 for imputation (since you had the same)
pred[1:4, "sumScore"] <- 1 # Use the sum to impute for first 4 (but no method so no point!)
pred[paste0("V", 5:10), "sumScore"] <- 0 # Make sure that we dont impute the "wrong way"
pred["sumScore", paste0("V", 5:10)] <- 1 # Make sure that V5 to V10 are available for sumScore
这应该能满足您的需求
我正在处理一个包含 76 个人和 374 个变量的大型数据集。我的主要结果变量是抑郁症严重程度问卷 (PHQ-9) 上的抑郁症总分。大约有 4% 的数据缺失,所以我想使用插补。我一直在按照 Buuren, S. van, & Groothuis-Oudshoorn, K. (2011) 中的说明使用 mice 包。小鼠:R 中链式方程的多元插补。统计软件杂志,45(3)。 https://doi.org/10.18637/jss.v045.i03。我试图复制他们关于如何使用被动插补生成总分的说明。但是,我得到了错误的结果。我不明白为什么 - 我想我已经正确地遵循了说明。
我不能 post 数据,因为它很敏感,但我可以使用这段代码来复制错误,它基本上复制了我的原始代码:
library("mice")
library("lattice")
set.seed(1234)
m<-matrix(sample(c(NA, 1:10), 100, replace = T), 10)
df<-as.data.frame(m)
ini<-mice(cbind(df, sumScore=NA), max = 0, print=F)
meth<-ini$method
meth[1:4]<-""
meth[5:10]<-"pmm"
meth["sumScore"]<-"~I(rowSums(df[,5:10]))"
pred<-ini$predictorMatrix
pred[, 1:4]<-0
pred[5:10, "sumScore"]<-0
pred[1:4, "sumScore"]<-1
imp<-mice(cbind(df, sumScore=NA), predictorMatrix = pred, method = meth)
com<-complete(imp, "long", indlude=T)
我得到以下输出:
.imp .id V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 sumScore
1 1 1 1 7 3 5 6 1 9 1 10 1 0.9224428
2 1 2 6 5 3 2 7 3 3 9 5 9 0.6210974
3 1 3 6 3 1 3 3 7 3 5 1 1 0.3563335
4 1 4 6 10 NA 5 6 5 5 8 5 1 0.0711464
5 1 5 9 3 2 1 3 1 2 3 2 1 0.7318026
6 1 6 7 9 8 8 5 5 7 5 9 5 0.6197897
你的预测矩阵搞砸了(我不确定 df
上的 rowSums
是否也可以使用 - 我不这么认为,因为 df
指的是原始数据而不是估算版本)。
预测矩阵应该这样理解:对于每一行,使用哪些变量(列)来预测这个变量。你的矩阵看起来像这样
> pred
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 sumScore
V1 0 0 0 0 1 1 1 1 1 0 1
V2 0 0 0 0 1 1 1 1 1 1 1
V3 0 0 0 0 1 1 1 1 1 1 1
V4 0 0 0 0 1 1 1 1 1 1 1
V5 0 0 0 0 0 1 1 1 1 1 0
V6 0 0 0 0 1 0 1 1 1 1 0
V7 0 0 0 0 1 1 0 1 1 1 0
V8 0 0 0 0 1 1 1 0 1 1 0
V9 0 0 0 0 1 1 1 1 0 1 0
V10 0 0 0 0 1 1 1 1 1 0 0
sumScore 0 0 0 0 0 0 0 0 0 0 0
当一行仅包含零时,它不会使用 any 变量进行插补。这意味着 none 个变量真正用于 sumScore
的预测,你最终会得到随机噪声。
改用此代码
library("mice")
library("lattice")
set.seed(1234)
m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
df <- cbind(as.data.frame(m), sumScore=NA)
ini<-mice(df, max = 0, print=FALSE)
meth<-ini$method
meth[1:4] <- "" # Never impute for these variables
meth[5:10]<-"pmm" # Use pmm to impute for these
meth["sumScore"] <- "~I(V5+V6+V7+V8+V9+V10)"
pred <- ini$predictorMatrix
pred[, 1:4] <- 0 # Never use V1-V4 for imputation (since you had the same)
pred[1:4, "sumScore"] <- 1 # Use the sum to impute for first 4 (but no method so no point!)
pred[paste0("V", 5:10), "sumScore"] <- 0 # Make sure that we dont impute the "wrong way"
pred["sumScore", paste0("V", 5:10)] <- 1 # Make sure that V5 to V10 are available for sumScore
这应该能满足您的需求