首页 > 解决方案 > R - 如何从“扩展”矩阵中获取每列的系数〜时间线?

问题描述

我想收集每一列的线性回归系数~ ind。

这是我的数据:

temp <- data.frame(
  ind = c(1:10),
  `9891` = runif(10, 15, 75),
  `7891` = runif(10, 15, 75),
  `5891` = runif(10, 15, 75)
)

我试过

result = data.frame()

cols <- colnames(temp)[-1]

for (code in cols) {
  fit <- lm(temp[, code] ~ temp$ind)
  coef <- coef(fit)['ind']
  result$ind <- code
  result$coef <- coef
}

但这不起作用。

任何人都可以修复我的方法,或提供更好的解决方案吗?另外,我想知道是否lapply()并且summarise_at()可以完成这项工作。

谢谢!

标签: rloopslinear-regression

解决方案


这是一个summarise_at选项

temp %>%
    summarise_at(vars(-contains("ind")), list(coef = ~list(lm(. ~ ind)$coef))) %>%
    unnest()
#  X9891_coef X7891_coef X5891_coef
#1  25.927946 52.5668120  35.152330
#2   2.459137  0.3158741   1.013678

第一行给出偏移量,第二行给出斜率系数。

或者只提取斜率系数并将结果存储在一个长data.frame

temp %>%
    summarise_at(vars(-contains("ind")), list(coef = ~list(lm(. ~ ind)$coef[2]))) %>%
    unnest() %>%
    stack() %>%
    setNames(c("slope", "column"))
#        slope     column
#  1 2.4591375 X9891_coef
#  2 0.3158741 X7891_coef
#  3 1.0136783 X5891_coef

PS。在处理随机数据以确保结果的可重复性时,最好包含一个固定的随机种子。


样本数据

set.seed(2018)
temp <- data.frame(
  ind = c(1:10),
  `9891` = runif(10, 15, 75),
  `7891` = runif(10, 15, 75),
  `5891` = runif(10, 15, 75)
)

推荐阅读