gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:15:43 26 4
gpt4 key购买 nike

我正在努力使用小鼠进行插补。主要目标是估算 NA(如果可能,按组)。
由于示例有点大,可以在此处简单发布,因此可以下载:
https://drive.google.com/open?id=1InGJ_M7r5jwQZZRdXBO1MEbKB48gafbP

我的问题是:

  • 相关数据一般有多大问题?我该怎么做才能仍然估算数据?
    数据是实证研究问题的一部分,我还不知道要包含哪些变量,因此最好暂时保留尽可能多的变量。
  • 什么方法比“cart”和“pmm”更合适?我不想简单地估算平均值/中位数....
  • 我可以通过“ID”以某种方式估算数据
  • 调试技巧?

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

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

    谢谢一堆!

    最佳答案

    我认为问题的出现是因为您正在处理纵向数据和 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 = 1m = 5 . mice用于计算多个插补,从而产生多个数据集。每个数据集都会略有不同,插补之间的差异用于反射(reflect)缺失数据背后真实值的不确定性。如果您只估算一个数据集,则不会获得此优势。

    由于插补模型更复杂,它们需要更长的时间运行,但错误不再发生,并且您的插补方法更好地代表了您的数据结构(希望能带来更准确的插补)。
     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

    关于r - 小鼠的插补方法 - 数据集中的相关性。电阻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58834363/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com