3.7: Regression with Interaction Effects - Class Notes

Contents

Thursday, November 14, 2019

Overview

Another way to visualize what we’ve been covering:

suppressPackageStartupMessages(library(mosaic))

control=function(x){2+0.5*x}
treat=function(x){4+x}

ggplot(data.frame(x=c(0,10)), aes(x=x))+
  stat_function(fun=control, geom="line", size=2, color = "red")+
    geom_label(aes(x=5,y=control(5)), color = "red", label=expression(paste("slope=",hat(beta[1]))), size = 5)+
  stat_function(fun=treat, geom="line", size=2, color = "blue")+
    geom_label(aes(x=5,y=treat(5)), color = "blue", label=expression(paste("slope=",hat(beta[1])+hat(beta[3]))), size = 5)+
    scale_x_continuous(breaks=NULL,
                     limits=c(0,10),
                     expand=expand_scale(mult=c(0,0.1)))+
  scale_y_continuous(breaks=c(2,4),
                     labels=c(expression(hat(beta[0])),expression(hat(beta[0])+hat(beta[2]))),
                     limits=c(0,10),
                     expand=expand_scale(mult=c(0,0.1)))+
  labs(x = "",
       y = "")+
  theme_classic(base_family = "Fira Sans Condensed", base_size=20)
## Warning in is.na(x): is.na() applied to non-(list or vector) of type
## 'expression'
## Warning: Removed 40 rows containing missing values (geom_path).
## Warning in is.na(x): is.na() applied to non-(list or vector) of type
## 'expression'

^wagei=^β0+^β1experiencei

^wagei=^β0+^β1experiencei+^β2genderi

^wagei=^β0+^β1experiencei+^β2genderi+^β3(experiencei×genderi)

library(tidyverse)
## ── Attaching packages ─────────────────────────────── tidyverse 1.2.1 ──
## ✔ tibble  2.1.3     ✔ purrr   0.3.3
## ✔ tidyr   1.0.0     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ── Conflicts ────────────────────────────────── tidyverse_conflicts() ──
## ✖ mosaic::count()            masks dplyr::count()
## ✖ purrr::cross()             masks mosaic::cross()
## ✖ mosaic::do()               masks dplyr::do()
## ✖ tidyr::expand()            masks Matrix::expand()
## ✖ dplyr::filter()            masks stats::filter()
## ✖ ggstance::geom_errorbarh() masks ggplot2::geom_errorbarh()
## ✖ dplyr::lag()               masks stats::lag()
## ✖ tidyr::pack()              masks Matrix::pack()
## ✖ mosaic::stat()             masks ggplot2::stat()
## ✖ mosaic::tally()            masks dplyr::tally()
## ✖ tidyr::unpack()            masks Matrix::unpack()
library(wooldridge)
# Our data comes from wage1 in the wooldridge package

wages<-wooldridge::wage1
ggplot(data = wages)+
  aes(x = exper,
      y = wage)+
  geom_point()+
  geom_smooth(method="lm")+
  scale_y_continuous(labels=scales::dollar)+
  labs(x = "Experience (years)",
       y = "Wage")+
  theme_classic(base_family = "Fira Sans Condensed", base_size=20)

library(broom)
gender_reg<-lm(wage~exper+female, data = wages) %>%
  tidy()

gender_reg
## # A tibble: 3 x 5
##   term        estimate std.error statistic  p.value
##   <chr>          <dbl>     <dbl>     <dbl>    <dbl>
## 1 (Intercept)   6.63      0.286      23.2  3.73e-82
## 2 exper         0.0269    0.0111      2.42 1.60e- 2
## 3 female       -2.48      0.302      -8.21 1.75e-15
slope<-gender_reg %>%
  filter(term=="exper") %>%
  pull(estimate)
slope
## [1] 0.02691631
male_intercept<-gender_reg %>%
  filter(term=="(Intercept)")%>%
  pull(estimate)

female_intercept<-gender_reg %>%
  filter(term=="female") %>%
  pull(estimate)

female_intercept<-female_intercept+male_intercept
colors = c("1" = "pink", "0" = "blue")

ggplot(data = wages)+
  aes(x = exper,
      y = wage,
      color = as.factor(female))+
  geom_point()+
  geom_abline(slope=slope, intercept = male_intercept, size=2, color = "blue")+
  geom_abline(slope=slope, intercept = female_intercept, size=2, color = "pink")+
  geom_label(x=2.5,y=6.63, color="blue", label="6.63")+
  geom_label(x=2.5,y=4.15, color="pink", label="4.15")+
  scale_y_continuous(labels=scales::dollar)+
  scale_color_manual("Gender", labels=c("Men","Women"), values = colors)+
  guides(color=F)+
  labs(x = "Experience (years)",
       y = "Wage",
       title = "Parallel Slopes Model",
       subtitle = "wage = 6.63+0.03 Experience-2.48 Female")+
  theme_classic(base_family = "Fira Sans Condensed", base_size=20)

]

Slides

Problem Set 4 Due Thursday Nov 21

Problm Set 4 (on classes 3.1-3.5) is due by Thursday November 21