#Data loading
#Data loading
source("estimating_paper.R")
location <- paste0(getwd(), "/")
locationdata <- paste0(location)
load(paste0(locationdata,"GDP_pc_data.RData"))
load(paste0(locationdata, "canada_maps.RData"))
load(paste0(locationdata, "codings.RData"))
load(paste0(locationdata,"population_ssp.RData"))
load(paste0(locationdata,"proj_climate.RData"))
load(paste0(locationdata,"weather_post_aug_v5anomaly.rda"))
#set the levels of provinces
province_codings <- province_codings[order(match(province_codings$abv,
c("BC", "AB", "SK", "MB", "ON", "QC",
"NB", "NS","PE", "NL",
"YT", "NT", "NU"))),]
dat$provincecode <- factor(dat$provincecode,
levels = province_codings$abv,
ordered = TRUE)
province_colors <- province_codings$colorcode
names(province_colors) <- province_codings$abv
province_colors <- province_colors[province_codings$abv %in% unique(dat$provincecode)]
#weather data
season <- c("Spring", "Summer", "Fall", "Winter")
colnames(weather_anomaly)[4:9] <- c("MTemp", "Precip", "MTemp_M", "Precip_M", "MTemp_A", "Precip_A") #M means means and A means anomalies
weather_anomaly$province <- factor(weather_anomaly$province,
levels = province_codings$abv,
ordered = TRUE)
#projected climate variables by Winnie
colnames(projected_climate_A)[5] <- "Precip_proj"
colnames(projected_climate_A)[8] <- "Precip_proj_A"
projected_climate_A$Precip_proj_A <- projected_climate_A$Precip_proj_A*100
#process seasonal weather variables
weather_anomaly <- weather_anomaly %>% dplyr::select(-c(MTemp_M, Precip_M)) %>%
pivot_wider(names_from = Season, values_from = c(MTemp,Precip,MTemp_A,Precip_A))
dat <- left_join(dat, weather_anomaly, by=c("Year"="Year", "provincecode"="province"))
dat <- dat[!dat$provincecode %in% c("NT", "YT", "NU"),]
dat$provincecode <- factor(dat$provincecode,
levels = province_codings$abv[1:10],
ordered = TRUE)
dat$Mining_DiffLog[(dat$provincecode=="PE" & dat$Year=="2004")] <- NA
# dat$GDP.per.capita_DiffLog[(dat$provincecode=="NL" & dat$Year=="2002")] <- NA
econ_indices <- read.csv('CMO_new.csv')
colnames(econ_indices)[1:2] <- c('Year','World.Bank')
econ_indices$World.Bank_log_diff <- c(NA, diff(log(econ_indices$World.Bank)))
econ_indices$Energy_log_diff <- c(NA, diff(log(econ_indices$Energy)))
econ_indices$Non.Energy_log_diff <- c(NA, diff(log(econ_indices$Non.energy)))
econ_indices$Precious.Metals_log_diff <- c(NA, diff(log(econ_indices$Precious.Metals)))
extreme_events <- read.csv('econ_events.csv')
extreme_events <- extreme_events[!extreme_events$Province %in% c("NT", "YT", "NU"),]
extreme_events$Province <- factor(extreme_events$Province,
levels = province_codings$abv[1:10],
ordered = TRUE)
extreme_events$extrem.econ <- 1
extreme_events_sum <- extreme_events %>%
group_by(Province, Year) %>%
summarise(
n_events = n(),
any_econ = max(extrem.econ),
.groups = "drop"
) %>%
complete(
Province,
Year = full_seq(1997:2017, 1), # ensures consecutive years
fill = list(
n_events = 0,
any_econ = 0
)
)
unemploy_rate <- read.csv("UnemploymentRate.csv")
unemploy_rate$unemploy_rate_log_diff <- c(NA, diff(log(unemploy_rate$unemploy_rate)))
# ggplot(unemploy_rate) + geom_line(aes(x=year, y=unemploy_rate, col=provincecode))
Linear mixed effect model with robust clustered SE for the confidence interval
#data preprocessing
Difflog_names <- colnames(dat)[grepl("_DiffLog", colnames(dat))]
dat <- dat %>%
filter(!is.na(provincecode), Year <= 2017) %>%
arrange(provincecode, Year) %>% # ensure order before lag
group_by(provincecode) %>%
mutate(
across(all_of(Difflog_names), ~ dplyr::lag(.x, n = 1), .names = "{.col}_lag"),
across(all_of(Difflog_names), ~ dplyr::lag(.x, n = 2), .names = "{.col}_lag2")
) %>%
ungroup()
dat <- dat %>%
left_join(
econ_indices %>% select(Year, World.Bank_log_diff, Energy_log_diff, Non.Energy_log_diff, Precious.Metals_log_diff),
by = c("Year" = "Year")
)
dat$provincecode <- factor(dat$provincecode,
levels = province_codings$abv[1:10],
ordered = TRUE)
dat <- dat %>%
left_join(
extreme_events_sum,
by = c("Year" = "Year", "provincecode"="Province")
)
dat <- dat %>%
left_join(
unemploy_rate %>% select('year', 'unemploy_rate_log_diff', 'provincecode'),
by = c("Year" = "year", "provincecode"="provincecode")
)
dat$Year_num <- dat$Year
dat$Year <- factor(dat$Year)
#Model 1: linear climate anomaly + gdp_lag + province_fixed + year_fixed
tmp1 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + Year + provincecode,
clusteredSE = TRUE,
note = "linear climate anomaly + year fixed")
#Model 2: quadratic climate anomaly + gdp_lag + province_fixed + year_fixed
tmp2 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
I(MTemp_A_Spring^2) + I(MTemp_A_Summer^2) +
I(MTemp_A_Fall^2) + I(MTemp_A_Winter^2) +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
I(Precip_A_Spring^2) + I(Precip_A_Summer^2) +
I(Precip_A_Fall^2) + I(Precip_A_Winter^2) +
GDP.per.capita_DiffLog_lag + Year + provincecode,
clusteredSE = TRUE,
note = "quadratic climate anomaly + year fixed")
#Model 3: linear climate anomaly + gdp_lag + province_fixed + year_fixed + interactions
tmp3 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring * Precip_A_Spring +
MTemp_A_Summer * Precip_A_Summer +
MTemp_A_Fall * Precip_A_Fall +
MTemp_A_Winter * Precip_A_Winter +
GDP.per.capita_DiffLog_lag + Year + provincecode,
clusteredSE = TRUE,
note = "linear climate anomaly + year fixed + interactions")
#Model 4: linear climate anomaly + gdp_lag + province_fixed + year_fixed + province trend
tmp4 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + Year + provincecode + provincecode*Year_num,
clusteredSE = TRUE,
note = "linear climate anomaly + year fixed + province trend")
#Model 5: linear climate anomaly + gdp_lag + province_fixed + year_fixed + economic indices
tmp5 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff,
clusteredSE = FALSE,
note = "linear climate anomaly + economic indices")
#Model 6: linear climate anomaly + gdp_lag + province_fixed + year_fixed + province trend + economic indices
tmp6 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode + provincecode*Year_num +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff,
clusteredSE = TRUE,
note = "linear climate anomaly + province trend + economic indices")
#Model 7: linear climate anomaly + gdp_lag + province_fixed + year_fixed + economic indices + dummies for structural breaks
tmp7 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff + any_econ,
clusteredSE = TRUE,
note = "linear climate anomaly + economic indices + dummies for structural breaks")
#Model 8: linear climate anomaly + gdp_lag + province_fixed + year_random + economic indices
tmp8 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode + (1|Year_num) +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff,
clusteredSE = TRUE,
note = "linear climate anomaly + year random + economic indices")
#Model 9: linear climate anomaly + gdp_lag + province_fixed + year_random + economic indices + dummies for structural breaks
tmp9 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode + (1|Year_num) +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff + any_econ,
clusteredSE = TRUE,
note = "linear climate anomaly + year_random + economic indices + dummies for structural breaks")
library(DT)
a <- combine_results(tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9)
a <- as.data.frame(a)
t.a <- as.data.frame(t(a))
datatable(t.a, options = list(
scrollX = TRUE,
scrollY = 300,
paging = FALSE
))
rb1 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + (1|Year) + provincecode,
clusteredSE = TRUE,
note = "linear climate anomaly + year random effect")
ra <- combine_results(tmp1, rb1)
ra <- as.data.frame(ra)
datatable(ra, options = list(
scrollX = TRUE,
scrollY = 300,
paging = FALSE
))
pdata <- pdata.frame(dat, index = c("provincecode", "Year"))
model_fe <- plm(GDP.per.capita_DiffLog ~ MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall +
GDP.per.capita_DiffLog_lag,
data = pdata, model = "within", effect = "twoways")
model_re <- plm(GDP.per.capita_DiffLog ~ MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall +
GDP.per.capita_DiffLog_lag,
data = pdata, random.method="swar", model = "random")
phtest(model_fe, model_re)
##
## Hausman Test
##
## data: GDP.per.capita_DiffLog ~ MTemp_A_Spring + MTemp_A_Summer + MTemp_A_Fall + ...
## chisq = 68.773, df = 8, p-value = 8.621e-12
## alternative hypothesis: one model is inconsistent
load(paste0(locationdata,"GDP_pc_data.RData"))
load(paste0(locationdata, "canada_maps.RData"))
load(paste0(locationdata, "codings.RData"))
load(paste0(locationdata,"population_ssp.RData"))
load(paste0(locationdata,"proj_climate.RData"))
load(paste0(locationdata,"weather_post_aug_anomaly_weighted_by_population.rda"))
province_codings <- province_codings[order(match(province_codings$abv,
c("BC", "AB", "SK", "MB", "ON", "QC",
"NB", "NS","PE", "NL",
"YT", "NT", "NU"))),]
dat$provincecode <- factor(dat$provincecode,
levels = province_codings$abv,
ordered = TRUE)
province_colors <- province_codings$colorcode
names(province_colors) <- province_codings$abv
province_colors <- province_colors[province_codings$abv %in% unique(dat$provincecode)]
season <- c("Spring", "Summer", "Fall", "Winter")
colnames(weather_anomaly)[4:9] <- c("MTemp", "Precip", "MTemp_M", "Precip_M", "MTemp_A", "Precip_A") #M means means and A means anomalies
weather_anomaly$province <- factor(weather_anomaly$province,
levels = province_codings$abv,
ordered = TRUE)
#projected climate variables by Winnie
colnames(projected_climate_A)[5] <- "Precip_proj"
colnames(projected_climate_A)[8] <- "Precip_proj_A"
projected_climate_A$Precip_proj_A <- projected_climate_A$Precip_proj_A*100
#process seasonal weather variables
weather_anomaly <- weather_anomaly %>% dplyr::select(-c(MTemp_M, Precip_M)) %>%
pivot_wider(names_from = Season, values_from = c(MTemp,Precip,MTemp_A,Precip_A))
dat <- left_join(dat, weather_anomaly, by=c("Year"="Year", "provincecode"="province"))
dat <- dat[!dat$provincecode %in% c("NT", "YT", "NU"),]
dat$provincecode <- factor(dat$provincecode,
levels = province_codings$abv[1:10],
ordered = TRUE)
dat$Mining_DiffLog[(dat$provincecode=="PE" & dat$Year=="2004")] <- NA
econ_indices <- read.csv('CMO_new.csv')
colnames(econ_indices)[1:2] <- c('Year','World.Bank')
econ_indices$World.Bank_log_diff <- c(NA, diff(log(econ_indices$World.Bank)))
econ_indices$Energy_log_diff <- c(NA, diff(log(econ_indices$Energy)))
econ_indices$Non.Energy_log_diff <- c(NA, diff(log(econ_indices$Non.energy)))
econ_indices$Precious.Metals_log_diff <- c(NA, diff(log(econ_indices$Precious.Metals)))
extreme_events <- read.csv('econ_events.csv')
extreme_events <- extreme_events[!extreme_events$Province %in% c("NT", "YT", "NU"),]
extreme_events$Province <- factor(extreme_events$Province,
levels = province_codings$abv[1:10],
ordered = TRUE)
extreme_events$extrem.econ <- 1
extreme_events_sum <- extreme_events %>%
group_by(Province, Year) %>%
summarise(
n_events = n(),
any_econ = max(extrem.econ),
.groups = "drop"
) %>%
complete(
Province,
Year = full_seq(1997:2017, 1), # ensures consecutive years
fill = list(
n_events = 0,
any_econ = 0
)
)
unemploy_rate <- read.csv("UnemploymentRate.csv")
unemploy_rate$unemploy_rate_log_diff <- c(NA, diff(log(unemploy_rate$unemploy_rate)))
Difflog_names <- colnames(dat)[grepl("_DiffLog", colnames(dat))]
dat <- dat %>%
filter(!is.na(provincecode), Year <= 2017) %>%
arrange(provincecode, Year) %>% # ensure order before lag
group_by(provincecode) %>%
mutate(
across(all_of(Difflog_names), ~ dplyr::lag(.x, n = 1), .names = "{.col}_lag"),
across(all_of(Difflog_names), ~ dplyr::lag(.x, n = 2), .names = "{.col}_lag2")
) %>%
ungroup()
dat <- dat %>%
left_join(
econ_indices %>% select(Year, World.Bank_log_diff, Energy_log_diff, Non.Energy_log_diff, Precious.Metals_log_diff),
by = c("Year" = "Year")
)
dat$provincecode <- factor(dat$provincecode,
levels = province_codings$abv[1:10],
ordered = TRUE)
dat <- dat %>%
left_join(
extreme_events_sum,
by = c("Year" = "Year", "provincecode"="Province")
)
dat <- dat %>%
left_join(
unemploy_rate %>% select('year', 'unemploy_rate_log_diff', 'provincecode'),
by = c("Year" = "year", "provincecode"="provincecode")
)
dat$Year_num <- dat$Year
dat$Year <- factor(dat$Year)
#Model 1: linear climate anomaly + gdp_lag + province_fixed + year_fixed
tmp1 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + Year + provincecode,
clusteredSE = TRUE,
note = "linear climate anomaly + year fixed")
#Model 2: quadratic climate anomaly + gdp_lag + province_fixed + year_fixed
tmp2 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
I(MTemp_A_Spring^2) + I(MTemp_A_Summer^2) +
I(MTemp_A_Fall^2) + I(MTemp_A_Winter^2) +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
I(Precip_A_Spring^2) + I(Precip_A_Summer^2) +
I(Precip_A_Fall^2) + I(Precip_A_Winter^2) +
GDP.per.capita_DiffLog_lag + Year + provincecode,
clusteredSE = TRUE,
note = "quadratic climate anomaly + year fixed")
#Model 3: linear climate anomaly + gdp_lag + province_fixed + year_fixed + interactions
tmp3 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring * Precip_A_Spring +
MTemp_A_Summer * Precip_A_Summer +
MTemp_A_Fall * Precip_A_Fall +
MTemp_A_Winter * Precip_A_Winter +
GDP.per.capita_DiffLog_lag + Year + provincecode,
clusteredSE = TRUE,
note = "linear climate anomaly + year fixed + interactions")
#Model 4: linear climate anomaly + gdp_lag + province_fixed + year_fixed + province trend
tmp4 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + Year + provincecode + provincecode*Year_num,
clusteredSE = TRUE,
note = "linear climate anomaly + year fixed + province trend")
#Model 5: linear climate anomaly + gdp_lag + province_fixed + year_fixed + economic indices
tmp5 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff,
clusteredSE = FALSE,
note = "linear climate anomaly + economic indices")
#Model 6: linear climate anomaly + gdp_lag + province_fixed + year_fixed + province trend + economic indices
tmp6 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode + provincecode*Year_num +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff,
clusteredSE = TRUE,
note = "linear climate anomaly + province trend + economic indices")
#Model 7: linear climate anomaly + gdp_lag + province_fixed + year_fixed + economic indices + dummies for structural breaks
tmp7 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff + any_econ,
clusteredSE = TRUE,
note = "linear climate anomaly + economic indices + dummies for structural breaks")
#Model 8: linear climate anomaly + gdp_lag + province_fixed + year_random + economic indices
tmp8 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode + (1|Year_num) +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff,
clusteredSE = TRUE,
note = "linear climate anomaly + year random + economic indices")
## Warning: Some predictor variables are on very different scales: consider
## rescaling
## Warning: Some predictor variables are on very different scales: consider
## rescaling
#Model 9: linear climate anomaly + gdp_lag + province_fixed + year_random + economic indices + dummies for structural breaks
tmp9 <- climfit(dat, GDP.per.capita_DiffLog ~ 0 + MTemp_A_Spring + MTemp_A_Summer +
MTemp_A_Fall + MTemp_A_Winter +
Precip_A_Spring + Precip_A_Summer + Precip_A_Fall + Precip_A_Winter +
GDP.per.capita_DiffLog_lag + provincecode + (1|Year_num) +
Energy_log_diff + Non.Energy_log_diff + unemploy_rate_log_diff + any_econ,
clusteredSE = TRUE,
note = "linear climate anomaly + year_random + economic indices + dummies for structural breaks")
## Warning: Some predictor variables are on very different scales: consider
## rescaling
## Warning: Some predictor variables are on very different scales: consider
## rescaling
b <- combine_results(tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9)
b <- as.data.frame(b)
t.b <- as.data.frame(t(b))
datatable(t.b, options = list(
scrollX = TRUE,
scrollY = 300,
paging = FALSE
))