Вы можете значительно ускорить подгонку моделей, но медленная часть вычисляет итоги моделей.Очевидно, что «низко висящий фрукт» ограничивает количество звонков сводкой до одного звонка на модель.Возможно, вы захотите создать свою собственную функцию, которая вычисляет только интересующие вас значения, т. Е. P-значения для уклонов (см. там для расчета стандартных ошибок).Для коэффициентов вы можете просто использовать функцию coef
, которая является быстрой.
Вот подход, который подходит для моделей намного быстрее (но все еще использует summary
):
library(data.table)
n <- 1e5
set.seed(42)
DT <- data.table(x = 1:10, y = rnorm(n), g = rep(seq_len(n/10), each = 10))
#fit each model separately
system.time({
res <- DT[, .(pslope = summary(lm(y ~ x, data = .SD))$coefficients["x","Pr(>|t|)"]), by = g]
})
#user system elapsed
#5.89 0.01 6.02
#use the fact that the models have all the same design matrix
system.time({
DT1 <- dcast(DT, x ~ g, value.var = "y")
setnames(DT1, make.names(names(DT1)))
fit <- lm(as.formula(sprintf("cbind(%s) ~ x", paste(names(DT1)[-1], collapse = ","))), data = DT1)
pslope <- vapply(summary(fit), function(fitsum) fitsum$coefficients["x","Pr(>|t|)"], FUN.VALUE = 1.0)
})
#user system elapsed
#4.34 0.00 4.42
#same result
all.equal(unname(pslope), res[["pslope"]])
#[1] TRUE
#intercepts
coef(fit)[1,]
#slopes
coef(fit)[2,]