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
相关产品推荐
相关产品推荐

