r - 使用 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)等?
解决方案
假设输入在最后的注释中可重现地显示,我们可以使用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"))
推荐阅读
- .htaccess - 如何使用 htaccess 阻止所有 .tk 域
- python - Python子进程外壳'while循环'
- c - 如何在 Contiki OS 的运行时执行不同的二进制文件?
- flutter - 如何在从另一个 Cupertino Picker 调用 onSelectedItemChanged() 时更新/刷新 CupertinoPicker 列表数据
- javascript - 替换子字符串,除非在预定义的多字符分隔符内
- python - 如何在 django 的 python 脚本中接收表单输入?
- java - 如何从 JSP 中的会话对象中检索?
- ffmpeg - ffmpeg 流被 youtube 拒绝,因为它太慢了
- google-sheets - 将导入的数据与 Google 工作表中的手动输入数据对齐
- javascript - localhost 中的 Socket io、mssql、node、expressjs 无法将数据附加到客户端