在MICE(多重插补法)中的填补方法 - 数据集中的相关性。R

4
我在使用MICE进行缺失值插补时遇到了困难。目标是尽可能地按组来插补缺失值。由于样本有点大,无法简单地在这里发布,您可以下载查看: https://drive.google.com/open?id=1InGJ_M7r5jwQZZRdXBO1MEbKB48gafbP 我的问题如下:
  1. 一般情况下,相关数据会带来多大的问题?我该如何仍然插补数据? 该数据是一个实证研究问题的一部分,我还不知道应该包括哪些变量,因此最好在这段时间内尽可能保留更多的变量。

  2. 有什么比“cart”和“pmm”更适合的方法?我不想简单地插补均值/中位数....

  3. 我能否按“ID”插补数据?

  4. 调试技巧?

这是我的代码:
#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, ...)

我知道这是一个很长的问题,我非常感谢每一个小提示或暗示!

非常感谢!


1
在数据中填充NA的值。例如,可以通过用数据平均值替换NA来完成此操作。https://zh.wikipedia.org/wiki/%E5%A1%AB%E5%85%85_(%E7%BB%9F%E8%AE%A1%E5%AD%A6) - Juan
2
我明白了,感谢您的解释。我建议您在[https://stats.stackexchange.com/]上提出关于理论/推理部分的问题,因为他们在统计知识方面拥有更丰富的经验。 - Hart Radev
2
我不明白为什么你想要排除相关列。如果你想要填补值,强相关列的信息似乎是最有用的。或者你是指自相关吗?那么我建议使用Amelia包,它可以在填补模型中包含自相关。 - Roland
1
你可能想尝试单一插补包(如果你似乎不需要多个插补值的话)。它们通常更容易使用。例如,看看missForest、VIM、imputeR等包。 - Steffen Moritz
1
另一个评论:问题确实与强相关变量有关。请参见此处https://stats.stackexchange.com/questions/76488/error-system-is-computationally-singular-when-running-a-glm。这只是使用mice默认算法时的问题。(glm)。如果您想继续使用mice,您也可以将方法参数设置为另一个算法。 - Steffen Moritz
显示剩余3条评论
1个回答

7
我认为问题出现的原因是您正在处理纵向数据,而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)

你可以通过运行mice(即使用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表示该变量是一个类变量(您的),而2的值表示该变量将被用作随机效应。关于详细信息,您需要了解多层建模,但基本上可以使用作为固定效应来指定每个个体显示相同的一般增长(年份对任何其他变量的每个个体具有相同的影响),或者作为随机效应来模拟更复杂的假设,即个体在增长方面存在差异。您可以查看数据以确定简单模型是否足够适合观察到的数据,或者是否需要更复杂的模型(即个体增长速度是否大致相同)。
接下来,将方法更改为混合模型。您有两个通用选项: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 = 5mice用于计算多个插补,从而产生多个数据集。每个数据集都会略有不同,并且插补之间的方差用于反映有关缺失数据潜在真实值的不确定性。如果只插补一个数据集,则无法获得此优势。
由于插补模型更加复杂,所以运行时间更长,但错误不再发生,您的插补方法也更好地代表了数据结构(希望导致更准确的插补)。
 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的《多层次分析》一书,以进行多层次建模。MICE手册也包含一些信息。https://www.jstatsoft.org/article/view/v045i03

1
嘿,尼克,好答案。@Juan从ID和年份中得到了错误。但是很好的研究,实际上包括在mice中。 - StupidWolf
@Niek,稍后会查看您的答案。谢谢! - Juan
1
@StupidWolf 谢谢 :). 当您删除描述数据纵向结构的变量时,错误消失是有道理的。将观察结果视为独立的会在插补过程和任何后续分析中产生低估的标准误差(请参见McCoach&Adleson,2010)。当进行单次插补而不是多次插补时,这个问题会加剧(请参见Graham,2009)。主要问题是这两种方法都会导致后续假设检验中膨胀的一类错误率。 - Niek
1
@Juan,最后的小提示:由于你的缺失观测值非常少(在x11中最多只有1.3%),也许删除并不是一个坏主意。这比插补更容易,而且偏差和功率问题可能并不那么严重。我肯定认为使用多层多重插补会给出最好的估计,但对于你试图解决的问题来说,这可能有点过头了。 - Niek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接