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

R语言长格式数据按ID每2行执行简单线性回归提取beta值

R语言重复测量数据相邻行回归系数计算解决方案

之前代码的错误原因

  • 调用lm()时默认使用当前ID分组的全部观测拟合回归,得到的是整个受试者的整体斜率,不是相邻两次测量的斜率
  • 代码中使用的measurement_count变量在示例数据中不存在,对应测量次序列的实际名称为ct_count,变量名错误也会导致逻辑不符合预期
  • 两点的简单线性回归系数本质就是(y2-y1)/(x2-x1),不需要调用lm()拟合,直接计算差分比值效率更高、结果更直观

最优实现方案(直接计算斜率)

library(dplyr)

mydata <- mydata %>%
  group_by(ID) %>%
  # 按测量顺序排序,确保相邻行是先后测量的记录,避免原始数据顺序混乱导致结果错误
  arrange(ct_count, .by_group = TRUE) %>%
  mutate(
    # 相邻两次测量的回归斜率 = 结局差值/年龄差值
    # beta值保存在两次测量的前一行,每组最后一行无下一次测量,返回NA
    beta = (lead(continuous_outcome) - continuous_outcome) / (lead(age) - age)
  ) %>%
  ungroup()

结果验证

以ID=2的前两行记录为例,计算结果为(544.1-1636.4)/(57.1-56.6) = -2184.6,和手动计算逻辑一致(注意原手动计算时漏了负号)。

若需要调用lm拟合的实现方案

如果场景需要保留lm拟合的完整逻辑(比如后续要提取p值等其他统计量),可以用滑动窗口函数实现:

library(dplyr)
library(slider)

mydata <- mydata %>%
  group_by(ID) %>%
  arrange(ct_count, .by_group = TRUE) %>%
  mutate(
    # 滑动窗口取相邻2行拟合回归,提取age的回归系数
    beta = slide_dbl(
      .x = cur_data(),
      .f = ~ lm(continuous_outcome ~ age, data = .x)$coefficients[["age"]],
      .before = 1,
      .complete = TRUE
    )
  ) %>%
  ungroup()

该方案得到的beta值和直接计算差分的结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:09:03