Нужно запустить регрессию 1000 раз

У меня есть функция регрессии, называемая reg. Теперь мне нужно запустить его 1000 раз, зафиксировать значение Rsquare и t-stat в виде гистограммы.

Я попытался запустить репликацию следующим образом (взял n = 5, чтобы увидеть результаты):

replicate(5,{
  seriese=matrix( rnorm(100*1,mean=0,sd=1), 100, 1) 
  e <- matrix(ncol = 1, nrow = 100) 
  for(i in 1:100){
    e[i] <- sum(seriese[1:i,1]) 
  } 
  dataY <- cbind(seriese, e) 
  seriesa=matrix( rnorm(100*1,mean=0,sd=1), 100, 1) 
  x <- matrix(ncol = 1, nrow = 100) 
  for(i in 1:100){ 
    x[i] <- sum(seriesa[1:i,1]) 
  }
  dataX <- cbind(seriesa, x) 
  #convert to ts
  dataYTS=ts(dataY[,2]) 
  dataXTS=ts(dataX[,2]) 
  #run regression 
  #check summary regression 
  reg=lm(dataYTS~dataXTS) 
},simplify=FALSE) 

Это сообщает о типе данных, а не о значениях.

replicate(5,{reg=lm(dataYTS~dataXTS)})
              [,1]        [,2]        [,3]        [,4]        [,5]       
coefficients  Numeric,2   Numeric,2   Numeric,2   Numeric,2   Numeric,2  
residuals     Numeric,100 Numeric,100 Numeric,100 Numeric,100 Numeric,100
effects       Numeric,100 Numeric,100 Numeric,100 Numeric,100 Numeric,100
rank          2           2           2           2           2          
fitted.values Numeric,100 Numeric,100 Numeric,100 Numeric,100 Numeric,100
assign        Integer,2   Integer,2   Integer,2   Integer,2   Integer,2  
qr            List,5      List,5      List,5      List,5      List,5     
df.residual   98          98          98          98          98         
xlevels       List,0      List,0      List,0      List,0      List,0     
call          Expression  Expression  Expression  Expression  Expression 
terms         Expression  Expression  Expression  Expression  Expression 
model         List,2      List,2      List,2      List,2      List,2     

