使用 rfsrc 预测多变量模型

predict multivariate model using rfsrc

我使用包 "randomForestSRC",我想同时预测两个变量。我可以单独预测这两个变量,但无法组合使用。这是一个 mwe:

library(randomForestSRC)

# create dataset, only continuous variables    
dat <- mtcars[,c("drat", "wt", "qsec")]
dat$drat_wt <- dat$drat*dat$wt
dat$drat_qsec <- dat$drat*dat$qsec
train <- sample(nrow(dat), round(nrow(dat)*0.8))

# train the algorithms with only one outcome variable
test_1 <- rfsrc(drat_wt ~ . ,data = dat[train,],
                   importance = 'permute')
test_2 <- rfsrc(drat_qsec ~ . ,data = dat[train,],
                importance = 'permute')
# train the radom forest with multiple outcome variables
test_3 <- rfsrc(cbind(drat_qsec,drat_wt) ~ . ,data = dat[train,],
                importance = 'permute')
test_4 <- rfsrc(Multivar(drat_qsec,drat_wt) ~ . ,data = dat[train,],
                importance = 'permute')

# predict all the random forest data
pred_1 <- predict(test_1, dat[-train,], na.action= "na.impute")
pred_2 <- predict(test_2, dat[-train,], na.action= "na.impute")
pred_3 <- predict(test_3, dat[-train,], na.action= "na.impute")
pred_4 <- predict(test_4, dat[-train,], na.action= "na.impute")

现在对于只有一个结果(pred_1pred_2)的随机森林,有一个索引 pred_1$predicted 包含预测值,但是对于其他随机森林没有。

奖金:test_3test_4 公式有什么区别吗?在文档中找不到关于此的任何内容。

要回答您的第一个问题,pred_3 和 pred_4 的输出包含一个列表元素 regrOutput,它不包含在 pred_1 和 pred_2 对象中.如果您查看此对象的内部,您会发现两个结果(或目标或相关或...)变量的名称。例如,

names(pred_4$regrOutput)
[1] "drat_qsec" "drat_wt" 

现在,在每个对象中,您都可以找到 names(pred_1)。例如,

names(pred_4$regrOutput$drat_qsec)
[1] "predicted"     "predicted.oob" "quantile"      "quantile.oob"  "err.rate"

setdiff(names(pred_1), names(pred_3))
[1] "predicted"     "predicted.oob" "quantile"      "quantile.oob"  "err.rate" 

第二个问题我不太清楚,但是对象的结构是一样的。探索这一点的一种方法是查看对象。

比如为每个森林设置种子,然后查看返回的对象。

set.seed(1234)
test_3 <- rfsrc(cbind(drat_qsec,drat_wt) ~ . ,data = dat[train,],
                importance = 'permute')
set.seed(1234)
test_4 <- rfsrc(Multivar(drat_qsec,drat_wt) ~ . ,data = dat[train,],
                importance = 'permute')

由于第一个元素是调用,我们知道它是不同的,因此将其删除并检查身份。

identical(test_3[-1], test_4[-1])

现在,查看返回对象中的每个元素。

mapply(identical, test_3, test_4)

不相同的归零:

which(!mapply(identical, test_3, test_4))
 call     forest regrOutput 
     1         19         36 

然后进一步进入对象...

which(!mapply(identical, test_3$forest, test_4$forest))
nativeArray 
          2

等等。

然而,最重要的可能是,这些产生相同的结果吗?让我们重新运行预测并查看预测值。

pred_3 <- predict(test_3, dat[-train,], na.action= "na.impute")
pred_4 <- predict(test_4, dat[-train,], na.action= "na.impute")

现在,看看

pred_3$regrOutput$drat_qsec$predicted
[1] 68.04419 55.95063 55.02067 56.38382 56.38382 75.33735
pred_4$regrOutput$drat_qsec$predicted
[1] 68.04419 55.95063 55.02067 56.38382 56.38382 75.33735

它们在我看来是一样的

identical(pred_3$regrOutput$drat_qsec$predicted,
          pred_4$regrOutput$drat_qsec$predicted)
[1] FALSE

不过,它们并不相同。让我们使用推荐的 all.equal 函数来检查浮点值。

all.equal(pred_3$regrOutput$drat_qsec$predicted,
          pred_4$regrOutput$drat_qsec$predicted)
[1] TRUE

啊,这可能只是数值精度的问题。