【发布时间】:2017-06-30 21:41:07
【问题描述】:
在这里使用randomForest 统计包相当新。
我正在尝试运行具有 2 个响应变量和 7 个预测变量的模型,但由于响应变量的长度和/或使用 2 个响应变量拟合模型的性质,我似乎无法运行。
假设这是我的数据和模型:
> table(data$y1)
0 1 2 3 4
23 43 75 47 21
> length(data$y1)
0 4
> table(data$y2)
0 2 3 4
104 30 46 29
> length(data$y2)
0 4
m1<-randomForest(cbind(y1,y2)~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
当我运行这个模型时,我收到这个错误:
Error in randomForest.default(m, y, ...) :
length of response must be the same as predictors
我做了一些故障排除,发现cbind()这两个响应变量只是将它们的值放在一起,从而使原来的长度增加了一倍,并可能导致上述错误。例如,
length(cbind(y1,y2))
> 418
t(lapply(data, length()))
> a b c d e f g y1 y2
209 209 209 209 209 209 209 209 209
然后我尝试通过在每个响应变量上单独运行 randomForest 来解决此问题,然后在回归模型上应用 combine(),但遇到了以下问题:
m2<-randomForest(y1~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
m3<-randomForest(y2~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
combine(m2,m3)
Warning message:
In randomForest.default(m, y, ...) :
The response has five or fewer unique values. Are you sure you want to do regression?
然后我决定将randomForest 模型视为分类模型,并在运行randomForest 之前将as.factor() 应用于两个响应变量,但后来遇到了这个新问题:
m4<-randomForest(as.factor(y1)~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
m5<-randomForest(as.factor(y2)~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
combine(m4,m5)
Error in rf$votes + ifelse(is.na(rflist[[i]]$votes), 0, rflist[[i]]$votes) :
non-conformable arrays
我的猜测是我不能combine()分类模型。
我希望我对尝试运行多元随机森林模型的调查是有意义的。让我知道是否还有其他问题。我也可以回去做调整。
【问题讨论】:
-
当您说两个结果变量时,您的意思是二进制分类,例如A vs B,或者您的意思是响应变量一是 A vs B,响应变量二是 C vs D(并且基本上总共预测了四个结果)?因为我们看不到您的数据,所以有点棘手。
-
@zacdav 好问题。每个响应变量有 5 个不同的类别。我希望这回答了你的问题。我会在原帖中进行调整。
-
在这种情况下,您可能只需将两个响应列连接在一起就可以了 - 要记住的是,可能需要预测 25 个分类结果,如果样本数量较少,您将不太可能产生有效的模型。我不知道它是否会有所不同,但通过简单地创建两个模型,您可以独立评估每个响应的预测能力,然后运行两个模型并再次独立地连接每个样本的结果。这将达到你想要的
combine。 -
@zacdav 但是连接响应变量不会将所有值放在一列中,并且响应变量长度与预测变量不匹配的问题再次出现?
-
您不会使用
cbind,我建议事先处理数据并避免在randomForest 函数调用中进行任何操作。因此,data[["y3"]] <- paste0(data$y1, data$y2)然后randomForest(y3~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
标签: r classification regression random-forest