加快置信区间的复制
Speed up replications of confidence intervals
我多次尝试根据回归模型 运行 的系数加快置信区间的计算速度。我想知道是否有办法提高性能。这是接近我想要实现的代码。 运行 这不会花太多时间,但我有一个更大的数据集,已经 运行 将近一天了还没有得到结果。
#Sample some cases and run regression model
regfun <- function(x=mtcars) {
take.smp <- sample(nrow(x),10,replace=TRUE)
smp <- x[unlist(take.smp),]
mod <- lm(smp[[1]]~ smp[[2]] + smp[[3]] + smp[[4]])
coef(mod)
}
#Repeat the regression model to get more coefficients
repcoef <- function() t(replicate(2000, regfun()))
#Generate more replications based on the repeated coefficient function
#to get reliable confidence intervals
repci <- replicate(1000,t(apply(repcoef(), 2, quantile, probs=c(.025,.975), na.rm=TRUE)))
这样使用lm.fit
代替lm
:
regfun2 <- function(x = mtcars) {
take.smp <- sample(1:length(x), 10, replace=TRUE)
smp <- x[unlist(take.smp), ] # NB: `unlist` is not necessary
mod <- lm.fit(model.matrix(~ smp[[2]] + smp[[3]] + smp[[4]]), smp[[1]])
mod$coefficients
}
这个更快:
library(microbenchmark)
microbenchmark(
lm = regfun(),
lm.fit = regfun2(),
times = 100
)
Unit: microseconds
expr min lq mean median uq max neval cld
lm 1323.168 1412.1260 1750.011 1668.2765 1916.277 2946.757 100 b
lm.fit 786.764 855.1195 1030.725 948.5295 1112.704 1914.135 100 a
我多次尝试根据回归模型 运行 的系数加快置信区间的计算速度。我想知道是否有办法提高性能。这是接近我想要实现的代码。 运行 这不会花太多时间,但我有一个更大的数据集,已经 运行 将近一天了还没有得到结果。
#Sample some cases and run regression model
regfun <- function(x=mtcars) {
take.smp <- sample(nrow(x),10,replace=TRUE)
smp <- x[unlist(take.smp),]
mod <- lm(smp[[1]]~ smp[[2]] + smp[[3]] + smp[[4]])
coef(mod)
}
#Repeat the regression model to get more coefficients
repcoef <- function() t(replicate(2000, regfun()))
#Generate more replications based on the repeated coefficient function
#to get reliable confidence intervals
repci <- replicate(1000,t(apply(repcoef(), 2, quantile, probs=c(.025,.975), na.rm=TRUE)))
这样使用lm.fit
代替lm
:
regfun2 <- function(x = mtcars) {
take.smp <- sample(1:length(x), 10, replace=TRUE)
smp <- x[unlist(take.smp), ] # NB: `unlist` is not necessary
mod <- lm.fit(model.matrix(~ smp[[2]] + smp[[3]] + smp[[4]]), smp[[1]])
mod$coefficients
}
这个更快:
library(microbenchmark)
microbenchmark(
lm = regfun(),
lm.fit = regfun2(),
times = 100
)
Unit: microseconds
expr min lq mean median uq max neval cld
lm 1323.168 1412.1260 1750.011 1668.2765 1916.277 2946.757 100 b
lm.fit 786.764 855.1195 1030.725 948.5295 1112.704 1914.135 100 a