我想为我的数据的不同部分构建单独的模型。我已经建立了这样的模型:
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)
我想我是愚蠢的,并且有一种更简单的方法来实现这一点 - 许多模型都是关于数据的小子集。如何将它们结合起来以获得完整测试数据的预测?
答案 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
)
更简单的策略就是首先创建隔离因素。这样也可以使模型更容易拟合。