首页 > 解决方案 > 使用 lm() 进行长格式和宽格式的线性回归

问题描述

我有长格式的数据,每行一个观察值。数据是在 4 个时间段内收集的,时间段存储在阶段变量中:基线、预资助、后资助、结果。

我想在每个时间段内使用 lm() 对机构的posemo进行线性回归,例如:

lm(posemo_baseline ~ agency_baseline, data = x)
lm(posemo_prefunded ~ agency_prefunded, data = x)
etc...

我是否应该使用 reshaper 或 spread() 将其转换为具有新列的宽格式,用于posemo_baseline、posemo_prefunded、posemo_postfunded、posemo_consequent、agency_baseline 等...以便使用lm()?还是有更好的方法将其输入 lm()?

这是我当前的数据结构:

# A tibble: 8 x 4
  name      stage       posemo  agency
  <chr>       <fct>       <dbl>  <dbl>
1 a         prefunded    3.12   3.11
2 b         prefunded    3.07   2.23
3 b         consequent   3.28   3.84
4 b         postfunded   2.04   2.36
5 a         baseline     3.62   4.28
6 a         consequent   3.31   3.77
7 a         postfunded   3.5    4.54
8 b         baseline     2.84   4.11

预期的输出将是在列中转换 DF:

name, posemo_baseline, posemo_prefunded, posemo_postfunded, posemo_consequent, agency_baseline, agency_prefunded, agency_postfunded, agency_consequent

然后我会为机构和posemo的四个阶段中的每一个运行lm,例如,lm(posemo_baseline~agency_baseline,data = x),lm(posemo_prefunded~agency_prefunded,data = x)等?

标签: rstatistics

解决方案


假设输入在最后的注释中可重现地显示,我们可以使用subset=参数 oflm来挑选不同的子集以使用给出 lm 对象的列表,每个级别一个stage

Map(function(lv) lm(posemo ~ agency, DF, subset = stage == lv), levels(DF$stage))

当然,每次运行只有两个点,我们将无法估计 sigma,但如果这里显示的数据只是实际数据的一个子集,我们应该能够做到这一点。

如果重点是系数,那么我们可以只运行一个嵌套在阶段内的 lm(但请注意,这将使用一个合并的 sigma 而不是每个单独的 sigma——尽管系数是相同的)。

lm(posemo ~ stage/(1 + agency) - 1, DF)

我们还可以将 nlme 与 pool = TRUE 或 pool = FALSE 一起使用,具体取决于我们是否要计算池化 sigma。

library(nlme)
lmList(posemo ~ agency | stage, DF, pool = FALSE)

笔记

Lines <- "  name      stage       posemo  agency
1 a         prefunded    3.12   3.11
2 b         prefunded    3.07   2.23
3 b         consequent   3.28   3.84
4 b         postfunded   2.04   2.36
5 a         baseline     3.62   4.28
6 a         consequent   3.31   3.77
7 a         postfunded   3.5    4.54
8 b         baseline     2.84   4.11"
DF <- read.table(text = Lines, colClasses = list(name = "character"))

推荐阅读