R-如何从“传播”矩阵中获取每一列〜时间轴的系数?

时间:2019-04-12 04:10:26

标签: r loops linear-regression

我想收集每一列〜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()是否可以完成这项工作。

谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个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)
)

答案 1 :(得分:2)

您可以使用sapply(temp[-1], function(x) coef(lm(x ~ temp$ind))[2]) #X9891.temp$ind X7891.temp$ind X5891.temp$ind # -0.01252979 -2.94773367 2.57816244

data.frame(ind = names(temp)[-1], 
 coef = sapply(temp[-1], function(x) coef(lm(x ~ temp$ind))[2]), row.names = NULL)

#      ind        coef
#1   X9891 -0.01252979
#2   X7891 -2.94773367
#3   X5891  2.57816244 

要获得最终的数据帧,您可以

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

其中每一行代表该列中的值。

数据

{{1}}