Петля линейной регрессии и коэффициент извлечения ошибок - PullRequest
0 голосов
/ 18 апреля 2019

Я в основном хочу запустить 1000 линейных регрессий (очень просто, Y ~ X) и извлечь коэффициенты из каждого.Каждая регрессия состоит из «кусков» из 200 наблюдений за Y, так как X остается одинаковым для каждой регрессии.Вот что у меня есть:

X<-rgamma(200,23,2)

U_list <- replicate(1000,rnorm(200,0,1),simplify = FALSE)
U_list <- setNames(U_list,paste0("U",seq_along(U_list)))

U<-unlist(U_list)

Y_list<-0.6+0.4*X+U
Y_list<-setNames(Y_list,paste0("Y",seq_along(Y_list)))

Y<-unlist(Y_list)

Чтобы попробовать это, я попытался использовать цикл for

k<-seq(from=1, to=200000, by=200)
for(i in k){
  assign(paste0("reg", i), lm(Y[i:199+i]~X))
}

. Я имел в виду, что с этим циклом я буду делать что-то подобное

reg1<-lm(Y[1:200]~X)
reg2<-lm(Y[201:400]~X) etc.

Но появляется следующая ошибка, и я ее не совсем понимаю, потому что, если я делаю регрессии одну за другой, я получаю результат

Error in model.frame.default(formula = Y[i:199 + i] ~ X, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'X')

Для коэффициентаизвлечение, я подумал о некотором rbind (), но я не совсем уверен, может ли это привести.Если спросить не так много, я был бы признателен за помощь, поскольку я все еще учусь программировать, а иногда это расстраивает!

1 Ответ

0 голосов
/ 18 апреля 2019

Я бы решил вашу проблему с другой структурой данных, которая упрощает применение функции к нескольким элементам - data.frame:

X<-rgamma(200,23,2)

Y <- replicate(1000,rnorm(200,0,1),simplify = T)

Mat <- as.data.frame(cbind(X,Y))

names(Mat) <- c("X",paste("Y",1:1000,sep="_"))

Coeffs <- as.data.frame(t(apply(Mat[,2:ncol(Mat)],2,function(col){
  mod <- lm(col ~ Mat[,"X"])
  return(mod$coefficients)
})))

head(Coeffs,10)

     (Intercept)   Mat[, "X"]
Y_1    0.1616418 -0.007862732
Y_2    0.3841935 -0.030134746
Y_3   -0.4244851  0.044787500
Y_4    0.2059972 -0.017895949
Y_5    0.5207483 -0.048730507
Y_6    0.5163610 -0.036493825
Y_7    0.3589379 -0.038667216
Y_8   -0.2291387  0.025178289
Y_9   -0.1274423  0.010477415
Y_10  -0.6508141  0.047532979
...