纵向个体轨迹图

下载 R / Python 代码与数据(710 KB)

按受试者与真实时间连接多次测量,展示个体变化。

图与代码

code/R/main.R
suppressPackageStartupMessages(library(ggplot2))
dir.create("outputs", showWarnings=FALSE)
d <- read.csv("data/input.csv", check.names=FALSE)
stopifnot(!anyDuplicated(d[c("subject","time")]))
d <- d[order(d$subject,d$time),]
stats <- data.frame(key=c("subjects","observations","time_min","time_max"),value=c(length(unique(d$subject)),nrow(d),min(d$time),max(d$time)))
p <- ggplot(d,aes(time,value,group=subject,colour=group))+geom_line(alpha=.6)+geom_point(size=1.2)+theme_classic()+labs(x="Time",y="Measurement",colour="Group",title="Individual longitudinal trajectories")

stats <- stats[order(stats$key), ]
write.csv(stats, "outputs/stats_r.csv", row.names=FALSE)
nums <- lapply(seq_len(nrow(stats)), function(i) list(id=stats$key[i], value=stats$value[i], display=sprintf("%.6f", stats$value[i]), source=list(type="computed",locator="code/R/main.R")))
jsonlite::write_json(list(schema="zzy-media-studio/numbers/v1",asset=basename(normalizePath(".")),numbers=nums),"outputs/numbers.json",auto_unbox=TRUE,pretty=TRUE,digits=16)
ggsave("outputs/figure_r.png", p, width=7,height=4.8,dpi=120,bg="white")

code/py/main.py
from pathlib import Path
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scienceplots
plt.style.use(["science", "no-latex"])
Path("outputs").mkdir(exist_ok=True)
d=pd.read_csv("data/input.csv")
fig,ax=plt.subplots(figsize=(7,4.8))
assert not d.duplicated(["subject","time"]).any()
for _,s in d.sort_values("time").groupby("subject",sort=True):
 ax.plot(s.time,s.value,marker="o",markersize=2,alpha=.6,color={"Control":"#176597","Treatment":"#db7d35"}[s.group.iloc[0]])
for label,color in [("Control","#176597"),("Treatment","#db7d35")]: ax.plot([],[],color=color,label=label)
ax.legend(title="Group")
stats=[("subjects",d.subject.nunique()),("observations",len(d)),("time_min",d.time.min()),("time_max",d.time.max())]
ax.set(xlabel="Time",ylabel="Measurement",title="Individual longitudinal trajectories")

pd.DataFrame(stats,columns=["key","value"]).sort_values("key").to_csv("outputs/stats_py.csv",index=False)
fig.tight_layout()
fig.savefig("outputs/figure_py.png",dpi=120,facecolor="white")
plt.close(fig)

什么时候用

  • 观察同一受试者多时点测量的个体变化及组间轨迹差异

常见误用

  • 仅连接同一受试者的测量;时间间隔不等时不能按次序等距绘制
  • 模拟数据不代表临床结论

数据与下载

数据:固定随机种子的原创模拟数据(原创模拟数据 CC0-1.0)。共享CSV,模拟教学数据,不含真实患者或真实测序样本

下载 R / Python 代码与数据(710 KB)

下载包 sha256:42391f8c6366dd1db022ed4fe3dd1abc188130bca731b1cd46dd5313e372022d