The attached who.csv dataset contains real-world data from 2008. The variables included follow.
Read in data
who_data <- read.csv("https://raw.githubusercontent.com/RonBalaban/CUNY-SPS-R/main/who.csv")
head(who_data)
##               Country LifeExp InfantSurvival Under5Survival  TBFree      PropMD
## 1         Afghanistan      42          0.835          0.743 0.99769 0.000228841
## 2             Albania      71          0.985          0.983 0.99974 0.001143127
## 3             Algeria      71          0.967          0.962 0.99944 0.001060478
## 4             Andorra      82          0.997          0.996 0.99983 0.003297297
## 5              Angola      41          0.846          0.740 0.99656 0.000070400
## 6 Antigua and Barbuda      73          0.990          0.989 0.99991 0.000142857
##        PropRN PersExp GovtExp TotExp
## 1 0.000572294      20      92    112
## 2 0.004614439     169    3128   3297
## 3 0.002091362     108    5184   5292
## 4 0.003500000    2589  169725 172314
## 5 0.001146162      36    1620   1656
## 6 0.002773810     503   12543  13046
plot(who_data, main="WHO Variable Correlation")


1. Provide a scatterplot of LifeExp~TotExp, and run simple linear regression. Do not transform the variables. Provide and interpret the F statistics, R^2, standard error,and p-values only. Discuss whether the assumptions of simple linear regression met.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
# Scatterplot
ggplot(who_data, aes(x= LifeExp, y= TotExp))+
  geom_point() +
  labs(x = "Average Life Expectancy", y = "Total Average Healthcare Expenditure") +
  geom_smooth(method=lm)
## `geom_smooth()` using formula = 'y ~ x'

# Make simple linear regression
Lexp_Texp.lm <- lm(LifeExp~TotExp, data=who_data)

# Histogram of residual values
hist(resid(Lexp_Texp.lm), main = "Residuals Histogram", xlab = "Residuals")

#Q-Q plot
qqnorm(Lexp_Texp.lm$residuals)
qqline(Lexp_Texp.lm$residuals)

# Get summary of our model
summary(Lexp_Texp.lm)
## 
## Call:
## lm(formula = LifeExp ~ TotExp, data = who_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -24.764  -4.778   3.154   7.116  13.292 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 6.475e+01  7.535e-01  85.933  < 2e-16 ***
## TotExp      6.297e-05  7.795e-06   8.079 7.71e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.371 on 188 degrees of freedom
## Multiple R-squared:  0.2577, Adjusted R-squared:  0.2537 
## F-statistic: 65.26 on 1 and 188 DF,  p-value: 7.714e-14

2. Raise life expectancy to the 4.6 power (i.e., LifeExp^4.6). Raise total expenditures to the 0.06 power (nearly a log transform, TotExp^.06). Plot LifeExp^4.6 as a function of TotExp^.06, and re-run the simple regression model using the transformed variables. Provide and interpret the F statistics, R^2, standard error, and p-values. Which model is “better?”
# Needed transformations
life4.6 <- who_data$LifeExp^4.6
texp.06 <- who_data$TotExp^0.06

# Re-run simple regression model with transformed variables
fit2.lm <- lm(life4.6 ~ texp.06)
summary(fit2.lm)
## 
## Call:
## lm(formula = life4.6 ~ texp.06)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -308616089  -53978977   13697187   59139231  211951764 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -736527910   46817945  -15.73   <2e-16 ***
## texp.06      620060216   27518940   22.53   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 90490000 on 188 degrees of freedom
## Multiple R-squared:  0.7298, Adjusted R-squared:  0.7283 
## F-statistic: 507.7 on 1 and 188 DF,  p-value: < 2.2e-16
# Scatterplot
plot(life4.6~texp.06, 
     xlab="Total Average Healthcare Expenditure", ylab="Average Life Expectancy",
     main="Total Expenditures vs Life Expectancy (Transformed)")
abline(fit2.lm)

# Residuals
hist(resid(fit2.lm), main = "Histogram of Residuals", xlab = "residuals")

plot(fitted(fit2.lm), resid(fit2.lm))

# QQ plot
qqnorm(fit2.lm$residuals)
qqline(fit2.lm$residuals)


3. Using the results from 3, forecast life expectancy when TotExp^.06 =1.5. Then forecast life expectancy when TotExp^.06=2.5.
lexp_forecast <- function(x)
  {   y <- -736527910 + 620060216*x
      y <- y^(1/4.6)  #Recall that we raised life4.6 <- who_data$LifeExp^4.6
    print(y)
  }


#Compute 
lexp_forecast(1.5) # 63.31153
## [1] 63.31153
lexp_forecast(2.5) # 86.50645
## [1] 86.50645

4. Build the following multiple regression model and interpret the F Statistics, R^2, standard error, and p-values. How good is the model?
# Multiple regression model
fit3.lm <- lm(LifeExp ~ PropMD + TotExp + PropMD*TotExp, data = who_data)
summary(fit3.lm)
## 
## Call:
## lm(formula = LifeExp ~ PropMD + TotExp + PropMD * TotExp, data = who_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -27.320  -4.132   2.098   6.540  13.074 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    6.277e+01  7.956e-01  78.899  < 2e-16 ***
## PropMD         1.497e+03  2.788e+02   5.371 2.32e-07 ***
## TotExp         7.233e-05  8.982e-06   8.053 9.39e-14 ***
## PropMD:TotExp -6.026e-03  1.472e-03  -4.093 6.35e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.765 on 186 degrees of freedom
## Multiple R-squared:  0.3574, Adjusted R-squared:  0.3471 
## F-statistic: 34.49 on 3 and 186 DF,  p-value: < 2.2e-16
# Plots
hist(resid(fit3.lm), xlab = "residuals")

plot(fitted(fit3.lm), resid(fit3.lm))

The model with additional predictors and interaction terms is better than the original model (Lexp_Texp.lm). The 3 variables; PropMD, TotExp, and PropMD*TotExp all have small p-values. However, the R^2 values are only 35%, and the F-statistic is not as large as the prior model (fit2). The residuals themselves have a strong right skew and show an inconsistent variance and non-normal distribution. The p-value is small, which is statically significant. This linear model is better than the first, but worse than the second.


5. Forecast LifeExp when PropMD=.03 and TotExp = 14. Does this forecast seem realistic? Why or why not?
# Test date
test_data <- data.frame(TotExp = c(14), PropMD = c(.03))

# Predict life expectancy from model
predicted_life_exp <- predict(fit3.lm, newdata = test_data)
print(predicted_life_exp)
##       1 
## 107.696