r - 面板回归 - 估计器
问题描述
我正在尝试在 R 中进行面板回归。
pdata <- pdata.frame(NEW, index = c("Year"))
和:
R1 <- plm(Market_Cap ~ GDP_growthR + Volatility_IR + FDI
+ Savings_rate, data=pdata, model="between")
但是,当我想使用内部(或随机)估计器时,出现以下错误:
Error in plm.fit(data, model, effect, random.method, random.models, random.dfcor, : empty model
但是,当我使用 between 估计器时,一切都很好。你有什么解释和建议吗?
谢谢!
解决方案
您应该注意评论中的建议。
我在CV上解决了 OP 问题的一个版本。如果数据的结构相同,那么随着时间的推移,您只观察到一个横截面单位。在您的环境中,您多年来一直在观察一个国家。如果您的数据是真正的面板数据集,那么您将在至少两年内观察多个国家。例如,我将模拟一个小型面板数据框。
library(dplyr)
library(plm)
set.seed(12345)
panel <- tibble(
country = c(rep("Spain", 5), rep("France", 5), rep("Croatia", 5)),
year = rep(2016:2020, 3), # each country is observed over 5 years
x = rnorm(15), # sample 15 random deviates (5 per country)
y = sample(c(10000:100000), size = 15) # sample incomes (range: 10,000 - 100,000)
) %>%
mutate(
France = ifelse(country == "France", 1, 0),
Croatia = ifelse(country == "Croatia", 1, 0),
y_2016 = ifelse(year == 2016, 1, 0),
y_2017 = ifelse(year == 2017, 1, 0),
y_2018 = ifelse(year == 2018, 1, 0),
y_2019 = ifelse(year == 2019, 1, 0),
y_2020 = ifelse(year == 2020, 1, 0)
)
在mutate()
函数内部,我为所有国家和所有年份添加了假人,不包括一个国家和一年。在您的另一个问题中,您估计时间固定效应。软件总是下降一年以避免共线性。您不需要附加假人,但它们有助于解释目的。这是一个经典的面板数据框:
# Panel - varies across two dimensions (country + time)
# 3 countries observed over 5 years for a total of 15 country-year observations
# A tibble: 15 x 10
country year x y France Croatia y_2017 y_2018 y_2019 y_2020
<chr> <int> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Spain 2016 0.586 81371 0 0 0 0 0 0
2 Spain 2017 0.709 10538 0 0 1 0 0 0
3 Spain 2018 -0.109 26893 0 0 0 1 0 0
4 Spain 2019 -0.453 71363 0 0 0 0 1 0
5 Spain 2020 0.606 43308 0 0 0 0 0 1
6 France 2016 -1.82 42544 1 0 0 0 0 0
7 France 2017 0.630 88187 1 0 1 0 0 0
8 France 2018 -0.276 91368 1 0 0 1 0 0
9 France 2019 -0.284 65563 1 0 0 0 1 0
10 France 2020 -0.919 22061 1 0 0 0 0 1
11 Croatia 2016 -0.116 80390 0 1 0 0 0 0
12 Croatia 2017 1.82 48623 0 1 1 0 0 0
13 Croatia 2018 0.371 93444 0 1 0 1 0 0
14 Croatia 2019 0.520 79582 0 1 0 0 1 0
15 Croatia 2020 -0.751 33367 0 1 0 0 0 1
正如@DaveArmstrong 正确指出的那样,您应该指定面板索引。首先,我们指定一个面板数据框,然后我们估计模型。
pdata <- pdata.frame(panel, index = c("year", "country"))
random <- plm(y ~ x, model = "random", data = pdata)
拟合单向随机效应模型。调用summary()
将产生以下内容(精简输出):
Call:
plm(formula = y ~ x, data = pdata, model = "random")
Balanced Panel: n = 5, T = 3, N = 15
Effects:
var std.dev share
idiosyncratic 685439601 26181 0.819
individual 151803385 12321 0.181
theta: 0.2249
Residuals:
Min. 1st Qu. Median 3rd Qu. Max.
-49380 -17266 6221 17759 32442
Coefficients:
Estimate Std. Error z-value Pr(>|z|)
(Intercept) 58308.0 8653.7 6.7380 1.606e-11 ***
x 7777.0 8808.9 0.8829 0.3773
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
但是您的数据没有这种结构,因此会出现警告消息。事实上,您的数据类似于从此面板中划分出一个国家/地区。例如,假设我们仅将数据框筛选为克罗地亚观测值。以下代码采用前一个数据帧的子集:
croatia_only <- panel %>%
filter(country == "Croatia") # grab only the observations from Croatia
在这里,纵向变化只存在于一个国家。换句话说,通过限制对克罗地亚的关注,我们无法利用各国之间的差异;我们只有一维的变化!生成的数据框如下所示:
# Time Series - varies across one dimension (time)
# A tibble: 5 x 10
country year x y France Croatia y_2017 y_2018 y_2019 y_2020
<chr> <int> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Croatia 2016 -0.116 80390 0 1 0 0 0 0
2 Croatia 2017 1.82 48623 0 1 1 0 0 0
3 Croatia 2018 0.371 93444 0 1 0 1 0 0
4 Croatia 2019 0.520 79582 0 1 0 0 1 0
5 Croatia 2020 -0.751 33367 0 1 0 0 0 1
现在我将重新估计一个国家的随机效应模型:
pdata <- pdata.frame(croatia_only, index = c("year", "country"))
random_croatia <- plm(y ~ x , model = "random", data = pdata)
这应该会重现您的错误消息(即空模型)。请注意,您只有一个国家/地区内的变化!正如您正确指出的那样,“效果间”模型是可估计的,但不是出于您可能假设的原因。“效应间”模型对一个国家的所有年份进行平均,然后对“平均”数据进行普通最小二乘。在您的设置中,对时间序列取平均值会得出一个国家/地区的平均值。既然你只观察一个国家,那么你就只有一个观察。这样的模型是不可估量的。但是,您可以将一个国家/地区的所有年度观察“汇集”在一起,并改为运行线性模型。这就是你正在做的事情。要使用一个国家/地区进行测试,请尝试将“中间”模型与“汇集”模型进行比较。x
# Run this using the croatia_only data frame
summary(plm(y ~ x , model = "between", data = pdata))
summary(plm(y ~ x , model = "pooling", data = pdata))
现在应该很明显了,但model = "pooling"
相当于运行lm()
.
如果您希望我将此与您之前的帖子联系起来,请尝试使用所有年份的单独假人作为协变量来估计一个线性模型。您会很快发现您没有剩余的自由度,这正是您在另一篇文章中概述的问题。
总之,我会寻找其他国家的数据。一旦你这样做,你可以使用plm()
它的所有价值。
推荐阅读
- android - 为whatsapp等用户的个人资料图像提供预定义的大小
- rxjs - 取消一系列连续的异步请求
- protractor - 错误:找不到模块 'C:\project\node_modules\cucumber\bin\cucumber'
- android - Android camera2 - 拍照前闪光灯关闭
- html - 如何防止滚动条出现在模态背景之上
- c# - 我无法在本地使用 VUE js
- kubernetes - /var/lib/etcd/member/snap 中的 etcd 文件
- node.js - 这个 SQL 是原始 sql 选项的东西,还是 Sequelize 有它的东西?
- ios - Interface Builder Inherit Module 从 Target 选择错误的目标
- python - 恢复模型时 TensorFlow 中的 NotFoundError