小鼠中的插补方法-数据集中的相关性。 [R

时间:2019-11-13 09:52:41

标签: r debugging missing-data imputation r-mice

我正在努力地利用小鼠进行归因。主要目标是估算NA(如果可能,按组)。 由于该示例对于简单的帖子来说有点大,因此可以下载: 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 个答案:

答案 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 = 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撰写的《多层次分析》一书。鼠标手册还包含一些信息https://www.jstatsoft.org/article/view/v045i03