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

时间:2016-10-24 04:43:25

标签: r regression linear-regression lm

我正在使用包含汽车价格,品牌,里程等的数据集。

我想通过运行我的回归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,但我不确定它是否适用于我的问题。

我很感激任何指示。

1 个答案:

答案 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基于sapplycbind()始终以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

enter image description here

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