在 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
)
甚至更简单的策略就是首先创建隔离因素。这也将使模型拟合更容易。
我想为我的不同数据段构建单独的模型。我已经建立了这样的模型:
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
)
甚至更简单的策略就是首先创建隔离因素。这也将使模型拟合更容易。