Разделение панели регрессии получить один уникальный результат в R

#r #function #dataframe #split #panel-data

#r #функция #фрейм данных #разделение #панель-данные

Вопрос:

Я работаю с большой базой данных, но для иллюстрации я использую Grunfeld данные

Моя цель — разделить мои данные на куски, чтобы моя модель могла работать, в противном случае у меня заканчивается память (требуется 90 000 ГБ). Я использую splm для своих данных, но поскольку он работает, plm я использую последний для примера. Как только мне удастся запустить каждый фрагмент, я захочу получить общий результат.

Что у меня есть до сих пор, так это:

 data("Grunfeld", package="plm")
Grunfeld <- pdata.frame(Grunfeld, index = c("firm","year"))
s1<-split(Grunfeld, sample(rep(1:4)))
fm <- value ~ capital
fix <- lapply(1:length(s), function(x) plm(fm, data=s1[[x]],model = "within"))
  

Теперь у меня есть список коэффициентов и остатков fix

Есть ли способ, которым я могу создать функцию, чтобы мой результат эмулировал решение полной базы данных вместо 4 блоков?

т.е.

 Residuals:
     Min.   1st Qu.    Median   3rd Qu.      Max. 
-1299.602   -88.290   -10.197    84.142  1324.118 

Coefficients:
        Estimate Std. Error t-value  Pr(>|t|)    
capital 0.551055   0.098634  5.5869 7.971e-08 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Total Sum of Squares:    23078000
Residual Sum of Squares: 19807000
R-Squared:      0.14174
Adj. R-Squared: 0.09633
F-statistic: 31.213 on 1 and 189 DF, p-value: 7.9714e-08
  

Ответ №1:

Рассмотрим разделение на основе nrow фрейма данных. Ниже разбивает данные на четыре части в зависимости от размера фрейма данных.

 num <- ceiling(nrow(Grunfeld) / 4)
chunks <- ceiling(1:nrow(Grunfeld) / num)
fm <- value ~ capital

df_list <- split(Grunfeld, chunks)
fix <- lapply(df_list, function(df) plm(fm, data=df, model = "within"))
  

Альтернативой split lapply является by :

 num <- ceiling(nrow(Grunfeld) / 4)
chunks <- ceiling(1:nrow(Grunfeld) / num)
fm <- value ~ capital

fix <- by(Grunfeld, chunks, function(df) plm(fm, data=df, model = "within"))
  

Комментарии:

1. Спасибо! но на самом деле это не работает, я получил: «Ошибка в eval (predvars, data, env): значение объекта «не найдено» для метода lapply и Error in uniqval[as.character(effect), , drop = F] : incorrect number of dimensions для метода by. Кроме того, df_list (для моих больших данных) составляет 1,2 ГБ, а s1 — 10,3 МБ, и я продолжаю получать список коэффициентов, не являющихся уникальными

2. Увеличьте num размер строк до 400 или 4000 или больше для 4 частей. Насколько велик Grunfeld ? Помните, что это подмножество всего фрейма данных, поэтому df_list будет больше, чем s1 . См. раздел Редактирование разделения на четыре фрагмента.

3. Следующий Grunfeld пример: у меня есть 90 фирм, каждая на 744 года. Когда я разделяю его chunks <- ceiling(1:nrow(Grunfeld) / num) , я делаю это фирмами, но мне нужно разделить его на балансовые панели, чтобы запустить их plm

4. Сбалансированная панель может быть другим вопросом. Вы можете использовать split и by для разделения по фирмам, а затем запускать фрагменты для каждого разделения. Для обеспечения отсутствия пропущенных лет для панели требуется дополнительная работа.

5. Извините, вы правы, позвольте мне снова задать вопрос, потому что этот вопрос неясен, извините