问题是要求我执行以下操作:
“生成大小为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]中的错误:尺寸错误。
您可以执行以下操作:
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))))
就性能而言,我想第二个选择要快一些。