每次使用随机数据子集复制回归并检查回归系数的分布?

Replicate a regression using a random subset of data each time and check distribution of regression coefficients?

我正在处理一个包含汽车价格、品牌、里程等的数据集

我想要我的自变量(里程)对价格的回归的分布系数 运行 我的回归 2,000 次,并为每个回归抽样 300 个观察值。

下面是我的回归模型:

model <- lm(price ~ mileage, data = dat)

我试过了

    for (i in 1:2000) model300 <- sample(model[i], size=300)

没用。我收到以下错误消息:

Error in sample.int(length(x), size, replace, prob) : cannot take a

sample larger than the population when 'replace = FALSE'

我试图参考这个论坛上的一个以前的,但我不确定它是否适用于我的问题。

如有指点,我将不胜感激。

您期望从拟合线性模型对象中采样得到什么?

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")

结果看起来很粗糙,因为我没有做很多复制。