如何在纵向数据中找到分组(轨迹)?

机器算法验证 聚类 面板数据
2022-03-21 06:13:24

语境

在对这个问题进行一些扩展之前,我想先设置一下场景。

我有纵向数据,大约每 3 个月对受试者进行一次测量,主要结果是 5 到 14 范围内的数字(如连续到 1dp),大部分(所有数据点)在 7 到 10 之间。如果我做意大利面条图(x 轴上有年龄,每个人都有一条线)这显然是一团糟,因为我有超过 1500 名受试者,但随着年龄的增长,显然会朝着更高的值迈进(这是已知的)。

更广泛的问题:我们想做的是首先能够识别趋势组(那些开始高并保持高位,那些开始低并保持低位,那些开始低并增加到高位等)然后我们可以查看与“趋势组”成员相关的个人因素。

我在这里的问题特别与第一部分有关,即按趋势分组。

问题

  • 我们如何对单个纵向轨迹进行分组?
  • 什么软件适合实现这一点?

我看过一位同事建议的 SAS 和 M-Plus 中的 Proc Traj,我正在研究,但想知道其他人对此有何看法。

2个回答

我使用R中的Mfuzz时间进程微阵列数据集进行聚类。Mfuzz 使用“软聚类”。基本上,个人可以出现在多个组中。

正如@Andy 在评论中指出的那样,原始论文使用 CTN 数据。但是,我怀疑它应该适用于您的离散数据。特别是因为您只是在探索数据集。这是 R 中的一个简单示例:

##It's a bioconductor package
library(Mfuzz)
library(Biobase)

## Simulate some data
## 6 time points and 90 individuals
tps = 6;cases = 90
d = rpois(tps*cases, 1)  ##Poisson distribution with mean 1
m = matrix(d, ncol=tps, nrow=cases)

##First 30 individuals have increasing trends
m[1:30,] = t(apply(m[1:30,], 1, cumsum))

##Next 30 have decreasing trends
##A bit hacky, sorry
m[31:60,] = t(apply(t(apply(m[31:60,], 1, cumsum)), 1, rev))

##Last 30 individuals have random numbers from a Po(1)

##Create an expressionSet object
tmp_expr = new('ExpressionSet', exprs=m)

##Specify c=3 clusters
cl = mfuzz(tmp_expr, c=3, m=1.25)
mfuzz.plot(tmp_expr,cl=cl, mfrow=c(2, 2))

给出以下情节:

模糊聚类

我希望有一个 MPLUS 软件包可以满足您的需求。Psychometrika 上有一篇关于这个主题的论文

springerlink.com/content/25r110007g417187

除了数据是二进制的并且轨迹是概率轨迹。作者使用潜在类别分析(通过使用惩罚有限混合模型实现)对轨迹进行分组。我还知道第一作者大约 10 年前与 Bengt Muthen(MPLUS 的创建者)写了一些其他关于类似设置(带有轨迹)下的潜在类分析的论文。例如,

http://onlinelibrary.wiley.com/doi/10.1111/j.0006-341X.1999.00463.x/abstract

听起来与您所说的非常相似,只是结果是二进制的。连续案例要简单得多,所以我会进行向后的文献搜索(即查看这些论文参考的论文)以找到与您更准确地描述的内容相匹配的内容。

要了解更多信息,您可以直接询问 MPLUS 的所有者,您需要使用什么软件包来做您需要的事情。他们通常会很快做出反应并且非常有帮助:

http://www.statmodel.com/cgi-bin/discus/discus.cgi