我有一个由 3 个变量组成的数据集,一个 ID、变量 Y 和时间变量 t。
它是长格式,每个主题有几行注册,序数变量 Y (1-5) 和注册时间,第一次注册为 0,其余为自第一次注册以来的月份。每个科目的时间点都不同。
我想根据 Y 在 t 上的相似轨迹对受试者进行分组。
我尝试过 gbmt 包,但结果似乎毫无意义。我现在正在尝试 flexmix 包,但我不知道如何绘制轨迹。
我在统计、R 和编程方面都是新手,所以欢迎任何帮助。如果 Flexmix 不适合这个,我愿意接受其他软件包。
这是一个具有相同结构的小数据样本:https://wetransfer.com/downloads/6528f6249eaf6cc2e488193c58aed84b20231208151530/e90fa7
这是小数据集的代码。
library(dplyr)
library(flexmix)
library(ggplot2)
#fit model
fit <- flexmix(Y ~ t+I(t^2) | ID, data = data, k = 3)
summary(fit)
clusters(fit)
#add groups in dataset
data$group <- clusters(fit)
#add the change of Y
data <- data %>%
group_by(ID) %>%
mutate(change_Y = Y - first(Y))
# Calculate mean change in Y for each group at each time point
mean_change_data <- data %>%
group_by(group, t) %>%
summarise(mean_change_Y = mean(change_Y, na.rm = TRUE))
# Plot the mean change in Y for each group over t
ggplot(mean_change_data, aes(x = t, y = mean_change_Y, group = group, color = as.factor(group))) +
stat_smooth(method = "loess", se = TRUE, alpha = 0.2) +
labs(title = "Mean Change in Y Over Time",
x = "t",
y = "Mean Change in Y") +
scale_color_discrete(name = "Group")
这是结果图:
flexmix
是回归包,gbmt用于轨迹分析。我不是说这两个包的特殊性,但通常你可以使用最常见的包进行分析。
编辑:我可以在这里看到几个问题。 1)首先用原始“数据”拟合模型,然后使用基线和平均“Y”修改数据(为什么需要这样做?)。这显然使得现有模型无法再预测数据。 2)要绘制适合原始数据的模型,请尝试下面的代码(删除了“stat_smooth”,因为它根本不相关(这是另一个基本模型)。
ggplot(data, aes(x=t,y=Y))+
geom_point()+
geom_point(aes(col = as.factor(model@cluster))) +
geom_abline(data = as.data.frame(t(parameters(model))), aes(intercept = `coef.(Intercept)`, slope = `coef.Time`, col = as.factor(seq_along(sigma))) )
不过,您应该首先标准化您的轨迹,这意味着时间 t 之间的间隔一致(定义一个,例如 1 秒)。您可以使用
complete()
包中的 dplyr
来标准化时间 t,并使用 na.approx()
包中的 zoo
来为每个组 - 'ID' 插入坐标 Y。
data %<>% group_by(ID)%>%
dplyr::complete(t = seq(min(t), max(t), by = 1)) %>%
mutate(Y = zoo::na.approx(Y))
您可以选择通过将较短轨迹的最后一个坐标延伸到最长轨迹来对齐所有轨迹。然后你可以总结计算常见的指标,如总长度、持续时间、速度等..
您的情况似乎不需要有限混合模型,您可以使用
glmer()
或 glm()
包中的 lme4
进行多项式回归,这是一个更流行的包,具有丰富的支持。检查这本书的方法https://www.researchgate.net/publication/290152385_Growth_Curve_Analysis_and_Visualization_Using_R