GLMERTREE ranefstart 和 offset
GLMERTREE ranefstart and offset
我正在使用 lmertree
来拟合形式为
的退化模型
ln(y)=offset(ln(t0_value))+b*time
其中 y
是感兴趣的结果,t0_value
是物质在时间 0 时的初始浓度,b
是要估计的参数,time
是一个可变的测量时间。这是一项纵向研究,因此存在一个 id 变量,它索引同一主题的测量值 (HC
),最后一些协变量是感兴趣的主题级别(即非时间依赖)。
我一直在试验不同类型的 lmertree
模型并探索函数中的不同选项,我对选项 ranefstart
和 offset
感到困惑,特别是如果我set ranefstart=T
我得到的结果与 ranefstart=NULL
的结果截然不同
现在我展示一些用于拟合模型的代码:
lmm_tree1 <- lmertree(log(y) ~-1+ time | ((-1+time)|HC) |
TD+EP2+DFA+DTCX+TIF+SCV,
data = z0l,
offset = log(z0l[,"value_t0"]),
ranefstart =T)
lmm_tree2 <- lmertree(log(y) ~-1+ time | ((-1+time)|HC) |
TD+EP2+DFA+DTCX+TIF+SCV,
data = z0l,
offset = log(z0l[,"value_t0"]),
ranefstart =NULL)
lmm_tree <- lmertree(log(y) ~-1+ time | ((-1+time)|HC) |
TD+EP2+DFA+DTCX+TIF+SCV,
data = z0l,
offset = log(z0l[,"value_t0"]),
ranefstart = z0l[,"value_t0"])
请注意,我已经消除了截距并使用偏移选项来指定我想要的模型。
模型lmm_tree2
和lmm_tree3
非常相似(它们在深度上不同但分割标准非常相似),但是模型lmm_tree1
只有一个节点。
问题是:何时以及为什么要使用 ranefstart 选项?
参数ranefstart
函数 lmertree
在估计模型的 LM 树部分(这里 log(y) ~ -1 + time | TD + EP2 + DFA + DTCX + TIF + SCV
)和模型的随机效应部分(这里 log(y) ~ ((-1+time)|HC)
)之间迭代。参数 ranefstart
控制初始化,但这通常是无关紧要的。当响应发生变化时(此处 log(y)
)可能会产生后果,LM 树和随机效应都可能对此进行解释:
默认情况下,估计是用LM树部分初始化的;那么这种变化很可能会被树捕获。
如果覆盖默认值并指定 ranefstart = TRUE
,lmertree
将使用随机效应部分初始化估计;那么这种变化很可能会被随机效应捕获。
您使用 ranefstart = NULL
和 ranefstart = TRUE
获得了非常相似的结果,表明最终模型对树初始化与随机效应不敏感。在那种情况下,使用默认值就可以了。
通过指定 ranefstart = z0l[,"value_t0"]
,变量 z0l[,"value_t0"]
将作为偏移量包含在估计的第一次迭代中的线性预测器中。在进一步的迭代中,将不再使用此偏移量。因为您已经指定了 offset = log(z0l[,"value_t0"])
,所以在第一次迭代中偏移量加倍;这可能会将迭代估计发送到错误的方向,并且进一步的迭代可能无法再对此进行纠正。这可以解释为什么你得到如此不同的结果。
ranefstart
参数的使用仅在您期望响应中的很大一部分方差可以由树以及随机效应解释时才有用,并且您更希望通过模型的随机效应部分而不是树来解释这种变化。
参数cluster
此外:您提到您有主题级别(二级)分区协变量。在这种情况下,我建议使用 cluster
参数,因为默认情况下,用于选择拆分变量的参数稳定性测试假定要在最低级别(级别 I)测量分区变量。通过指定 cluster = HC
,参数稳定性测试将说明在 II 级测量的分区变量。当在级别 I 执行参数稳定性测试时,测试可能会过载。
绘制终端节点中的二级组大小
在 glmertree
的未来版本中,最好有一个绘图函数的参数来指定 n 应该反映 I、II 等级别的样本量。目前,我可以建议以下方法:
## Fit an example lmertree with partitioning variables at level II
library("glmertree")
data("GrowthCurveDemo", package = "glmertree")
form <- y ~ time | person | x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8
lt <- lmertree(form, cluster = person, data = GrowthCurveDemo)
## Create a tree copy with node sample sizes at level II
node_ids <- predict(lt, type = "node")
lt_node <- as.list(lt$tree$node)
for (i in unique(node_ids)) {
lt_node[[i]]$info$nobs <-
length(unique(lt$tree$data[node_ids == i, "(cluster)"]))
}
lt2 <- lt
lt2$tree$node <- as.partynode(lt_node)
## Compare resulting trees:
plot(lt, which = "tree", fitted = "marginal",
main = "n is group size at level I")
plot(lt2, which = "tree", fitted = "marginal",
main = "n is group size at level II")
请注意,您需要为自己的 code/tree 调整的是您的 (g)lmertree
应该命名为 lt
。此外,不需要使用 fitted = "marginal"
,但对于纵向数据,通常可以绘制更直观的图。有关详细信息,请参阅 ?plot.lmertree
。
我正在使用 lmertree
来拟合形式为
ln(y)=offset(ln(t0_value))+b*time
其中 y
是感兴趣的结果,t0_value
是物质在时间 0 时的初始浓度,b
是要估计的参数,time
是一个可变的测量时间。这是一项纵向研究,因此存在一个 id 变量,它索引同一主题的测量值 (HC
),最后一些协变量是感兴趣的主题级别(即非时间依赖)。
我一直在试验不同类型的 lmertree
模型并探索函数中的不同选项,我对选项 ranefstart
和 offset
感到困惑,特别是如果我set ranefstart=T
我得到的结果与 ranefstart=NULL
现在我展示一些用于拟合模型的代码:
lmm_tree1 <- lmertree(log(y) ~-1+ time | ((-1+time)|HC) |
TD+EP2+DFA+DTCX+TIF+SCV,
data = z0l,
offset = log(z0l[,"value_t0"]),
ranefstart =T)
lmm_tree2 <- lmertree(log(y) ~-1+ time | ((-1+time)|HC) |
TD+EP2+DFA+DTCX+TIF+SCV,
data = z0l,
offset = log(z0l[,"value_t0"]),
ranefstart =NULL)
lmm_tree <- lmertree(log(y) ~-1+ time | ((-1+time)|HC) |
TD+EP2+DFA+DTCX+TIF+SCV,
data = z0l,
offset = log(z0l[,"value_t0"]),
ranefstart = z0l[,"value_t0"])
请注意,我已经消除了截距并使用偏移选项来指定我想要的模型。
模型lmm_tree2
和lmm_tree3
非常相似(它们在深度上不同但分割标准非常相似),但是模型lmm_tree1
只有一个节点。
问题是:何时以及为什么要使用 ranefstart 选项?
参数ranefstart
函数 lmertree
在估计模型的 LM 树部分(这里 log(y) ~ -1 + time | TD + EP2 + DFA + DTCX + TIF + SCV
)和模型的随机效应部分(这里 log(y) ~ ((-1+time)|HC)
)之间迭代。参数 ranefstart
控制初始化,但这通常是无关紧要的。当响应发生变化时(此处 log(y)
)可能会产生后果,LM 树和随机效应都可能对此进行解释:
默认情况下,估计是用LM树部分初始化的;那么这种变化很可能会被树捕获。
如果覆盖默认值并指定
ranefstart = TRUE
,lmertree
将使用随机效应部分初始化估计;那么这种变化很可能会被随机效应捕获。
您使用 ranefstart = NULL
和 ranefstart = TRUE
获得了非常相似的结果,表明最终模型对树初始化与随机效应不敏感。在那种情况下,使用默认值就可以了。
通过指定 ranefstart = z0l[,"value_t0"]
,变量 z0l[,"value_t0"]
将作为偏移量包含在估计的第一次迭代中的线性预测器中。在进一步的迭代中,将不再使用此偏移量。因为您已经指定了 offset = log(z0l[,"value_t0"])
,所以在第一次迭代中偏移量加倍;这可能会将迭代估计发送到错误的方向,并且进一步的迭代可能无法再对此进行纠正。这可以解释为什么你得到如此不同的结果。
ranefstart
参数的使用仅在您期望响应中的很大一部分方差可以由树以及随机效应解释时才有用,并且您更希望通过模型的随机效应部分而不是树来解释这种变化。
参数cluster
此外:您提到您有主题级别(二级)分区协变量。在这种情况下,我建议使用 cluster
参数,因为默认情况下,用于选择拆分变量的参数稳定性测试假定要在最低级别(级别 I)测量分区变量。通过指定 cluster = HC
,参数稳定性测试将说明在 II 级测量的分区变量。当在级别 I 执行参数稳定性测试时,测试可能会过载。
绘制终端节点中的二级组大小
在 glmertree
的未来版本中,最好有一个绘图函数的参数来指定 n 应该反映 I、II 等级别的样本量。目前,我可以建议以下方法:
## Fit an example lmertree with partitioning variables at level II
library("glmertree")
data("GrowthCurveDemo", package = "glmertree")
form <- y ~ time | person | x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8
lt <- lmertree(form, cluster = person, data = GrowthCurveDemo)
## Create a tree copy with node sample sizes at level II
node_ids <- predict(lt, type = "node")
lt_node <- as.list(lt$tree$node)
for (i in unique(node_ids)) {
lt_node[[i]]$info$nobs <-
length(unique(lt$tree$data[node_ids == i, "(cluster)"]))
}
lt2 <- lt
lt2$tree$node <- as.partynode(lt_node)
## Compare resulting trees:
plot(lt, which = "tree", fitted = "marginal",
main = "n is group size at level I")
plot(lt2, which = "tree", fitted = "marginal",
main = "n is group size at level II")
请注意,您需要为自己的 code/tree 调整的是您的 (g)lmertree
应该命名为 lt
。此外,不需要使用 fitted = "marginal"
,但对于纵向数据,通常可以绘制更直观的图。有关详细信息,请参阅 ?plot.lmertree
。