## 5. ESTIMATING CAUSAL EFFECTS WITH OBSERVATIONAL DATA ## 5.3 THE EFFECT OF RUSSIAN TV ON UKRAINIANS' VOTING BEHAVIOR ## Set the working directory setwd("~/Desktop/DSS") # example of setwd() for Mac setwd("C:/user/Desktop/DSS") # example for Windows ## Load the dataset uas <- read.csv("UA_survey.csv") # reads and stores data ## Understand the data ## (Read about description of variables and unit of observation) head(uas) # shows first observations ## Identify the types of variables included ## (character vs. numeric; binary vs. non-binary) ## Identify the number of observations dim(uas) # provides dimensions of dataframe: rows, columns ### 5.3.1 USING THE SIMPLE LINEAR MODEL TO COMPUTE ### THE DIFFERENCE-IN-MEANS ESTIMATOR ## Option A: Compute the difference-in-means estimator directly mean(uas$pro_russian_vote[uas$russian_tv==1])- mean(uas$pro_russian_vote[uas$russian_tv==0]) ## Option B: Fit linear model lm(pro_russian_vote ~ russian_tv, data=uas) ### 5.3.2 CONTROLLING FOR CONFOUNDERS ### USING A MULTIPLE LINEAR REGRESSION MODEL ## Compute correlation cor(uas$within_25km, uas$russian_tv) ## Create two-way table of frequencies table(uas$within_25km, uas$russian_tv) ## Fit linear model lm(pro_russian_vote ~ russian_tv + within_25km, data=uas) ## 5.4 THE EFFECT OF RUSSIAN TV ON UKRAINIAN ELECTORAL OUTCOMES ## Load the dataset uap <- read.csv("UA_precincts.csv") # reads and stores data ## Understand the data ## (Read about description of variables and unit of observation) head(uap) # shows first observations ## Identify the types of variables included ## (character vs. numeric; binary vs. non-binary) ## Identify the number of observations dim(uap) # provides dimensions of dataframe: rows, columns ### 5.4.1 USING THE SIMPLE LINEAR MODEL TO COMPUTE ### THE DIFFERENCE-IN-MEANS ESTIMATOR ## Create pro-Russian change variable uap$pro_russian_change <- uap$pro_russian - uap$prior_pro_russian ## Create histogram hist(uap$pro_russian_change) mean(uap$pro_russian_change) median(uap$pro_russian_change) ## Fit linear model lm(pro_russian_change ~ russian_tv, data=uap) mod_ukr0 <- lm(pro_russian_change ~ russian_tv, data=uap) ### 5.4.2 CONTROLLING FOR CONFOUNDERS ### USING A MULTIPLE LINEAR REGRESSION MODEL ## Compute correlation cor(uap$within_25km, uap$russian_tv) ## Fit linear model lm(pro_russian_change ~ russian_tv + within_25km, data=uap) mod_ukr <- lm(pro_russian_change ~ russian_tv + within_25km, data=uap) summary(mod_ukr) library(modelsummary) modelsummary(mod_ukr, stars=T) modelplot(mod_ukr) mods = list("base"=mod_ukr0, "control"=mod_ukr) modelsummary(mods, stars=T) modelplot(mods) library(marginaleffects) plot_predictions(mod_ukr0, by="russian_tv") plot_predictions(mod_ukr, by=c("russian_tv","within_25km")) plot_predictions(mod_ukr, condition="russian_tv") library(performance) check_model(mod_ukr) check_outliers(mod_ukr) check_heteroscedasticity(mod_ukr) compare_performance(mod_ukr0, mod_ukr) library(report) report(mod_ukr)