我有一些高维重复测量数据,我有兴趣拟合随机森林模型,以研究这些模型的适用性和预测效用。具体来说,我正在尝试实现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
,基线和终点)测量特征和反应。我对使用X
和I
预测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(多效果随机林)功能,没有任何问题。即使在研究论文中,这种方法也是可靠的。只是觉得值得一提。