Почему PLM создает массивные объекты и не может их открыть

Я работаю над большой (но не огромной) базой данных: 1,1 млн наблюдений x 41 переменная. Данные расположены в виде несбалансированной панели. Используя эти переменные, я указал три разные модели и запустил каждую из них как 1) фиксированные эффекты, 2) случайные эффекты и 3) объединенную регрессию OLS.

Исходный файл.RData, содержащий только базу данных, составляет около 15 МБ..RData, содержащий базу данных и результаты регрессии (всего 9 регрессий), весит около 650Mb. Я понимаю, что (из базовой документации)

An object of class c("plm","panelmodel").

A "plm" object has the following elements :

coefficients   the vector of coefficients,
vcov           the covariance matrix of the coefficients,
residuals      the vector of residuals,
df.residual    degrees of freedom of the residuals,
formula        an object of class ’pFormula’ describing the model,
model          a data.frame of class ’pdata.frame’ containing the variables usedfor the estimation: the response is in first position and the two indexes in the last positions,
ercomp         an object of class ’ercomp’ providing the estimation of the components of the
errors         (for random effects models only),
call           the call

Тем не менее, я не могу понять, почему эти файлы должны быть такими массивными. Чтобы избежать перегрузки памяти при работе с plm объекты, я сохранил их в трех разных файлах (каждый из которых теперь весит около 200 МБ). я звонил summary час назад, чтобы увидеть результаты модели с фиксированными эффектами, но она пока не дала мне никаких результатов. Мой вопрос сейчас довольно прост. Считаете ли вы это нормальным поведением? Есть ли что-то, что я могу сделать, чтобы уменьшить plm размер объектов и ускорить поиск результатов?

Вот некоторые вещи, которые вы могли бы знать:

  • База данных, которую я использую, находится в data.table формат
  • formulas в регрессии предварительно собраны и включены в plm звонки, предшествующие as.formula(), как предлагается здесь. Пример:

form<-y~x1+x2+x3+...+xn

mod.fe<-plm(as.formula(form), regr, effect="individual", model="within", index=c("id", "year"))

Пожалуйста, дайте мне знать, если есть какая-либо другая информация, которую я могу предоставить, и что вам, возможно, придется ответить на вопрос.

РЕДАКТИРОВАТЬ

Мне удалось создать небольшую базу данных с характеристиками, аналогичными той, над которой я работаю. Вот:

structure(list(id = c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 4L, 4L, 
5L, 5L, 6L, 6L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 
10L, 10L, 11L, 11L), year = structure(c(1L, 2L, 1L, 2L, 3L, 4L, 
1L, 2L, 1L, 2L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 
1L, 2L, 3L, 4L, 3L, 4L, 1L, 2L), .Label = c("2000", "2001", "2002", 
"2003"), class = "factor"), study = c(3.37354618925767, 4.18364332422208, 
5.32950777181536, 4.17953161588198, 5.48742905242849, 5.73832470512922, 
6.57578135165349, 5.69461161284364, 6.3787594194582, 4.7853001128225, 
7.98380973690105, 8.9438362106853, 9.07456498336519, 7.01064830413663, 
10.6198257478947, 9.943871260471, 9.84420449329467, 8.52924761610073, 
3.52184994489138, 4.4179415601997, 5.35867955152904, 3.897212272657, 
5.38767161155937, 4.9461949594171, 3.62294044317139, 4.58500543670032, 
7.10002537198388, 6.76317574845754, 6.83547640374641, 6.74663831986349
), ethnic = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 1L, 1L, 
2L, 2L, 3L, 3L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
1L, 1L, 2L, 2L), .Label = c("hispanic", "black", "chinese"), class = "factor"), 
    sport = c(0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0), health = structure(c(1L, 
    1L, 2L, 2L, 2L, 2L, 3L, 3L, 4L, 4L, 1L, 1L, 2L, 2L, 3L, 3L, 
    3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L), .Label = c("none", 
    "drink", "both", "smoke"), class = "factor"), gradec = c(2.72806403942929, 
    3.10067738633308, 4.04728186632456, 2.19701362539883, 1.73115878111307, 
    5.35879931359977, 5.79613840739381, 5.07050219214859, 4.26224490644077, 
    3.53554192927934, 6.10515669475491, 7.18032957183198, 6.73191149590581, 
    6.49512764543435, 6.4783689354808, 6.19974636196512, 5.54014977312232, 
    6.72545652880344, 1.00223129492982, 1.08994269214495, 3.06702680106689, 
    1.70103126320561, 4.82973481729635, 3.14010240687364, 3.8068435242348, 
    5.01254268106181, 5.66497772013949, 4.16303452633342, 4.2751229553617, 
    3.05652055248093), event = c(1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 
    0), evm3 = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0), evm2 = c(0, 
    0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 1, 0, 0, 1, 1, 0, 0, 0, 0), evm1 = c(0, 1, 0, 1, 1, 1, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 
    1, 0, 0, 0, 0), evp1 = c(0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1), 
    evp2 = c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1), evp3 = c(0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 1, 0), ndm3 = c(1, 1, 1, 1, 1, 0, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 
    1, 1, 1, 1), ndm2 = c(1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1), ndm1 = c(1, 
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 
    0, 0, 1, 0, 0, 0, 1, 0, 1, 0), ndp1 = c(0, 1, 0, 0, 0, 1, 
    0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 
    1, 0, 1, 0, 0), ndp2 = c(1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0), 
    ndp3 = c(1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 
    1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1)), .Names = c("id", 
"year", "study", "ethnic", "sport", "health", "gradec", "event", 
"evm3", "evm2", "evm1", "evp1", "evp2", "evp3", "ndm3", "ndm2", 
"ndm1", "ndp1", "ndp2", "ndp3"), class = "data.frame", row.names = c(NA, 
30L))

