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

Kaplan-Meier分析适配:将0-7生存变量转为1并复制对应数据

解决Kaplan-Meier分析的幼苗生存数据转换问题

数据转换核心思路

你的原始数据中,每行代表一个生境亚区在某时间点的存活幼苗数量(0-7)。要适配Kaplan-Meier分析的0/1型生存状态需求,需将每个存活幼苗拆分为单独的行记录,同时保留对应时间和生境信息;若要完整分析所有7棵橡子的生存轨迹,还需补充死亡个体的记录。

步骤1:构建原始数据框

先将你提供的向量整合成结构化数据框:

# 创建原始数据集
df <- data.frame(
  surva = c(5,0,3, 2,0,0, 0,1,2, 3,0,1),
  time = c(1,2,3, 1,2,3, 1,2,3, 1,2,3),
  habitat = c("grassa", "grassb", "grassc", "grassa", "grassb", "grassc", 
              "grassa", "grassb", "grassc", "grassa", "grassb", "grassc")
)

步骤2:转换为存活个体的单行记录

使用tidyr包的uncount函数,按存活数量重复对应行,并添加存活状态标记(status=1代表存活):

# 首次使用需先安装tidyr包:install.packages("tidyr")
library(tidyr)

# 拆分存活个体为独立行记录
km_alive_data <- df %>%
  uncount(surva) %>%  # 按surva数值重复行,自动移除原surva列
  mutate(status = 1)  # 标记存活状态

步骤3:(可选)构建包含所有个体的完整数据集

Kaplan-Meier分析通常需要所有研究对象的结局信息(存活/死亡),因此可以补充死亡个体的记录(每个亚区死亡数=7-存活数):

# 生成包含存活和死亡个体的完整数据集
df_full <- df %>%
  mutate(
    alive = surva,
    dead = 7 - surva  # 计算每个亚区的死亡幼苗数量
  ) %>%
  # 将存活/死亡数转换为长格式
  pivot_longer(cols = c(alive, dead), names_to = "outcome", values_to = "count") %>%
  # 按数量拆分行为个体记录
  uncount(count) %>%
  # 标记生存状态:1=存活(删失),0=死亡
  mutate(status = ifelse(outcome == "alive", 1, 0)) %>%
  # 移除冗余列
  select(-outcome, -surva)

步骤4:执行Kaplan-Meier分析

使用survival包拟合模型并可视化:

# 首次使用需先安装survival包:install.packages("survival")
library(survival)

# 拟合Kaplan-Meier模型,按生境分组
km_fit <- survfit(Surv(time, status) ~ habitat, data = df_full)

# 查看模型详细结果
summary(km_fit)

# 绘制生存曲线
plot(km_fit, lty = 1:3, col = 1:3, 
     xlab = "观测时间", ylab = "生存概率")
legend("bottomleft", legend = unique(df_full$habitat), 
       lty = 1:3, col = 1:3, title = "生境类型")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:45:19