计算R中每个受试者ID的斜率

xwmevbvl  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(92)

我有一个类似这样的df:

ID   Block   LogB
705   1      0.133
705   2      0.678
705   3      0.987
707   1      0.133
707   2      0.678
707   3      0.987

我想计算每个ID号的块1、2和3的斜率,以评估LogB性能如何随时间变化,即块。我认为我需要的一般格式是:
lm(x ~ y, data = df)
但是,如何正确地合并分组元素?
我看到了这篇文章:Calculate the slope for each individual
但不幸的是,我不知道如何修改它以满足我的需要。我只是在找每个ID对应的一个斜率列。
感谢您的评分

eh57zj3b

eh57zj3b1#

对于稍大的数据集(可能是不同的特征类型),它可能看起来像这样:

str(iris)
#> 'data.frame':    150 obs. of  5 variables:
#>  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#>  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#>  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#>  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#>  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

# split iris dataset by Species, 
# apply lm() on every subset and 
# exact single coefficient from each model.
iris |>
  split(~ Species) |>
  lapply(\(df) lm(Petal.Length ~ Petal.Width, data = df)$coefficients["Petal.Width"])
#> $setosa
#> Petal.Width 
#>   0.5464903 
#> 
#> $versicolor
#> Petal.Width 
#>    1.869325 
#> 
#> $virginica
#> Petal.Width 
#>   0.6472593

创建于2023-05-12带有reprex v2.0.2

8zzbczxx

8zzbczxx2#

你可以用lme4::lmList()来实现。(或nlme::lmList(); nlme是默认安装的,所以你不需要添加任何新的软件包。lme4::lmList()nlme中的版本 * 稍微 * 更健壮,但在大多数情况下,您不会看到任何差异。

library(lme4)
m <- lmList(Petal.Length ~ Petal.Width | Species, data = iris)
coef(m)[, "Petal.Width"]

或者

## 0 suppresses intercept (i.e., separate intercepts for
##  each species rather than baseline intercept + contrasts)
## `:` denotes interaction
m2 <- lm(Petal.Length ~ 0 + Species + Petal.Width:Species,
           data = iris))
c2 <- coef(m2)
c2[grepl(":", names(c2))]  ## select slope coefficients

这两个模型略有不同:第一种方法拟合三个完全独立的模型,第二种方法假设所有组具有相同的残差方差。

相关问题