Вы можете сделать следующее:
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)
. Мы проведем oop через эти 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))))
С точки зрения производительности, я полагаю, что второй вариант немного быстрее.