#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. Извините, вы правы, позвольте мне снова задать вопрос, потому что этот вопрос неясен, извините