Как сравнить 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)
Дайте мне знать, если я неправильно понимаю вопрос, и дайте нам знать, что вы узнали!