[英]Combine imputed data by group in r using mice
我的問題是關於使用“小鼠”按組進行插補的問題的后續: R 中的多重插補和多組 SEM
就插補部分而言,答案中的代碼可以正常工作。 但之后我得到了一份實際完整數據的列表,但不止一組。 該示例如下所示:
'Set up data frame'
df.g1<-data.frame(ID=rep("A",5),x1=floor(runif(5,0,2)),x2=floor(runif(5,10,20)),x3=floor(runif(5,100,150)))
df.g2<-data.frame(ID=rep("B",5),x1=floor(runif(5,0,2)),x2=floor(runif(5,25,50)),x3=floor(runif(5,200,250)))
df.g3<-data.frame(ID=rep("C",5),x1=floor(runif(5,4,5)),x2=floor(runif(5,75,99)),x3=floor(runif(5,500,550)))
df<-rbind(df.g1,df.g2,df.g3)
'Introduce NAs'
df$x1[rbinom(15,1,0.1)==1]<-NA
df$x2[rbinom(15,1,0.1)==1]<-NA
df$x3[rbinom(15,1,0.1)==1]<-NA
df
'Impute values by group:'
df.clean<-lapply(split(df,df$ID), function(x) mice::complete(mice(df,m=5)))
df.clean
如您所見,df.clean 是一個包含 3 個元素的列表。每組一個元素。 但是每個元素都包含我正在尋找的完整數據集。
原始答案建議 rbind() 獲取 df.clean 中的數據,這給我留下了一個新的數據集,其中包含 45 個(原始大小的 3 倍)觀察值。 這是最后一步的原始代碼:
imputed.both <- do.call(args = df.clean, what = rbind)
哪個數據是“正確”的? 為什么最后一步?
非常感謝!
代碼中有一個錯誤,我在下面有一個有效的編輯版本:
#Set up data frame
set.seed(12345)
df.g1<-data.frame(ID=rep("A",5),x1=floor(runif(5,0,2)),x2=floor(runif(5,10,20)),x3=floor(runif(5,100,150)))
df.g2<-data.frame(ID=rep("B",5),x1=floor(runif(5,0,2)),x2=floor(runif(5,25,50)),x3=floor(runif(5,200,250)))
df.g3<-data.frame(ID=rep("C",5),x1=floor(runif(5,4,5)),x2=floor(runif(5,75,99)),x3=floor(runif(5,500,550)))
df<-rbind(df.g1,df.g2,df.g3)
#Introduce NAs
df$x1[rbinom(15,1,0.1)==1]<-NA
df$x2[rbinom(15,1,0.1)==1]<-NA
df$x3[rbinom(15,1,0.1)==1]<-NA
# check NAs
colSums(is.na(df))
#Impute values by group:
# here's the bug
df.clean<-lapply(split(df,df$ID), function(x) mice::complete(mice(x,m=5)))
imputed.both <- do.call(args = df.clean, what = rbind)
dim(imputed.both)
# returns 15,4
在問題的代碼中,您有
df.clean<-lapply(split(df,df$ID), function(x) mice::complete(mice(df,m=5)))
dim(do.call(rbind,df.clean))
#this returns 45,4
function 用“x”指定,但您從全局環境中調用 df。 因此,您對完整的 df 進行估算。
因此,如果您執行此步驟,請回答您的問題:
split(df,df$ID)
您將數據框拆分為只有 A、B 或 Cs 的 data.frames 列表。 然后,如果您通過此列表申請,您會得到
df.clean<-lapply(split(df,df$ID), function(x) mice::complete(mice(x,m=5)))
names(df.clean)
lapply(df.clean,dim)
df.clean 列表中的每一項都包含原始 df 的子集,ID 為 A、B 或 C。 現在,您可以使用以下方法將此列表組合到一個 data.frame 中:
imputed.both <- do.call(rbind,df.clean)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.