person user5501025    schedule 29.10.2015    source источник
comment
Какой смысл запускать 1000 раз одну и ту же регрессию? Вы получите в 1000 раз тот же результат.   -  person    schedule 29.10.2015
comment
Попробуйте replicate(5,{reg=lm(dataYTS~dataXTS)}, simplify=FALSE) предположить, что вы являетесь sampling набором данных.   -  person akrun    schedule 29.10.2015
comment
Согласен с @Pascal, нужно запустить полный процесс. Как мне записать Rsqaure, который предоставляется функцией регрессии после репликации 1000 раз.   -  person user5501025    schedule 29.10.2015
comment
@akrun, твое предложение дает мне тот же результат, что и раньше   -  person user5501025    schedule 29.10.2015
comment
Как я уже говорил, вам может понадобиться некоторая выборка. Мой код должен получить результат в формате list, а не в формате, который вы показали. Без какого-либо воспроизводимого примера трудно понять, что происходит.   -  person akrun    schedule 29.10.2015
comment
@akrun, вот код, который я запустил: replicate(5,{seriese=matrix(rnorm(100*1,mean=0,sd=1), 100, 1) + e ‹- matrix(ncol = 1, nrow = 100) + for(i в 1:100){ + e[i] ‹- sum(seriese[1:i,1]) + } + dataY ‹- cbind(seriese, e) + + + + seriesa=matrix( rnorm(100*1,mean=0,sd=1), 100, 1) + x ‹- матрица (ncol = 1, nrow = 100) + for(i в 1:100){ + x[i] ‹- sum(seriesa[1:i,1]) + } + dataX ‹- cbind(seriesa, x) + + + #convert to ts + dataYTS=ts(dataY[,2]) + dataXTS=ts(dataX[,2 ]) + + #запустить регрессию + #проверить сводную регрессию + + reg=lm(dataYTS~dataXTS) + },simplify=FALSE)   -  person user5501025    schedule 29.10.2015
comment
Пожалуйста, обновите это в своем посте.   -  person akrun    schedule 29.10.2015
comment
Не могли бы вы обновить свой пост строками, которые вы добавили в комментарии?   -  person    schedule 29.10.2015
comment
Это очень неэффективный способ подсчета того, что cumsum даст вам там. В любом случае ваш код возвращает объекты модели. Перебирайте их, чтобы вычислить R-квадрат и t-таблицу, или вычислите и верните их в свой цикл replicate.   -  person Roland    schedule 29.10.2015


Ответы (1)


Значение R-квадрата не входит в список, который возвращает lm. Чтобы получить это, вам нужно извлечь соответствующий лист из списка summary.lm:

Rsq.vec <- replicate(5,{
  seriese=matrix( rnorm(100*1,mean=0,sd=1), 100, 1) 
  e <- matrix(ncol = 1, nrow = 100) 
  for(i in 1:100){
    e[i] <- sum(seriese[1:i,1]) 
  } 
  dataY <- cbind(seriese, e) 
  seriesa=matrix( rnorm(100*1,mean=0,sd=1), 100, 1) 
  x <- matrix(ncol = 1, nrow = 100) 
  for(i in 1:100){ 
    x[i] <- sum(seriesa[1:i,1]) 
  }
  dataX <- cbind(seriesa, x) 
  dataYTS=ts(dataY[,2]) 
  dataXTS=ts(dataX[,2]) 
  summary(lm(dataYTS~dataXTS) )$r.squared
}, simplify=TRUE)

Затем вы можете выполнить hist для этого объекта. Вы говорите, что вам нужен «t-stat», но этот запрос неясен, поскольку даже в этой простой модели есть несколько t-статистик. Возможно, вам нужна t-статистика для второго коэффициента?, t-статистика для переменной-предиктора. Это также можно найти с помощью summary. Лист $coefficients этого списка представляет собой матрицу. Прочитайте страницу справки для summary.lm, и это должна быть простая модификация кода выше.

person IRTFM    schedule 29.10.2015
comment
этот код работал очень хорошо. Как создать таблицу со всеми 5 значениями RSquared и коэффициентами переменной-предиктора. Я попытался создать новую переменную, но она сообщает только одно значение. - person user5501025; 29.10.2015
comment
Вы можете использовать cbind для составления r-квадрата и t-статистики. Для пары числовых векторов он вернет матрицу, близкую к объекту таблицы R. Затем вы можете назначить имена строк и имена столбцов. - person IRTFM; 29.10.2015
comment
Я пробовал summary.lm(dataYTS~dataXTS)$r.squared, но получаю следующую ошибку: Ошибка в if (p == 0) { : аргумент имеет нулевую длину, @BondedDust - person user5501025; 02.11.2015
comment
@ BondedDust, @Roland Я также пробовал: Rep100 ‹- replicate(5,{ seriese=matrix( rnorm(100*1,mean=0,sd=1), 100, 1) e ‹- матрица(ncol = 1, nrow = 100) for(i in 1:100){ e[i] ‹- sum(seriese[1:i,1]) } dataY ‹- cbind(seriese, e) seriesa=matrix( rnorm(100*1,mean =0,sd=1), 100, 1) x ‹- матрица (ncol = 1, nrow = 100) for(i in 1:100){ x[i] ‹- sum(seriesa[1:i,1] ) } dataX ‹- cbind(seriesa, x) dataYTS=ts(dataY[,2]) dataXTS=ts(dataX[,2]) reg=(lm(dataYTS~dataXTS)) summaryr=(reg$r.squared) summaryc=(reg$r.coefficients) RT=cbind(summaryr,summaryc) }, simple=TRUE) - person user5501025; 03.11.2015
comment
Я застрял, так как не знаю, как суммировать требуемые значения из объектов. - person user5501025; 03.11.2015
comment
Вывод показывает, что у вас есть матрица списков. Код сработал. Вы не понимаете, как смотреть на значения. Присвойте значение, возвращаемое replicate(5,{reg=lm(dataYTS~dataXTS)}), таким символам, как results, и посмотрите на results[1,1]. - person IRTFM; 03.11.2015
comment
я изменил код на Rsq.vec ‹- replicate(5,{ seriese=matrix( rnorm(100*1,mean=0,sd=1), 100, 1) e ‹-matrix(ncol = 1, nrow = 100 ) for(i in 1:100){ e[i] ‹- sum(seriese[1:i,1]) } dataY ‹- cbind(seriese, e) seriesa=matrix( rnorm(100*1,mean=0 ,sd=1), 100, 1) x ‹- матрица (ncol = 1, nrow = 100) for(i in 1:100){ x[i] ‹- sum(seriesa[1:i,1]) } dataX ‹- cbind(seriesa, x) dataYTS=ts(dataY[,2]) dataXTS=ts(dataX[,2]) reg=(lm(dataYTS~dataXTS)) ) summary=summary(Rsq.vec) }, упростить =ИСТИНА) - person user5501025; 03.11.2015
comment
пример 1/5 результатов, которые я получаю, - все 5 значений одинаковы. Цель состоит в том, чтобы повторить процесс 5 раз и получить 5 разных результатов. - person user5501025; 03.11.2015
comment
Я не получал 5 одинаковых результатов, что бы это ни значило. Вставка кода в комментарии не является эффективным методом, так как переводы строк теряются и схема потока данных через код не видна. Я получил 5 разных моделей, когда вынул шаг summary и получил доступ к результату матрицы с помощью [,] - person IRTFM; 03.11.2015