您希望从拟合的线性模型对象中采样得到什么?
sample(model[i], size=300)
我们想从数据中采样并重新拟合模型。即,通过执行 2000 次,我们对数据进行 2000 次采样并拟合 2000 个回归模型。
从数据中采样是关键。通过在lm 中使用subset 参数,这将是一个很有前途的方法。对于任何需要多次复制一个过程的问题,先写一个函数做一次这样的实验会很方便。
f <- function () {
fit <- lm(price ~ mileage, data = dat, subset = sample(nrow(dat), 300))
coef(fit)
}
现在,我们使用replicate 重复这个 2000 次以获得一个矩阵:
z <- t(replicate(2000, f()))
replicate 基于sapply 总是cbind() 你最终得到一个平面矩阵;为了更好的可读性,我使用t() 对其进行了转置以获得一个长矩阵。
下面我以R的内置数据集cars为例。该数据集有 50 个观测值,因此我们无法在不替换的情况下从中抽取 300 个样本。我将取样 30 个。
f <- function () {
fit <- lm(dist ~ speed, data = cars, subset = sample(nrow(cars), 30))
coef(fit)
}
运行一次给出系数向量。 set.seed 部分仅用于重现性。
set.seed(0); f()
#(Intercept) speed
# -22.69112 4.18617
通过复制这个,比如说 50 次,我们得到一个矩阵:
set.seed(0); z <- t(replicate(50, f()))
head(z) ## show first few rows
# (Intercept) speed
#[1,] -22.69112 4.186170
#[2,] -21.31613 4.317624
#[3,] -12.98734 3.454305
#[4,] -22.59920 4.274417
#[5,] -22.53475 4.584875
#[6,] -18.88185 4.104758
系数的分布可以通过直方图粗略评估:
par(mfrow = c(1,2))
hist(z[,1], main = "intercept")
hist(z[,2], main = "slope")
结果看起来很粗糙,因为我没有做很多复制。