在 R 中组合多个模型对子集数据的预测的简单方法

Simple Way to Combine Predictions from Multiple Models for Subset Data in R

我想为我的不同数据段构建单独的模型。我已经建立了这样的模型:

log1 <- glm(y ~ ., family = "binomial", data = train, subset = x1==0)
log2 <- glm(y ~ ., family = "binomial", data = train, subset = x1==1 & x2<10)
log3 <- glm(y ~ ., family = "binomial", data = train, subset = x1==1 & x2>=10)

如果我 运行 对训练数据进行预测,R 会记住子集并且预测向量具有相应子集的长度。

但是,如果我 运行 对测试数据进行预测,则预测向量的长度是整个数据集的长度,而不是子集的长度。

我的问题是是否有更简单的方法来实现我想要的,首先对测试数据进行子集化,然后 运行对每个数据集进行预测,连接预测,rbinding 子集数据,然后附加像这样的串联预测:

T1 <- subset(Test, x1==0)
T2 <- subset(Test, x1==1 & x2<10)
T3 <- subset(Test, x1==1 & x2>=10)
log1pred <- predict(log1, newdata = T1, type = "response")
log2pred <- predict(log2, newdata = T2, type = "response")
log3pred <- predict(log3, newdata = T3, type = "response")
allpred <- c(log1pred, log2pred, log3pred)
TAll <- rbind(T1, T2, T3)
TAll$allpred <- as.data.frame(allpred)

我想认为我是愚蠢的,有一种更简单的方法可以实现这一点——许多模型基于小的数据子集。如何结合它们以获得对完整测试数据的预测?

首先,这是一些示例数据

set.seed(15)
train <- data.frame(x1=sample(0:1, 100, replace=T),
  x2=rpois(100,10),
  y=sample(0:1, 100, replace=T))
test <- data.frame(x1=sample(0:1, 10, replace=T),
  x2=rpois(10,10))

现在我们可以拟合模型了。在这里,我将它们放在一个列表中,以便更容易地将它们放在一起,并且我还从模型中删除了 x1,因为它将为每个子集固定

fits<-list(
  glm(y ~ .-x1, family = "binomial", data = train, subset = x1==0),
  glm(y ~ .-x1, family = "binomial", data = train, subset = x1==1 & x2<10),
  glm(y ~ .-x1, family = "binomial", data = train, subset = x1==1 & x2>=10)
)

现在,对于训练数据,我创建了一个指标来指定观察结果属于哪个组。为此,我查看每个调用的 subset= 参数并评估测试数据中的这些条件。

whichsubset <- as.vector(sapply(fits, function(x) {
    subsetparam<-x$call$subset
    eval(subsetparam, test)
})%*% matrix(1:length(fits), ncol=1))

您需要确保您的组是互斥的,因为此代码不检查。然后,您可以将因子与 split/unsplit 策略结合使用来进行预测

unsplit(
    Map(function(a,b) predict(a,b), 
        fits, split(test, whichsubset)
    ), 
    whichsubset
 )

甚至更简单的策略就是首先创建隔离因素。这也将使模型拟合更容易。