【问题标题】:simulating a simple linear model模拟一个简单的线性模型
【发布时间】:2023-03-08 15:39:01
【问题描述】:

我试图模拟一个简单的线性模型 100 次,并从线性模型中找到 B1 的 LS 估计。

set.seed(123498)
x<-rnorm(z, 0, 1)
e<-rnorm(z, 0 ,2)
y<-0.5 + 2*x + e
model<- lm(y~x)
simulaten=100
z=10

for (i in 1:simulaten){
  e<-rnorm(n, 0 ,2)
  x<-rnorm(n, 0, 1)
  y<-0.5 + 2*x + e
  model<- lm(y~x)}
  summary(model)

这是我的 for 循环正在实现的目标还是我错过了目标?

【问题讨论】:

  • 您将在每次迭代中更新model。所以,summary(model) 来自上一次迭代
  • 如果我想将其存储为向量,是否应该使用复制功能?
  • 是的,replicate 也很有用。那么你可以避免for 循环。即replicate(simulaten, yourcode, simplify = FALSE)
  • 感谢您的澄清!
  • RuiBarradas 显示了一个带有复制的选项。您可以检查该解决方案。谢谢

标签: r linear-regression simulation


【解决方案1】:

这是一个replicate 解决方案。我已将n(在问题中忘记)和simulaten 设置为较小的值。

n <- 100
simulaten <- 4

set.seed(123498)

model_list <- replicate(simulaten, {
      e <- rnorm(n, 0, 2)
      x <- rnorm(n, 0, 1)
      y <- 0.5 + 2*x + e
      lm(y ~ x)
}, simplify = FALSE)

model_list

编辑

可以从模型列表中获得一些统计数据。系数是通过应用于每个模型的函数coef 提取的。
完成sapply,返回的对象是一个2行矩阵。

betas <- sapply(model_list, coef)

str(betas)
# num [1:2, 1:1000] 0.671 1.875 0.374 2.019 0.758 ...
# - attr(*, "dimnames")=List of 2
#  ..$ : chr [1:2] "(Intercept)" "x"
#  ..$ : NULL

至于图表,这里是一个例子。请注意,为了使 x 轴达到所有 x 值,在第一次调用hist 时,参数xlim 设置为range(betas)

lgd <- c(expression(beta[0]), expression(beta[1]))
hist(betas[1, ], freq = FALSE, col = "lightblue", xlim = range(betas), ylim = c(0, 2.5), xlab = "betas", main = "")
hist(betas[2, ], freq = FALSE, col = "blue", add = TRUE)
legend("top", legend = lgd, fill = c("lightblue", "blue"), horiz = TRUE)

【讨论】:

  • 有没有办法从系数汇总中提取 b0_hat 和 b1_hat 的值并将它们放入一个向量中以便我可以制作直方图?并感谢您简洁明了的回答!
  • 非常感谢您的帮助!
【解决方案2】:

model 在每次迭代中都会更新。所以summary 正在返回最后一个“模型”的摘要输出。我们可以将其存储在list

# // initialize empty list of length equals length of simulaten
modellst <- vector('list', simulaten)
 for(i in seq_len(simulaten)) {
      e <- rnorm(n, 0 ,2)
      x <- rnorm(n, 0, 1)
      y <- 0.5 + 2*x + e
      # // assign the model output to the corresponding list element
      modellst[[i]] <- lm(y~x)  
 }

【讨论】:

  • 支持但有错误:使用seq_len(simulaten),或seq_along(modellst)
  • 将迭代的结果存储在向量中吗?对不起,基本问题。我对 R 还很陌生
  • @NeilsonsMilk 模型对象是具有许多属性的复杂对象。 list 可以很好地容器化它而不是向量。因为vector 只能有一个类型
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 2017-02-02
  • 2020-08-05
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多