首页 > 解决方案 > 面板回归 - 估计器

问题描述

我正在尝试在 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 估计器时,一切都很好。你有什么解释和建议吗?

谢谢!

标签: rstatisticsregressionpanelanalysis

解决方案


您应该注意评论中的建议。

我在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()它的所有价值。


推荐阅读