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

Imputation methods in mice - correlation in data set. R

我正在努力使用鼠标进行估算。主要的 objective 是估算 NA(如果可能的话按组)。 由于示例有点大到简单 post 这里可以下载: https://drive.google.com/open?id=1InGJ_M7r5jwQZZRdXBO1MEbKB48gafbP

我的问题是:

  1. 一般而言,关联数据有多大问题?我还能做些什么来估算数据? 数据是一个实证研究问题的一部分,我还不知道要包括哪些变量,所以最好暂时保留尽可能多的。

  2. 什么方法比"cart" & "pmm"更合适?我不想简单地归咎于 mean/median.....

  3. 我可以通过 "ID"

  4. 以某种方式估算数据吗
  5. 调试技巧?

这是我的代码

#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, ...)

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

非常感谢!

我认为问题的出现是因为您正在处理纵向数据,而 mice 将观察结果视为独立的。纵向数据按 ID 聚类,处理此问题的一种方法是使用多级(即混合)模型作为插补模型。 mice 有许多选项来处理此类数据,您可以在预测矩阵和插补方法中指定这些选项。

library(mice)
setwd("X:/My Downloads")

test.df <- read.csv("Impute.csv")

您需要指定 ID 是您的分组或 class 变量。不幸的是 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 表示该变量是 class 变量(您的 ID),值 2 表示该变量将用作随机效应。有关详细信息,您需要阅读多级建模,但基本上您可以使用 year 作为固定效果来指定每个人显示相同的总体增长(每个人对任何其他变量的年度影响相同)或作为随机效应来模拟更复杂的假设,即个体在生长方面存在差异。 您可以查看您的数据,看看简单模型是否足以符合您观察到的数据,或者是否需要更复杂的模型(即个体是否以大致相同的速度增长)。

接下来,将您的方法更改为混合模型。您有两个常规选项:2l.pan 假设方差在 class 内是同质的,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