含对数变换线性样条的混合效应模型可视化结果异常求助
对数变换变量的线性样条混合效应模型可视化异常
问题说明
在可视化包含以下两个要素的混合效应模型结果时出现异常:
- 对连续变量
Arns做以2为底的对数变换 - 将变换后的变量作为线性样条纳入模型
当前生成的图像为杂乱无章的折线,而预期应呈现分段线性的平滑样条曲线,且与原始数据点的趋势匹配。
模型拟合代码
data_df$School_ID <- as.factor(data_df$School_ID) data_df$Student_ID<- as.factor(data_df$Student_ID) # 拟合样条模型 ls_m1 <- lme(fixed = Y ~ School_ID + lspline::lspline(log(Arns,2), log(0.058,2) ), random = ~1 | Student_ID, data = data_df )
当前可视化代码
data_df$predict <- predict(ls_m1) ggplot(data_df, aes(log(Arns,2), predict, color = factor(Student_ID))) + geom_line(color = 'black') + geom_point(data = data_df, aes(y = Y)) + guides(color = guide_none())
问题根源
- 数据未按自变量排序:原始数据中
log(Arns,2)未按从小到大的顺序排列,geom_line()会严格按照数据框的原始顺序连接点,导致折线混乱,无法体现线性样条的分段趋势。 - 拟合值的展示逻辑偏差:若要展示整体的固定效应拟合曲线,无需按
Student_ID分组,否则会因数据顺序问题进一步打乱线条。
解决方案
方案1:展示整体固定效应拟合曲线
先对数据按对数变换后的Arns排序,再绘图:
# 按log(Arns,2)从小到大排序数据 data_df_sorted <- data_df[order(log(data_df$Arns,2)), ] ggplot(data_df_sorted, aes(log(Arns,2), predict)) + geom_line(color = 'black') + geom_point(aes(y = Y)) + theme_bw()
方案2:展示每个学生的随机效应拟合曲线
如果需要呈现个体层面的拟合趋势,需指定predict()的level参数提取随机效应拟合值,再排序绘图:
# 提取包含随机效应的个体拟合值 data_df$predict_re <- predict(ls_m1, level = 1) # 按自变量排序数据 data_df_sorted <- data_df[order(log(data_df$Arns,2)), ] ggplot(data_df_sorted, aes(log(Arns,2), predict_re, color = Student_ID)) + geom_line() + geom_point(aes(y = Y)) + guides(color = guide_legend(title = "学生ID")) + theme_bw()
额外优化:标注样条节点
可以添加虚线标注线性样条的节点位置(对应原始Arns=0.058):
ggplot(data_df_sorted, aes(log(Arns,2), predict)) + geom_line(color = 'black') + geom_point(aes(y = Y)) + geom_vline(xintercept = log(0.058,2), linetype = "dashed", color = "red") + theme_bw()
内容的提问来源于stack exchange,提问作者Bridgeport BaaS
相关产品推荐
相关产品推荐

