我想用 Mathematica 生成的输出中的 pgfplots 绘制 Kaplan-Meier(生存)曲线。
典型的输出表看起来如下所示:
211 1
253 1
307 1
344 0
365 0
365 1
383 0
383 1
391 0...
第一列包含事件日期;第二列是审查数据。
是否有一个软件包或内置的方法来绘制最终的生存曲线,包括审查标记?
答案1
这可以在 PGFPlots 中使用几个列定义来实现。
假设您有以下数据表(取自德语维基百科上的示例) 位于名为的文件中data.txt
:
Days Event
10 0
12 1
22 0
29 1
31 1
36 0
38 0
50 0
60 0
61 1
70 1
88 0
99 0
110 0
140 0
您可以使用以下方式读取数据
\pgfplotstableread{data.txt}\rawdata
然后,您可以添加虚拟数据行以确保绘图从以下位置开始t=0
:
\pgfplotstableread{
Days Event
0 1
}\datatable
\pgfplotstablevertcat{\datatable}{\rawdata}
利用这个,你可以计算出幸存者的数量减去被审查的案例,然后使用以下公式计算出生存率:
\def\initialn{15} % Initial number of cases
\pgfplotstablecreatecol[expr accum={\pgfmathaccuma-1}{\initialn+2}]{n}{\datatable}
\pgfplotstablecreatecol[expr accum={\pgfmathaccuma*(\thisrow{n}-\thisrow{Event})/(\thisrow{n})}{(\initialn+1)/\initialn}]{s}{\datatable}
然后可以将其绘制成如下图所示:
\begin{tikzpicture}
\begin{axis}[xmin=0, ymin=0]
\addplot [no markers, const plot, red] table [y=s] {\datatable};
\addplot [only marks, mark=+] table [y expr={(\thisrow{Event}==0 ? \thisrow{s} : inf )}] {\datatable};
\end{axis}
\end{tikzpicture}
完整示例:
\documentclass[11pt,a4paper]{article}
\usepackage{pgfplots, pgfplotstable, filecontents}
\begin{filecontents*}{data.txt}
Days Event
10 0
12 1
22 0
29 1
31 1
36 0
38 0
50 0
60 0
61 1
70 1
88 0
99 0
110 0
140 0
\end{filecontents*}
\begin{document}
\pgfplotstableread{data.txt}\rawdata
\pgfplotstableread{
Days Event
0 1
}\datatable
\pgfplotstablevertcat{\datatable}{\rawdata}
\def\initialn{15}
\pgfplotstablecreatecol[expr accum={\pgfmathaccuma-1}{\initialn+2}]{n}{\datatable}
\pgfplotstablecreatecol[expr accum={\pgfmathaccuma*(\thisrow{n}-\thisrow{Event})/(\thisrow{n})}{(\initialn+1)/\initialn}]{s}{\datatable}
\pgfplotstabletypeset{\datatable}
\begin{tikzpicture}
\begin{axis}[xmin=0, ymin=0]
\addplot [no markers, const plot, red] table [y=s] {\datatable};
\addplot [only marks, mark=+] table [y expr={(\thisrow{Event}==0 ? \thisrow{s} : inf )}] {\datatable};
\end{axis}
\end{tikzpicture}
\end{document}