计算每个个体的斜率

Sey*_*ORO 1 r

我有一个纵向数据

ID<-c(1,1,1,2,2,2,2,3,3,4,4,4)
time<-c(0,12,36,0,7,23,68,0,23,0,32,45)
Age<-rnorm(12,45,9)
Sexe<-c("F","F","F","M","M","M","M","M","M","F","F","F")
biology1<-rnorm(12,12,3)
biology2<-rnorm (12,100,20)
biology3<-rnorm(12,45,9)
biology4<-rnorm(12,20,2)
Death<-c(0,0,1,0,0,0,0,0,0,0,0,1)
data<-data.frame(ID,time,Age,Sexe,biology1,biology2,biology3,biology4,Death)
Run Code Online (Sandbox Code Playgroud)

我想计算每个数值变量(biology1,biology2,biology3,biology4)和每个个体的斜率(从后续开始到结束);主要是一个计算每个变量斜率的函数,而无需为每个变量重新输入新的代码行。我不知道该怎么做。

Ian*_*ell 5

这是一种方法dplyr。以下是技巧:

  1. 使用group_by对每个人的数据进行分组。
  2. 使用summarise为每个组执行一项操作。
  3. 使用across对多列执行此操作
  4. 使用starts_with选择适当的列
  5. 使用list(slope = ...)命名列。
  6. 用于$coef提取系数并[2]获取斜率而不是截距。
library(dplyr)
data %>% 
   group_by(ID) %>%
   summarise(across(starts_with("biology"),
                    list(slope = ~lm(. ~ time)$coef[2])))
# A tibble: 4 x 5
     ID biology1_slope biology2_slope biology3_slope biology4_slope
  <dbl>          <dbl>          <dbl>          <dbl>          <dbl>
1     1        -0.0459         -1.61         -0.204        -0.00106
2     2         0.131          -0.553         0.0783       -0.0340 
3     3        -0.0462         -0.427        -0.402        -0.191  
4     4        -0.0524         -1.10          0.379        -0.0736 
Run Code Online (Sandbox Code Playgroud)