我正在尝试对人口运行以下 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) 变量的数据来运行上述回归。 有没有办法在回归中使用两国的数据?我不想为每个国家/地区运行单独的回归,而是在运行回归时将所有数据包含在模型中。我不知道该怎么做。
您需要重塑数据,以便拥有两列:gdp 和 population。然后,如果您认为没有必要考虑任何特定于国家或年份的影响,则可以自由地对此类汇总数据进行回归。
# 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)
首先,您想要将数据
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))