结合R中子集数据的多模型预测的简单方法

时间:2015-07-23 20:17:25

标签: r predict multiple-models

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

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,并附加如下的连接预测: / p>

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)

我想我是愚蠢的,并且有一种更简单的方法来实现这一点 - 许多模型都是关于数据的小子集。如何将它们结合起来以获得完整测试数据的预测?

1 个答案:

答案 0 :(得分:1)

首先,这是一些示例数据

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))

您需要确保您的群组是互斥的,因为此代码不会检查。然后,您可以使用具有拆分/非拆分策略的因子来进行预测

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

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