Как сравнить 2 модели в R, используя пакет plm?

Итак, я использую модель с фиксированными эффектами, используя plm Пакет в R, и мне интересно, как я могу сравнить, какая из двух моделей больше подходит.

Например, вот код для двух моделей, которые я построил:

library(plm)

eurofix <- plm(rlogmod ~ db+gdp+logvix+gb+i+logtdo+fx+ld+euro+core, 
               data=euro, 
               model="within")

eurofix2 <- plm(rlogmod ~ db+gdp+logvix+gb+i+logtdo+ld+euro+core, 
                data=euro,
                model="within")

Я знаю, что с регулярным lm Позвоните, я могу сравнить две модели, запустив тест anova, но в этом случае это не работает. Я всегда получаю следующую ошибку:

Error in UseMethod("anova") : 
  no applicable method for 'anova' applied to an object of class "c('plm', 'panelmodel')"

Кто-нибудь знает, что делать с plm пакет? Подходит ли тест Вальда?

2 ответа

Следующий код ответил на аналогичный вопрос в Перекрестной проверке Вопрос также есть о тестовой (совместной) гипотезе в plm рутина. Это должно быть просто применить коды к вашему вопросу.

library(plm)  # Use plm
library(car)  # Use F-test in command linearHypothesis
library(tidyverse)
data(egsingle, package = 'mlmRev')
dta <- egsingle %>% mutate(Female = recode(female, .default = 0L, `Female` = 1L))
plm1 <- plm(math ~ Female * (year), data = dta, index = c('childid', 'year', 'schoolid'), model = 'within')

# Output from `summary(plm1)` --- I deleted a few lines to save space.
# Coefficients:
#                 Estimate Std. Error t-value Pr(>|t|)    
# year-1.5          0.8842     0.1008    8.77   <2e-16 ***
# year-0.5          1.8821     0.1007   18.70   <2e-16 ***
# year0.5           2.5626     0.1011   25.36   <2e-16 ***
# year1.5           3.1680     0.1016   31.18   <2e-16 ***
# year2.5           3.9841     0.1022   38.98   <2e-16 ***
# Female:year-1.5  -0.0918     0.1248   -0.74     0.46    
# Female:year-0.5  -0.0773     0.1246   -0.62     0.53    
# Female:year0.5   -0.0517     0.1255   -0.41     0.68    
# Female:year1.5   -0.1265     0.1265   -1.00     0.32    
# Female:year2.5   -0.1465     0.1275   -1.15     0.25    
# ---

xnames <- names(coef(plm1)) # a vector of all independent variables' names in 'plm1'
# Use 'grepl' to construct a vector of logic value that is TRUE if the variable
# name starts with 'Female:' at the beginning. This is generic, to pick up
# every variable that starts with 'year' at the beginning, just write
# 'grepl('^year+', xnames)'.
picked <- grepl('^Female:+', xnames)
linearHypothesis(plm1, xnames[picked])

# Hypothesis:
# Female:year - 1.5 = 0
# Female:year - 0.5 = 0
# Female:year0.5 = 0
# Female:year1.5 = 0
# Female:year2.5 = 0
# 
# Model 1: restricted model
# Model 2: math ~ Female * (year)
# 
#   Res.Df Df Chisq Pr(>Chisq)
# 1   5504                    
# 2   5499  5  6.15       0.29

Я тоже боролся с этим, но, наконец, придумал следующее решение (с помощью друга-доктора философии). Используя ваш пример, просмотрите образец решения ниже.

Используйте критерии AIC для сравнения панельных моделей следующим образом:

library(plm)

eurofix <- plm(rlogmod ~ db+gdp+logvix+gb+i+logtdo+fx+ld+euro+core, 
               data=euro, 
               model="within")

eurofix2 <- plm(rlogmod ~ db+gdp+logvix+gb+i+logtdo+ld+euro+core, 
                data=euro,
                model="within")

# AIC = log(RSS/N) + 2K/N  for linear models
# AIC = log(RSS/n) + 2K/n  for panel models

Sum1 <- summary(eurofix)
RSS1 <- sum(Sum1$residuals^2)
K1 <- max(eurofix$assign)
N1 <- length(eurofix$residuals)
n1 <- N1 - K1 - eurofix$df.residual

AIC_eurofix = log(RSS1/n1) + (2*K1)/n1

Sum2 <- summary(eurofix2)
RSS2 <- sum(Sum2$residuals^2)
K2 <- max(eurofix2$assign)
N2 <- length(eurofix2$residuals)
n2 <- N2 - K2 - eurofix2$df.residual

AIC_eurofix2 = log(RSS2/n2) + (2*K2)/n2

Более низкое значение AIC является предпочтительной моделью!

Вы использовали plm функция anova()? Я не могу сказать, основываясь на том, как вы написали свой вопрос. Если вы этого не сделали, дайте ему шанс.

Если ваш вопрос скорее статистический о выборе подхода, который поможет вам судить между моделями, а не о техническом, тогда ответ будет зависеть от того, как вы определяете "подходящий". Если единственное различие в двух моделях - это включение fx в первом из двух несколько статистических тестов могли оценить степень, до которой ваша модель минимизирует квадратичную ошибку (например, R^2) или не соответствует из-за неслучайного распределения остатков (например, VIF).

Если вы хотите знать, включая ли fx дает модель, которая соответствует вашим данным, которая несколько устойчива к переоснащению, рассмотрите возможность использования BIC. Я обычно предпочитаю BIC, потому что он штрафует дополнительные параметры более агрессивно, чем статистика соответствия других моделей. Модель с самым низким значением BIC, как правило, лучше всего подходит для модели (хотя вы также должны использовать IMO-тест Вальда /F-тест, особенно потому, что ваши вложенные модели - их идеальный вариант использования). Вы должны быть в состоянии получить значения BIC для объектов модели, используя plm как показано:

anova(model1, model2)

Если это не сработает, я нашел lme4 Полезна функция пакета:

BIC(model1, model2)

Дайте мне знать, если я неправильно понимаю вопрос, и дайте нам знать, что вы узнали!

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