【问题标题】:R MICE impute new observationsR MICE 估算新的观察结果
【发布时间】:2017-02-28 03:21:00
【问题描述】:

当我使用 mice 包来估算数据时,我遇到了以下问题:

鉴于我已经在训练集中估算了缺失的数据,我似乎无法找到替换 NA 新观察值的方法。

示例 1

我已经使用来自具有 10 个特征和 1000 个观察值的数据框的数据训练了一个算法。

如何使用此算法预测新的观察结果(数据缺失)?

示例 2

假设我们有一个带有NA 值的数据框:

V1   V2  V3  R1
1    2   NA  1
1.4  -1  0   0
1.2  NA  0   1
1.6  NA  1   1
1.2  3   1   0

我使用mice 包估算缺失值:

imp <- mice(df, m = 2, maxit = 100, meth = 'pmmm', seed = 12345)

对象 df 现在有 2 个带有估算值的数据帧。

(dfImp1)
V1   V2  V3  R1
1    2   0.5 1
1.4  -1  0   0
1.2  1.5 0   1
1.6  1.5 1   1
1.2  3   1   0

现在有了这个数据框,我可以训练一个算法:

modl <- glm(R1~., (dfImp1), family = binomial)

我想预测一个新观察的反应,例如:

obs1 <- data.frame(V1 = 1, V2 = 1.4, V3 = NA)

我如何对新的个体观察的缺失数据进行估算

【问题讨论】:

  • 您能发布一些示例代码和示例数据框吗?通常您在具有新数据的算法上使用 predict() 函数,但如果没有更多信息就很难说。
  • 我已经在操作中添加了。
  • 我已经咨询过这个软件包的创建者之一 Stefen Van Buuren,他告诉我这是不可能的。抱歉浪费时间,谢谢!
  • 根据 y 变量和 x 变量之间的关系类型,您可能只对缺失 y 变量的所有新观察结果使用 MICE。另一种方法是仅对 x 值进行插补,然后在此之后预测 y,但这假设缺失的 x 值与 y 除了与其他 x 值的关系之外没有其他关系(以非缺少 x 值,缺少 x 值对 y) 没有影响。
  • 是的!这就是想法,但事情是这样的:想象我今天进行了培训和测试,我创建了预测性能最佳的模型,但是明天会有新的观察结果,并且有空数据,所以我不能使用我今天创建的模型,因为我无法为新观察估算数据,这需要为每个新观察重新创建一个新模型。

标签: r machine-learning missing-data imputation r-mice


【解决方案1】:

似乎mice包没有内置解决方案,但我们可以写一个。

这个想法是:

  • (1) 使用相同的小鼠算法在用于训练 GLM 和新观察的数据集中填充 NA;
  • (2) 仅预测没有 NA 的新观测值。

我将使用 iris 作为数据示例。

library(R6)
library(mice)

# Binary output to use Binomial
df <- iris %>% filter(Species != "virginica")

# The new observation 
new_data <- tail(df, 1)

# the dataset used to train the model
df <- head(df,-1)

# Now, let insert some NAs
insert_nas <- function(x) {
  set.seed(123)
  len <- length(x)
  n <- sample(1:floor(0.2*len), 1)
  i <- sample(1:len, n)
  x[i] <- NA 
  x
}

df$Sepal.Length <- insert_nas(df$Sepal.Length)

df$Petal.Width <- insert_nas(df$Petal.Width)

new_data$Sepal.Width = NA

summary(df)

在拟合方法中,我们使用小鼠来填充 NA,拟合 GLM 模型并将其存储以用于预测方法。

在 predict 方法中,我们 (1) 将 new_observation 添加到数据集(使用 NA),(2) 再次使用鼠标替换 NA,(3) 取回没有 NA 的新观察的行和然后 (4) 应用 GLM 来预测这个新的观察结果。

# R6 Class Generator
GLMWithMice <- R6Class("GLMWithMice", list(
  model = NULL,
  df = NULL,
  fitted = FALSE,
  
  initialize = function(df) {
    self$df <- df
  },
  fit = function(formula = "Species~.", family = binomial) {
    
    imp <- mice(self$df, m = 2, maxit = 100, meth = 'pmm', seed = 12345, print=FALSE)
    df_cleaned <- complete(imp,1)
    self$model <- glm(formula, df_cleaned, family = family, maxit = 100)
    self$fitted <- TRUE
    return(cat("\n model fitted!"))
  },
  predict = function(new_data, type = "response"){
    n_rows <- nrow(self$df)
    df_new <- bind_rows(self$df, new_data)
    imp <- mice(df_new, m = 2, maxit = 100, meth = 'pmm', seed = 12345, print=FALSE)
    df_cleaned <- complete(imp,1)
    new_data_cleaned <- tail(df_cleaned, nrow(df_new) - n_rows)
    return(predict(self$model,new_data_cleaned, type = type))
  }
  )
)
#Let's create a new instance of "GLMWithMice" class
model <- GLMWithMice$new(df = df)

class(model)
model$fit(formula = Species~., family = binomial)

model$predict(new_data = new_data)

【讨论】:

    猜你喜欢
    • 2013-03-26
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多