R - как получить коэффициенты для каждого столбца ~ шкалы времени из "разбросанной" матрицы? - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу собрать коэффициенты линейной регрессии для каждого столбца ~ 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 ]

2 голосов
/ 12 апреля 2019

Вы можете использовать sapply

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)
)
2 голосов
/ 12 апреля 2019

Вот вариант 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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...