Ошибка при построении функции для запуска регрессии n раз, которая находит B-коэффициенты - PullRequest
0 голосов
/ 05 марта 2020

Проблема просит меня сделать следующее:

"Сгенерировать выборку iid размером n = 100 из следующих переменных: y ~ N (0,1) , x (индекс k) ~ iid N (0,1) , k = 1, ..., K, где K = 100. Для каждого k = 1, ..., K регрессия y на константе и x (sub k). "

Я пытаюсь распечатать матрицу, которая содержит коэффициенты для каждого образца.

Вот мой код:

    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]: неверное количество измерений.

1 Ответ

0 голосов
/ 06 марта 2020

Вы можете сделать следующее:

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))))

С точки зрения производительности, я полагаю, что второй вариант немного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...