R语言使用lm()对宽/长(tidy)格式数据拟合相同线性模型的方法
解决方法
核心原因是你当前的长格式中,同一患者的base值和fev1值分属不同行,而线性回归要求每个样本的自变量、因变量处于同一行,对齐两类值即可得到和宽格式完全一致的拟合结果,以下是两种常用实现方案:
方案1:新增基线值列后拟合
无需修改原始长表结构,仅为每个患者匹配对应的基线值到所有行,再筛选fev1时间点拟合即可:
library(tidyverse) # 为每个患者新增专属基线值列 fev_tidy <- fev_tidy %>% group_by(patient) %>% mutate(base_score = score[time == "base"]) %>% ungroup() # 筛选fev1时间点的行拟合模型 fit.base_long <- lm(score ~ 1 + base_score, data = filter(fev_tidy, time == "fev1"))
拟合完成后对比coef(fit.base)和coef(fit.base_long),二者的系数、显著性、拟合优度所有指标完全一致。
方案2:局部转回宽格式拟合
如果不需要修改原始长表,也可以仅提取需要的两个时间点,临时转回宽格式后拟合:
fit.base_long2 <- fev_tidy %>% # 仅保留需要的base和fev1两个时间点 filter(time %in% c("base", "fev1")) %>% # 转为宽格式,base和fev1各成一列 pivot_wider(names_from = time, values_from = score) %>% lm(fev1 ~ 1 + base, data = .)
该方案得到的结果和宽格式原始拟合结果也完全相同。
内容的提问来源于stack exchange,提问作者mattb
相关产品推荐
相关产品推荐

