每次使用随机数据子集复制回归并检查回归系数的分布?
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")
结果看起来很粗糙,因为我没有做很多复制。
我正在处理一个包含汽车价格、品牌、里程等的数据集
我想要我的自变量(里程)对价格的回归的分布系数 运行 我的回归 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")
结果看起来很粗糙,因为我没有做很多复制。