面板数据回归(宽)?

问题描述 投票:0回答:2

我正在尝试对人口运行以下 GDP 模型:

GDP_(i,t) = alpha + beta*Population_(i,t) + epsilon

这里,每个变量都按时间 (t) 和国家 (i) 进行索引。

我有一个面板数据集df1,格式如下:

UK_gdp <- c(4.1, 4.2, 3.8, 4.0)
US_gdp <- c(4.1, 4.2, 3.8, 4.0)
US_pop <- c(220, 230, 240, 260)
UK_pop <- c(40, 45, 47, 49)
year <- c("1965-01-01", "1966-01-01", "1967-01-01", "1968-01-01")
df1 <- tibble(UK_gdp, US_gdp, US_pop, UK_pop, year)

我想使用 UK_gdp、US_gdp 列作为 GDP_(i,t) 变量,以及 US_pop、UK_pop 列作为 population_(i,t) 变量的数据来运行上述回归。 有没有办法在回归中使用两国的数据?我不想为每个国家/地区运行单独的回归,而是在运行回归时将所有数据包含在模型中。我不知道该怎么做。

r dataset regression tibble panel-data
2个回答
0
投票

您需要重塑数据,以便拥有两列:gdppopulation。然后,如果您认为没有必要考虑任何特定于国家或年份的影响,则可以自由地对此类汇总数据进行回归。

# Load necessary library
library(tidyverse)

# Your initial data
UK_gdp <- c(4.1, 4.2, 3.8, 4.0)
US_gdp <- c(4.1, 4.2, 3.8, 4.0)
US_pop <- c(220, 230, 240, 260)
UK_pop <- c(40, 45, 47, 49)
year <- c("1965-01-01", "1966-01-01", "1967-01-01", "1968-01-01")
df1 <- tibble(UK_gdp, US_gdp, US_pop, UK_pop, year)

# Reshape the data
df_long <- df1 %>%
  pivot_longer(
    cols = -year, 
    names_to = c("country", ".value"), 
    names_pattern = "(.*)_(.*)"
  )

# Convert the year to date format, if necessary
df_long$year <- as.Date(df_long$year)

# View the reshaped data frame
print(df_long)

0
投票

首先,您想要将数据

reshape
转换为长格式。

> df1$year <- strftime(df1$year, '%Y')  ## this leaves just year from the date
> df1_l <- reshape(df1, varying=list(c("UK_gdp", "US_gdp"), c("US_pop", "UK_pop")),
+                  v.names=c('gdp', 'pop'), times=c('UK', 'US'), timevar='country',
+                  idvar='year', direction='long') |> `rownames<-`(NULL)
> df1_l
  year country gdp pop
1 1965      UK 4.1 220
2 1966      UK 4.2 230
3 1967      UK 3.8 240
4 1968      UK 4.0 260
5 1965      US 4.1  40
6 1966      US 4.2  45
7 1967      US 3.8  47
8 1968      US 4.0  49

您显示的方程实际上只是一个 OLS 回归,汇集了所有实体和时间段。

GDP(i,t) = alpha + beta * Population(i,t) + epsilon

> fit1 <- lm(gdp ~ pop, df1_l)
> summary(fit1)$coefficients
                 Estimate   Std. Error    t value     Pr(>|t|)
(Intercept)  4.0338312297 0.1068459675 37.7537059 2.305458e-08
pop         -0.0000624667 0.0006237552 -0.1001462 9.234907e-01

但是,更好的想法可能是使用

"country"
作为固定效果,即

GDP(i,t) = alpha_i + beta * Population(i,t) + epsilon(i,t)

> fit2 <- lfe::felm(gdp ~ pop | country, df1_l)
> summary(fit2)$coefficients
        Estimate  Std. Error    t value  Pr(>|t|)
pop -0.005082903 0.005734687 -0.8863435 0.4160214

由于国家/地区的误差项是相关的,您可能应该使用聚类标准误差,

> fit3 <- lfe::felm(gdp ~ pop | country | 0 | country, df1_l)
> summary(fit3)$coefficients
        Estimate Cluster s.e.  t value  Pr(>|t|)
pop -0.005082903  0.001638335 -3.10248 0.1985035

最后,还可能存在时间趋势(年份效应),如下所示(不使用这个小示例数据集):

GDP(i,t) = alpha_i + gamma_t + beta * Population(i,t) + epsilon(i,t)

> fit4 <- lfe::felm(gdp ~ pop | country + year | 0 | country, df1_l)

数据:

> dput(df1)
structure(list(UK_gdp = c(4.1, 4.2, 3.8, 4), US_gdp = c(4.1, 
4.2, 3.8, 4), US_pop = c(220, 230, 240, 260), UK_pop = c(40, 
45, 47, 49), year = c("1965-01-01", "1966-01-01", "1967-01-01", 
"1968-01-01")), class = "data.frame", row.names = c(NA, -4L))
© www.soinside.com 2019 - 2024. All rights reserved.