当我使用mice
包来估算数据时,我遇到以下问题:
我似乎无法找到替换NA
新观察值的方法,因为我已经在训练集中估算了缺失的数据。
我训练了一个算法,该算法包含来自数据框的数据,包含10个特征和1000个观测值。
如何使用此算法预测新观察结果(缺少数据)?
我们有一个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)
如何归咎于新观察的缺失数据?
答案 0 :(得分:0)
似乎mice包没有内置解决方案,但我们可以写一个。
我们的想法是:
我将使用 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 模型并将其存储以用于预测方法。
在预测方法中,我们 (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)