在R中用LongituRF软件包实现纵向随机森林



我有一些高维重复测量数据,我有兴趣拟合随机森林模型,以研究这些模型的适用性和预测效用。具体来说,我正在尝试实现LongituRF包中的方法。这个包背后的方法在这里详细介绍:

Capitaine,L.等。高维纵向数据的随机森林。Stat Methods Med Res(2020)doi:10.1177/0962280220946080。

作者方便地提供了一些有用的数据生成函数用于测试。所以我们有

install.packages("LongituRF")
library(LongituRF)

让我们用DataLongGenerator()生成一些数据,它以n=样本大小,p=预测因子的数量和G=具有时间行为的预测因子的数目为自变量。

my_data <- DataLongGenerator(n=50,p=6,G=6)

CCD_ 3是您期望的Y(响应向量)的列表,X(固定效应预测因子的矩阵)、Z(随机效应预测因子矩阵),id(样本标识符的矢量)和时间(时间测量的矢量)。简单拟合随机森林模型

model <- REEMforest(X=my_data$X,Y=my_data$Y,Z=my_data$Z,time=my_data$time,
id=my_data$id,sto="BM",mtry=2)

这里大约需要50秒,所以请耐心等待

到目前为止还不错。现在我清楚了除了Z之外的所有参数当我根据实际数据拟合此模型时,什么是Z

看看my_data$Z

dim(my_data$Z)
[1] 471   2
head(my_data$Z)
[,1]      [,2]
[1,]    1 1.1128914
[2,]    1 1.0349287
[3,]    1 0.7308948
[4,]    1 1.0976203
[5,]    1 1.3739856
[6,]    1 0.6840415

每一行看起来像一个截距项(即1)和从均匀分布runif()中提取的值。

CCD_ 8的文献表明;Z[矩阵]:一个Nxq矩阵,包含随机效应的q预测器">使用实际数据时,如何指定此矩阵

我的理解是,传统上Z只是群变量的一个热(二进制)编码(例如,如本文所述),所以DataLongGenerator()中的Z应该是nxG(471x6)稀疏矩阵否?

请澄清如何用实际数据指定Z参数。

编辑

我的具体示例如下,我有一个响应变量(Y)。样本(用id鉴定)被随机分配到干预(I,干预或不干预)。一组高维特征(X)。在两个时间点(Time,基线和终点)测量特征和反应。我对使用XI预测Y感兴趣。我还对提取哪些特征对预测Y最重要感兴趣(就像Capitaine等人在论文中对HIV所做的那样)。

我将按如下呼叫REEMforest()

REEMforest(X=cbind(X,I), Y=Y, time=Time, id=id)

Z应该使用什么?

当函数DataLongGenerator()创建Z时,它是矩阵中的随机统一数据。实际编码为

Z <- as.matrix(cbind(rep(1, length(f)), 2 * runif(length(f))))

其中f表示表示表示每个元素的矩阵的长度。在您的示例中,您使用了6组,每组50名参与者,具有6个固定效果。这导致长度为472。

据我所知,由于这个函数是为了模拟纵向数据而设计的,所以这是对数据随机影响的模拟。如果你使用真实的数据,我想这会更容易理解。

虽然这个例子没有使用RE-EM森林,但我认为它非常清楚,因为它使用了有形元素作为例子。您可以在第1.2.2节"固定与随机效应"中阅读有关随机效应的内容。https://ademos.people.uic.edu/Chapter17.html#32_fixed_effects

请参阅第3.2节,查看随机效应的示例,如果您使用真实数据,可以有意对其进行建模。

另一个例子:你正在进行癌症药物试验。您每周收集患者的人口统计数据:体重、体温、CBC小组和不同的给药组:每天1个单位、每天2个单位和每天3个单位。

在传统的回归中,你会对这些变量进行建模,以确定模型识别结果的准确性。固定效应是可解释方差R2。所以,如果你有.86%或86%,那么14%是无法解释的。它可能是导致噪声的相互作用,完美和模型确定的结果之间的无法解释的差异。

假设白细胞计数超重的患者对治疗的反应要好得多。或者红发患者的反应可能更好;这不在你的数据中。就纵向数据而言,假设这种关系(交互关系)只有在经过一定时间后才会出现。

您可以尝试对不同的关系进行建模,以评估数据中的随机交互。不过,我认为你最好采用多种方法中的一种来系统地评估互动,而不是随机尝试识别随机影响。

编辑我开始在@JustGettinStarted的评论中写这篇文章,但太多了。

如果没有背景,实现这一点的最简单方法是运行类似REEMtree::REEMtree()的程序,将随机效果参数设置为random = ~1 | time / id)。运行后,提取计算出的随机效果。你可以这样做:

data2 <- data %>% mutate(oOrder = row_number()) %>%  # identify original order of the data
arrange(time, id) %>%
mutate(zOrder = row_number()) # because the random effects will be in order by time then id
extRE <- data.frame(time = attributes(fit$RandomEffects[2][["id"]])[["row.names"]]) %>% 
separate(col = time,
into = c("time", "id"),
sep = "\/") %>%
mutate(Z = fit$RandomEffects[[2]] %>% unlist(),
id = as.integer(id),
time = time))        # set data type to match dataset for time
data2 <- data2 %>% left_join(extRE) %>% arrange(oOrder) # return to original order
Z = cbind(rep(1, times = nrows(data2)), data2$Z)

或者,我建议你从随机产生的随机效应开始。你开始的随机效果只是一个起点。最后的随机效果会有所不同。

无论我尝试了多少种将LongituRF::REEMforest()与真实数据结合使用的方法,我都会遇到错误。我每次都有一个不可逆的矩阵失败。

我注意到DataLongGenerator()生成的数据是按id和时间顺序排列的。我试着用这种方式对数据(和Z)进行排序,但无济于事。当我从包LongituRF中提取所有功能时,我使用了MERF(多效果随机林)功能,没有任何问题。即使在研究论文中,这种方法也是可靠的。只是觉得值得一提。

最新更新