Для полноты здесь также представлены база R и data.table решения.
База R
Одним из возможных базовых подходов R с использованием split()
и lapply()
был предложено Джого:
result <- lapply(split(DT, list(DT$region, DT$season, DT$year)),
lm, formula = response ~ altitud)
print(result)
$IT.wint.2013
Call:
FUN(formula = ..1, data = X[[i]])
Coefficients:
(Intercept) altitud
-140.0510 0.2306
$IT.wint.2014
Call:
FUN(formula = ..1, data = X[[i]])
Coefficients:
(Intercept) altitud
-484.3333 0.6667
Или, используя трубопровод для улучшения читаемости
library(magrittr)
result <- split(DT, list(DT$region, DT$season, DT$year)) %>%
lapply(lm, formula = response ~ altitud)
Таблица данных
С некоторой помощью broom
:
library(data.table)
library(magrittr)
setDT(DT)[, lm(response ~ altitud, .SD) %>% broom::tidy(), by = .(region, season, year)]
region season year term estimate std.error statistic p.value
1: IT wint 2013 (Intercept) -140.0510204 31.82553603 -4.400586 0.1422513
2: IT wint 2013 altitud 0.2306122 0.03888277 5.930962 0.1063382
3: IT wint 2014 (Intercept) -484.3333333 NaN NaN NaN
4: IT wint 2014 altitud 0.6666667 NaN NaN NaN
setDT(DT)[, lm(response ~ altitud, .SD) %>% broom::glance(), by = .(region, season, year)]
region season year r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual
1: IT wint 2013 0.9723576 0.9447152 1.111168 35.17631 0.1063382 2 -2.925132 11.85026 9.1461 1.234694 1
2: IT wint 2014 1.0000000 NaN NaN NaN NaN 2 Inf -Inf -Inf 0.000000 0
Если вычисление lm()
для разных групп занимает много времени, возможно, стоит сохранить результат и использовать его для последующих шагов обработки:
mod <- setDT(DT)[, .(model = .(lm(response ~ altitud, .SD))), by = .(region, season, year)]
mod
region season year models
1: IT wint 2013 <lm>
2: IT wint 2014 <lm>
mod$models
— это список моделей, эквивалентных result
.
Теперь мы можем извлечь нужную информацию из вычисленных моделей, например,
mod[, models[[1]] %>% broom::tidy(), by = .(region, season, year)]
region season year term estimate std.error statistic p.value
1: IT wint 2013 (Intercept) -140.0510204 31.82553603 -4.400586 0.1422513
2: IT wint 2013 altitud 0.2306122 0.03888277 5.930962 0.1063382
3: IT wint 2014 (Intercept) -484.3333333 NaN NaN NaN
4: IT wint 2014 altitud 0.6666667 NaN NaN NaN
Данные
library(data.table)
DT <- fread("
region season year altitud response
IT wint 2013 800 45
IT wint 2013 815 47
IT wint 2013 840 54
IT wint 2014 800 49
IT wint 2014 815 59")
10.02.2019
Y ~ X
для формул регрессии (в данном случаеresponse ~ altitud
). :) Вы можете прочитать документацию по функцииformula
для получения дополнительной информации. 06.02.2019