如何使用plm软件包比较R中的两种型号?
因此,我使用R中的如何使用plm软件包比较R中的两种型号?,r,anova,plm,R,Anova,Plm,因此,我使用R中的plm包运行一个固定效果模型,我想知道如何比较两个模型中哪一个更合适 例如,以下是我构建的两个模型的代码: 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
plm
包运行一个固定效果模型,我想知道如何比较两个模型中哪一个更合适
例如,以下是我构建的两个模型的代码:
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")
有人知道如何使用
plm
软件包吗?Wald检验是否合适?以下代码回答了一个类似的交叉验证问题,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
library(plm)#使用plm
库(car)#在命令行中使用F-test
图书馆(tidyverse)
数据(egsingle,包='mlmRev')
dta%变异(雌性=重新编码(雌性,.default=0L,`雌性`=1L))
plm1 | t |)
#年份-1.5 0.8842 0.1008 8.77您是否使用了plm
函数anova()
?根据你写问题的方式我说不出来。如果你没有,试试看
如果您的问题更多的是关于选择一种方法来帮助您在模型之间做出判断的统计问题,而不是技术问题,那么答案将真正取决于您定义“合适”的方式。如果两种模型的唯一区别是在两种模型中的第一种模型中包含fx
,一些统计测试可以评估您的模型最小化平方误差(例如R^2)或由于残差(例如VIF)的非随机分布而不足的程度
如果您想知道是否包含<代码> fx>代码>,生成一个适合您的数据的模型,该模型有点抵抗过度拟合,请考虑使用。我通常喜欢BIC,因为它比其他模型拟合统计数据(如AIC)更积极地惩罚附加参数。BIC最低的模型往往是最适合的模型(尽管在IMO中,您也应该确认地使用Wald测试/F-test,特别是当您的嵌套模型是它们的理想用例时)。您应该能够使用
plm
获取模型对象上的BIC值,如图所示:
anova(model1, model2)
如果这不起作用,我发现lme4
package函数很有用:
BIC(model1, model2)
如果我误解了这个问题,请告诉我,并告诉我们您发现了什么 我也在努力解决这个问题,但最终(在一位博士朋友的帮助下)提出了以下解决方案。使用您的示例,请参见下面的示例解决方案
使用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
库(plm)
eurofix我决定只使用Wald测试。事实证明,plm软件包可以很好地解决这个问题。谢谢,在我看到这个之前,我还想问同样的问题。您能否共享实现Wald测试的代码来比较这两个模型?是的,线性回归模型中的方差分析相当于瓦尔德检验。请参见此。数据集包中的欧元数据(默认情况下可用)没有支持此问题的结构。@42,有一个关于交叉验证的问题,通过一个工作示例(包括数据和全部)或多或少地询问相同的问题。您认为可以重写-c(1:5)吗
以某种方式阻止代码,使代码更通用?(也在这里)@EricFail是个好建议。我用正则表达式匹配替换了计数(-c(1:5)
)。
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