You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言群体轨迹建模求助:flexmix轨迹绘制及工具选择

轨迹分组与可视化问题解决方案

一、修正flexmix代码:适配序数变量+正确绘制拟合轨迹

你的核心问题有两个:一是用了默认的线性模型拟合序数变量Y(1-5),导致分组逻辑不符合数据特性;二是绘图用原始数据的均值变化,没有展示模型拟合的分组轨迹,所以效果不佳。以下是修正后的代码:

library(dplyr)
library(flexmix)
library(ggplot2)
library(ordinal)

# 读取数据(替换为你的数据文件路径)
data <- read.csv("your_data.csv")

# 拟合序数混合模型(适配Y的序数属性)
fit <- flexmix(Y ~ t + I(t^2) | ID, data = data, k = 3, 
               model = FLXMRclm()) # 用序数回归模型替代默认线性模型

# 为每个样本分配分组
data$group <- clusters(fit)

# 生成覆盖全时间范围的序列,用于预测轨迹
t_seq <- seq(min(data$t), max(data$t), length.out = 100)

# 提取每个分组的模型,计算预测值(序数变量的期望)
group_preds <- lapply(1:3, function(g) {
  model <- getModel(fit, g)
  pred_data <- data.frame(t = t_seq)
  pred_data$group <- g
  # 预测各Y值的概率,计算期望作为轨迹代表值
  prob_preds <- predict(model, newdata = pred_data, type = "prob")
  pred_data$pred_Y <- rowSums(prob_preds * 1:5)
  pred_data
}) %>% bind_rows()

# 绘制轨迹图:原始数据点+拟合轨迹
ggplot() +
  geom_point(data = data, aes(x = t, y = Y, color = as.factor(group)), alpha = 0.3) +
  geom_line(data = group_preds, aes(x = t, y = pred_Y, color = as.factor(group)), linewidth = 1) +
  labs(title = "Y的分组轨迹拟合",
       x = "距首次记录的月数",
       y = "Y的预测期望",
       color = "分组") +
  theme_minimal()

二、更适合新手的轨迹分组工具推荐

如果你觉得flexmix的语法太复杂,推荐两个专门做轨迹分组的工具,更贴合你的需求:

1. traj包(入门首选)

专门针对纵向数据的轨迹分析,支持序数变量,操作简单,自带绘图功能。需要先把长格式数据转成宽格式:

library(traj)
library(tidyr)

# 长转宽:每个ID一行,列对应不同时间点的Y值
wide_data <- data %>% 
  pivot_wider(id_cols = ID, names_from = t, values_from = Y)

# 运行序数轨迹分组(指定nclusters为你想要的组数)
traj_fit <- traj(wide_data[, -1], model = "ORD", nclusters = 3)

# 直接绘制轨迹图
plot(traj_fit)

2. lcmm包(功能进阶)

适合复杂纵向数据的潜类别混合模型,支持序数、连续等多种结局变量,能处理时间点不一致的情况,结果更严谨。

三、补充说明

  • 你之前尝试的gbmt是梯度提升树,这类工具更适合预测或变量筛选,不适合轨迹分组这类“找相似模式”的任务;
  • 选择组数k时,可以通过flexmix的logLik或者traj包的模型诊断指标(如BIC)来确定最优组数,不要直接指定3。

内容的提问来源于stack exchange,提问作者Tasosmav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:37:02