[构建一个函数以运行n次查找B系数的错误

问题描述 投票:0回答:1

问题是要求我执行以下操作:

“生成大小为n = 100的以下变量的iid样本:y〜N(0,1)x(下标k)〜iid N(0,1),k = 1,...,K,其中K =100。对于每个k = 1,...,K,在常数和x(sub k)上回归y。“

我正在尝试打印包含每个样本系数的矩阵。

这是我的代码:

    set.seed(1)
    n = 100
    B = 100 
    xk = rnorm(n) 
    y = rnorm(n)

    getbetas = function(n){
      beta = numeric(B)

      for(i in 1:B){
        ols = lm(y~xk[,i])
        beta[k] = ols$coefficients[2]
      }
      return(beta)
    }
    betas = getbetas(n)

错误是关于ols = lm(y〜xk [,i])行。它说如下:

xk [,i]中的错误:尺寸错误。

r statistics
1个回答
0
投票

您可以执行以下操作:

set.seed(2020) 
n <- 100
K <- 100
y <- rnorm(n)
xk <- replicate(K, rnorm(n), simplify = FALSE)

do.call(rbind, lapply(xk, function(x) coef(lm(y ~ x))))
#     (Intercept)            x
#[1,]  0.10522661 -0.031692313
#[2,]  0.11563455  0.048338315
#[3,]  0.10901209 -0.016424163
#[4,]  0.11572731  0.051020006
#[5,]  0.10620789 -0.198357072
#[6,]  0.10584156 -0.040393914
#[7,]  0.12157595 -0.089434432
#[8,]  0.11798138 -0.165129504
#[9,]  0.09731555 -0.113821805
#[10,]  0.11032089 -0.048752670

说明:replicate(K, rnorm(n), simplify = FALSE)创建一个包含K元素的列表,每个元素包含100个来自N(0, 1)的样本。我们用xk遍历这些lapply元素,拟合模型lm(y ~ x)并提取系数。 do.call(rbind, ...)然后将这些系数行绑定到matrix中。


或者:我们注意到从K绘制N乘以大小N(0, 1)的样本与绘制单个N*K的样本相同。所以上面可以写成

xk <- matrix(rnorm(n * K), nrow = n, ncol = K)
t(apply(xk, 2, function(x) coef(lm(y ~ x))))

就性能而言,我想第二个选择要快一些。

© www.soinside.com 2019 - 2024. All rights reserved.