我正在使用包含汽车价格,品牌,里程等的数据集。
我想通过运行我的回归2000次,并通过为每次回归抽样300次观察,将我的分布系数用于我的自变量(里程数)与价格的回归。
以下是我回归的模型:
model <- lm(price ~ mileage, data = dat)
我试过
for (i in 1:2000) model300 <- sample(model[i], size=300)
它不起作用。我收到以下错误消息:
sample.int中的错误(长度(x),大小,替换,概率):不能采取
当'replace = FALSE'时,大于人口的样本
我试图在此论坛上引用之前的answer,但我不确定它是否适用于我的问题。
我很感激任何指示。
答案 0 :(得分:3)
您希望从拟合的线性模型对象中获取什么?
sample(model[i], size=300)
我们想从数据中抽样并重新设计模型。即,通过执行2000次,我们对数据进行2000次采样并拟合2000次回归模型。
从数据中抽样是关键。通过在subset
中使用lm
参数,这将是一种很有前途的方法。对于需要多次复制过程的任何问题,首先编写一次执行此类实验的函数会很方便。
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()
结束平面矩阵;为了更好的可读性,我使用cars
转换它来获得一个长矩阵。
在下文中,我使用R的内置数据集f <- function () {
fit <- lm(dist ~ speed, data = cars, subset = sample(nrow(cars), 30))
coef(fit)
}
作为示例。该数据集有50个观测值,因此我们无法在没有替换的情况下对其进行300次采样。我将取样30。
set.seed
运行一次给出系数向量。 set.seed(0); f()
#(Intercept) speed
# -22.69112 4.18617
部分仅用于再现性。
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
通过复制这个,比如50次,我们得到一个矩阵:
par(mfrow = c(1,2))
hist(z[,1], main = "intercept")
hist(z[,2], main = "slope")
可以通过直方图粗略评估系数的分布:
id, name
结果看起来粗糙,因为我没有做很多重复。