Using least absolute deviation with geom_smooth

Viewed 90

I have data as follows:

library(quantreg)
library(ggplot2)

data <- structure(list(country_mean_rep = structure(c(73.6995708154506, 
93.5501285347044, 85.1529051987768, 91.1017369727047, 79.5562130177515, 
84.6751054852321, 89.8, 86.8826405867971, 94.2247191011236, 70.2321428571429, 
88.4107142857143), label = "label", format.stata = "%9.2f"), 
    country_mean_crime = c(0.0944206008583691, 0.0565552699228792, 
    0.0336391437308868, 0.205955334987593, 0.130177514792899, 
    0.282700421940928, 0.220512820512821, 0.415647921760391, 
    0.387640449438202, 0.200892857142857, 0.292207792207792), 
    country_name = structure(c(1L, 2L, 3L, 4L, 5L, 7L, 11L, 12L, 
    14L, 16L, 20L), .Label = c("Albania", "Armenia", "Azerbaijan", 
    "Belarus", "Bosnia and Herzegovina", "Brazil", "Bulgaria", 
    "Cambodia", "Chile", "CostaRica", "Croatia", "Czech", "Ecuador", 
    "Estonia", "FYROM", "Georgia", "Germany", "Greece", "Guyana", 
    "Hungary", "Ireland", "Kazakhstan", "Kenya", "Kyrgyzstan", 
    "Latvia", "Lithuania", "Malawi", "Mali", "Moldova", "Philippines", 
    "Poland", "Portugal", "Romania", "Russia", "Senegal", "Serbia&Montenegro", 
    "Slovakia", "Slovenia", "South Africa", "South Korea", "Spain", 
    "SriLanka", "Tajikistan", "Turkey", "Ukraine", "Uzbekistan", 
    "Vietnam"), class = "factor")), row.names = c(NA, -11L), class = c("data.table", 
"data.frame"))

# On which I like to run the following code:

ggplot(data, aes(x=country_mean_rep, y=country_mean_crime)) + 
  geom_point() + 
  geom_smooth(aes(colour="linear", fill="linear"), 
              method="lm", 
              formula=y ~ x, ) +
  labs(colour="Functional Form", fill="Functional Form") +
  geom_text(aes(label=country_name), nudge_y=0.02) +
  theme_bw()

I would like to add a regression line that uses least absolute deviation, so I tried:

ggplot(data, aes(x=country_mean_rep, y=country_mean_crime)) + 
  geom_point() + 
  geom_smooth(aes(colour="linear", fill="linear"), 
              method="lm", 
              formula=y ~ x, ) +
  geom_smooth(aes(colour="least absolute deviation", fill="least absolute deviation"), 
          method="qr", 
          formula=y ~ x, ) + 
  labs(colour="Functional Form", fill="Functional Form") +
  geom_text(aes(label=country_name), nudge_y=0.02) +
  theme_bw()

I get the following error:

Computation failed in `stat_smooth()`:
invalid first argument 

Could anyone help me figure this out?

1 Answers

Your attempt didn't work because you specified "qr" as the method for geom_smooth rather than "rq", which gives you a least absolute deviation best fit line.

ggplot(data, aes(x=country_mean_rep, y=country_mean_crime)) + 
  geom_point() + 
  geom_smooth(aes(colour="Linear", fill="Linear"), 
              method="lm", 
              formula=y ~ x,
              se = F) +
  geom_smooth(aes(colour="Least Absolute Deviation", fill="Least Absolute Deviation"), 
              method="rq",
              se = F,
              formula = y ~ x) +
  labs(colour="Functional Form", fill="Functional Form") +
  geom_text(aes(label=country_name), nudge_y=0.02) +
  theme_bw()

Output:

Linear and Least Absolute Deviation Output

The caveat of this solution is that for it to work, you have to set se = F for your least absolute deviation line, which means you can't plot confidence intervals for this model. You can still have your confidence interval for the linear model if you like; just set se = T in the respective geom_smooth call.

Related