小鼠的插补方法 - 数据集中的相关性。 R
Imputation methods in mice - correlation in data set. R
我正在努力使用鼠标进行估算。主要的 objective 是估算 NA(如果可能的话按组)。
由于示例有点大到简单 post 这里可以下载:
https://drive.google.com/open?id=1InGJ_M7r5jwQZZRdXBO1MEbKB48gafbP
我的问题是:
一般而言,关联数据有多大问题?我还能做些什么来估算数据?
数据是一个实证研究问题的一部分,我还不知道要包括哪些变量,所以最好暂时保留尽可能多的。
什么方法比"cart" & "pmm"更合适?我不想简单地归咎于 mean/median.....
我可以通过 "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, ...)
我知道这是一个很长的问题,我很感激每一个小提示或提示!
非常感谢!
我认为问题的出现是因为您正在处理纵向数据,而 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 = 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
我正在努力使用鼠标进行估算。主要的 objective 是估算 NA(如果可能的话按组)。 由于示例有点大到简单 post 这里可以下载: https://drive.google.com/open?id=1InGJ_M7r5jwQZZRdXBO1MEbKB48gafbP
我的问题是:
一般而言,关联数据有多大问题?我还能做些什么来估算数据? 数据是一个实证研究问题的一部分,我还不知道要包括哪些变量,所以最好暂时保留尽可能多的。
什么方法比"cart" & "pmm"更合适?我不想简单地归咎于 mean/median.....
我可以通过 "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, ...)
我知道这是一个很长的问题,我很感激每一个小提示或提示!
非常感谢!
我认为问题的出现是因为您正在处理纵向数据,而 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 = 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