Формула и plm вызов, который я использовал:

form<-gradec~year+study+ethnic+sport+health+event+evm3+evm2+evm1+evp1+evp2+evp3+ndm3+ndm2+ndm1+ndp1+ndp2+ndp3

plm.f<-plm(as.formula(form), data, effect="individual", model="within", index=c("id", "year"))

С помощью object.size() предложенный @BenBolker я узнал, что вызов сгенерировал plm вес объекта составляет 64,5 КБ, в то время как исходный фрейм данных имеет размер 6,9 КБ, что означает, что результаты примерно в 10 раз больше, чем входная матрица. Вот тогда я установил параметры, предложенные @zx8754 ниже, но, к сожалению, они не имели никакого эффекта. Когда я наконец позвонил summary(plm.f) Я получил сообщение об ошибке:

Error in crossprod(t(X), beta) : non-conformable arguments

который я в конечном итоге получил и с моей большой базой данных, но только после нескольких часов вычислений. Здесь предполагается, что проблема может быть связана с сингулярностью матрицы коэффициентов. Тем не менее, тестирование на сингулярность с is.matrix.singular() найдено в matrixcalc пакет получается, что это не тот случай.

Еще пара вещей, которые вы можете знать:

  • year, ethnic а также health факторы
  • Переменные в формуле более или менее говорят сами за себя, за исключением последних. event это предполагаемое травмирующее событие произошло в определенное время. Кодируется 1 в случае события определенного года и 0 в противном случае. Переменная evm1 равно 1, если одно из этих событий произошло годом ранее (минус 1), и 0 в противном случае. Так же, evp1 равен 1, если событие происходит в следующем году (плюс 1), и 0 в противном случае. переменные ndm. а также ndp. работают таким же образом, но они кодируются 1, когда это расстояние не наблюдается (поскольку период времени для определенного человека слишком короткий), и 0 в противном случае. Наличие столь глубоко связанных переменных вызывает подозрение в совершенной коллинеарности. Однако, как сказано выше, тест показал, что матрица не единственная.

Позвольте мне еще раз сказать, что я был бы очень благодарен, если бы кто-то мог ответить на вопрос.

1 ответ

О сообщении об ошибке Error in crossprod(t(X), beta) : non-conformable arguments:

Вероятно, это связано с особенностью в матрице модели, как и предполагалось. Помните, что матрица моделей для моделей с фиксированными эффектами - это преобразованные данные (преобразованный фрейм данных).

Таким образом, вам нужно будет проверить необычность преобразованных данных. Преобразование с фиксированными эффектами может привести к линейной зависимости (сингулярности), даже если исходные данные не являются линейно зависимыми! plm пакет имеет довольно хорошую документацию по этому вопросу в ?detect_lin_dep который я собираюсь повторить здесь частично (только один пример):

### Example 1 ###
# prepare the data
data(Cigar)
Cigar[ , "fact1"] <- c(0,1)
Cigar[ , "fact2"] <- c(1,0)
Cigar.p <- pdata.frame(Cigar)

# setup a pFormula and a model frame
pform <- pFormula(price ~ 0 + cpi + fact1 + fact2)
mf <- model.frame(pform, data = Cigar.p)

# no linear dependence in the pooling model's model matrix
# (with intercept in the formula, there would be linear depedence)
detect_lin_dep(model.matrix(pform, data = mf, model = "pooling"))

# linear dependence present in the FE transformed model matrix
modmat_FE <- model.matrix(pform, data = mf, model = "within")
detect_lin_dep(modmat_FE)
mod_FE <- plm(pform, data = Cigar.p, model = "within")
detect_lin_dep(mod_FE) 
alias(mod_FE) # => fact1 == -1*fact2
plm(pform, data = mf, model = "within")$aliased # "fact2" indicated as aliased

Таким образом, вы должны запустить свою функцию, чтобы обнаружить линейную зависимость от преобразованных данных модели, которую вы получаете model.matrix(you_model), Вы можете использовать функции, предоставляемые plm: detect_lin_dep, alias или любая функция, которая работает на матрице.

Вы также можете посмотреть на свой объект модели plm:your_model$aliased чтобы увидеть, были ли отброшены некоторые переменные в оценке.

Другие вопросы по тегам