【问题标题】:R bygroup mice imputation - mice.impute.bygroupR bygroup 小鼠插补 - mouse.impute.bygroup
【发布时间】:2021-08-25 13:27:07
【问题描述】:

当我运行mice::mice 来估算值时,我想将我的数据按state_idspecies 分组。我已将它按 state_id 分组,结果看起来比没有 bygroup 时要好得多。

mice.impute.bygroup: Groupwise Imputation Function

编辑...改进的工作代码:

# Modify df name and method
init <- mice::mice(data, method = "pmm", maxit = 0) 
meth <- init$meth
pred <- init$pred

# Impute variables by group (state_id)
imputationFunction <- list("decimalLatitude" = meth["decimalLatitude"],
                           "decimalLongitude" = meth["decimalLongitude"])

meth[c("decimalLatitude", "decimalLongitude")] <- "bygroup"

group <- list("decimalLatitude" = "state_id", 
              "decimalLongitude" = "state_id")

# Remove variables as predictors but they can still be imputed.
pred[, c("coordinateUncertaintyInMeters", "geoprivacy_id")] <- 0

set.seed(500)
imp <- mice::mice(data, meth = meth, pred = pred, m = 1, 
                  group = group, imputationFunction = imputationFunction)
imp <- complete(imp)

这也有效,但没有按组:

imp <- mice(data, m = 1, maxit = 3, method = 'norm.predict', seed = 500)
imp <- complete(imp, 1)

所以,还有一个问题。

  1. 我可以按多个变量分组吗?

当我将变量 state_id 替换为 species_id 时,我遇到了错误:

lm.fit(x = x, y = y) 中的错误:0(非 NA)案例

问题似乎是某些物种的经纬度数据为零或没有值。我通过删除所有没有经纬度数据的物种证实了这一点,并且物种插补成功。

group <- list("decimalLatitude" = "species_id", 
              "decimalLongitude" = "species_id")

【问题讨论】:

    标签: r imputation r-mice


    【解决方案1】:

    您不应该直接使用mice.impute.bygroup。它是一个在您指定 method["x"] &lt;- "bygroup" 时被调用的函数,就像您使用 "norm.predict" 调用 mice.impute.norm.predict 一样(参见 ?mice.impute.norm.predict)。

    下面是一些关于如何使用bygroup的示例代码。

    样本数据

    data <- iris
    str(data)
    # 'data.frame': 150 obs. of  5 variables:
    #  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
    #  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
    #  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
    #  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
    #  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
    
    data[, -5] <- mice::ampute(data[, -5])$amp
    
    init <- mice::mice(data, maxit = 0)
    

    按组(物种)估算一个变量(Petal.Width)

    meth <- init$meth
    pred <- init$pred
    
    imputationFunction <- list("Petal.Width" = meth["Petal.Width"])
    meth["Petal.Width"] <- "bygroup"
    group <- list("Petal.Width" = "Species")
    
    pred[, "Species"] <- 0
    
    imp <- mice::mice(data, meth = meth, pred = pred, m = 1, 
                      group = group, imputationFunction = imputationFunction)
    

    对于所有变量

    meth <- init$meth
    pred <- init$pred
    
    imputationFunction <- as.list(meth[meth != ""])
    meth[meth != ""] <- "bygroup"
    group <- imputationFunction
    group[] <- "Species"
    
    pred[, "Species"] <- 0
    
    imp <- mice::mice(data, meth = meth, pred = pred, m = 1, 
                      group = group, imputationFunction = imputationFunction)
    

    进一步考虑

    bygroup 方法不允许您跨多个变量进行分组。您可以创建一个简单地涵盖所有这些组的新变量。在内部,bygroup 所做的只是将数据分成不同的组,所以这不是问题。

    但是,在某些时候,您必须考虑这是否是一种正确的做事方式。 multi-level imputation 可能更值得考虑。

    【讨论】:

    • 情况看起来非常好。我们可以按多个变量分组吗?我已经更新了我的问题。
    • 我看了看内部;它仅适用于 1 个变量。您可以考虑创建一个组合多个变量分组的新变量。但是,您可能需要考虑这是否是前进的最佳方式。很可能您应该研究多级插补。
    • 感谢您的帮助。您的示例比我遇到的任何官方文档都要好。 rdocumentation 在方法和组行之后有 imputationFunction 并且它按该顺序失败,所以我使用了您的顺序。我对我得到的结果感到相当满意。按物种分组会很好,但有些物种没有足够的数据来进行估算。我来看看多层次的。
    猜你喜欢
    • 2021-06-29
    • 2019-08-04
    • 2020-03-09
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2019-10-24
    相关资源
    最近更新 更多