我正在努力地利用小鼠进行归因。主要目标是估算NA(如果可能,按组)。 由于该示例对于简单的帖子来说有点大,因此可以下载: https://drive.google.com/open?id=1InGJ_M7r5jwQZZRdXBO1MEbKB48gafbP
我的问题是:
相关数据通常有多大的问题?我该怎么做才能仍然估算数据? 数据是经验研究问题的一部分,我还不知道要包括哪些变量,因此最好暂时保留尽可能多的变量。
哪种方法比“ cart”和“ pmm”更合适?我不想简单地估算均值/中位数。...
我可以通过“ ID”以某种方式估算数据
调试提示?
这是我的代码
#Start
require(mice)
require(Hmisc)
'setwd(...)
'test.df<-read.csv(...)
str(test.df)
检查相关性: 前两列包含标识符和年份,因此无需查看。
test.df.rcorr<-rcorr(as.matrix(test.df[,-c(1:2)]))
test.df.coeff<-test.df.rcorr$r
test.df.coeff<-corrplot(test.df.coeff)
可以看出,数据之间存在很强的相关性。 对于简单的任务,请忽略所有具有强相关性的列。
#Simple example
test.df2<-test.df[,-c(4,7,10,11)]
test.df2
sum(is.na(test.df2))
现在,让我们在不指定方法的情况下插入test.df2:
imputation.df2<-mice(test.df2, m=1, seed=123456)
imputation.df2$method
test.df2.imp<-mice::complete(imputation.df2)
Warning message:
Number of logged events: 1
sum(is.na(test.df2.imp))
可以看出,所有的NA都是估算值。并且使用的方法仅为“ pmm”。
使用完整的数据集,我几乎立即收到以下错误消息:
imputation.df<-mice(test.df,m=1,seed = 66666)
iter imp variable
1 1 x1Error in solve.default(xtx + diag(pen)) :
system is computationally singular: reciprocal condition number = 1.49712e-16
这仅仅是由于数据中的相关性吗?
最后,我的ID插补代码在显示此错误之前运行了更长的时间:
test123<- lapply(split(test.df, test.df$ID), function(x) mice::complete(mice(x, m = 1 ,seed = 987654)))
Error in edit.setup(data, setup, ...) : nothing left to impute
In addition: There were 19 warnings (use warnings() to see them)
Called from: edit.setup(data, setup, ...)
我知道这是一个很长的问题,对于每一个小窍门或提示我都表示感谢!
谢谢你!
答案 0 :(得分:3)
我认为出现此问题是因为您正在处理纵向数据,而mice
将这些观察视为独立的。纵向数据按ID进行聚类,处理此问题的一种方法是使用多级(即混合)模型作为插补模型。
mice
有许多处理这类数据的选项,您可以在预测矩阵和插补方法中指定这些数据。
library(mice)
setwd("X:/My Downloads")
test.df <- read.csv("Impute.csv")
您需要指定ID
是您的分组变量或类变量。不幸的是mice
只能处理此变量的整数值,因此您需要将其更改为整数(在插补后始终可以将其更改为整数)。
test.df$ID <- as.integer(test.df$ID)
您可以通过大量运行的鼠标(即迭代0次的插补)轻松获得预测矩阵和插补方法。
ini<-mice(test.df,maxit=0)
pred1<-ini$predictorMatrix
pred1[,"ID"]<- -2 # set ID as class variable for 2l.norm
pred1[,"year"]<- 2 # set year as a random effect, slopes differ between individuals
预测变量矩阵中的值为1表示该列变量用作插补目标(行)变量的固定效果预测变量,而0表示未使用该变量。 -2表示变量是类变量(您的ID
),值2表示该变量将用作随机效果。有关详细信息,您需要阅读多级建模,但是基本上可以使用year
作为固定效应来指定每个个体显示相同的总体增长(每个个体对任何其他变量的年度相同影响)或作为对个体成长不同的更复杂假设进行建模的随机效应。
您可以查看您的数据,以查看简单模型是否完全适合您的观察数据,或者是否需要更复杂的模型(即,个体的成长速度是否大致相同)。
接下来,将您的方法更改为混合模型。您有两个常规选项:2l.pan假设类中的方差是同质的,2l.norm允许异类方差。同样,您需要读取并检查数据(例如,运行混合模型并查看残差是否大致均匀)。 2l.pan是更简单的模型。
https://www.rdocumentation.org/packages/mice/versions/3.6.0/topics/mice.impute.2l.pan https://www.rdocumentation.org/packages/mice/versions/3.6.0/topics/mice.impute.2l.norm
# 2l.norm mixed model (heterogenous within group variance) 2l.pan (homogenous within group variance)
#Work on method
meth1<-ini$method
meth1[which(meth1 == "pmm")] <- "2l.pan"
imputation.df<-mice(test.df,m=5,seed = 66666, method = meth1, predictorMatrix = pred1)
该方法考虑了个体内观察值之间的较高相关性。总方差分为ID
或人员级别的方差和year
或观察级别的方差。
请注意,我还将数据集的数量从m = 1
更改为m = 5
。 mice
用于计算多个插补,从而产生多个数据集。每个数据集都会略有不同,估算之间的差异用于反映有关缺失数据背后真实值的不确定性。如果仅估算一个数据集,则无法获得此优势。
由于插补模型更加复杂,因此它们需要花费更长的时间运行,但是错误不再发生,并且插补方法可以更好地表示数据结构(希望可以导致更精确的插补)。
iter imp variable
1 1 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11
1 2 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11
1 3 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11
1 4 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11
1 5 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11
2 1 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11
2 2 x1 x2 x3 x4 x5
对于多层次建模,我建议使用Snijders和Bosker撰写的《多层次分析》一书。鼠标手册还包含一些信息https://www.jstatsoft.org/article/view/v045i03