【问题标题】:Imputation methods in mice - correlation in data set. R小鼠的插补方法 - 数据集中的相关性。 R
【发布时间】:2020-03-09 02:07:39
【问题描述】:

我正在努力使用老鼠进行插补。主要目标是估算 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)

检查相关性: 前 2 列包含标识符和年份,因此无需查看。

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

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

非常感谢!

【问题讨论】:

  • 拟合数据中 NA 的值。例如,这可以通过用数据平均值替换 NA 来完成。 en.wikipedia.org/wiki/Imputation_(statistics)
  • 我明白了,谢谢你的解释。我建议在 [stats.stackexchange.com/] 中询问您问题的理论/推理部分,因为他们在统计知识方面有更多经验。
  • 我不明白您为什么要排除相关列。如果您想估算值,来自强相关列的信息似乎是最有用的。还是您指的是自相关?然后我建议使用 Amelia 包,它可以在插补模型中包含自相关。
  • 您可能想尝试单个插补包(如果您似乎不需要多个插补值)。它们通常更容易使用。例如查看包 missForest、VIM、imputeR。
  • 另一条评论:问题确实与强相关变量有关。另请参阅此处stats.stackexchange.com/questions/76488/…。这只是您使用鼠标的默认算法的问题。 (glm)。如果你想继续使用鼠标,你也可以将方法参数设置为另一个算法。

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


【解决方案1】:

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

【讨论】:

  • 嘿尼克,很好的答案。 @Juan 从 ID 和年份得到错误。但是好的研究实际上包括在老鼠身上。
  • @Niek,稍后会看看你的答案。谢谢!
  • @StupidWolf thx :)。当您删除描述数据纵向结构的变量时,错误消失是有道理的。将观察结果视为独立将在插补过程和任何后续分析中产生向下偏差的标准误差(参见 McCoach & Adleson,2010)。当进行单一插补而不是多重插补时,这个问题会更加严重(参见 Graham,2009 年)。主要问题是这两种方法都会导致后续假设检验中的第一类错误率过高。
  • @Juan,最后的旁注 :),因为您几乎没有遗漏的观察结果(在 x11 中最差为 1.3%),因此删除可能不是一个坏主意。它比插补和偏见更容易,而且权力问题可能还不错。我绝对认为使用多级多重插补会给出最好的估计,但对于您要解决的问题来说,这可能有点矫枉过正。
猜你喜欢
  • 2021-08-25
  • 2019-08-04
  • 2021-06-29
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多