#####################################################################################
# Mapping EQ-5D using the CAT
# Jaeok Lim
# 2018.03.20
#####################################################################################

#install.packages('AER')
library(AER) # tobit
if(!require(betareg)){install.packages("betareg")} # betareg

copdqol=read.csv("copdqol.csv")
str(copdqol)
# Table 1. Patient Characteristics
summary(copdqol)
copdqol$bmi4l = cut(copdqol$bmi, c(0, 18.5, 25, 30, 40), right = F, include.lowest = T )
summary(copdqol$bmi4l)
attach(copdqol)
table(sex)
table(severity)
table(eq1)
table(eq2)
table(eq3)
table(eq4)
table(eq5)

cor(cbind(cat1, cat2, cat3, cat4, cat5, cat6, cat7, cat8), cbind(eq1, eq2, eq3, eq4, eq5))
detach(copdqol)

sel = copdqol[,c("id", 'age', 'sex',"severity", 'eq1', 'eq2', 'eq3', 'eq4', 'eq5', 
                 'eq5d_util', 'perfect_health', "cat1", "cat2", "cat3", "cat4", "cat5", "cat6", "cat7", "cat8", "total_cat")]
summary(sel)
# Table 2. mean, sd
for (i in c('eq5d_util', "total_cat", "cat1", "cat2", "cat3", "cat4", "cat5", "cat6", "cat7", "cat8")) cat(i, mean(sel[,i]), sd(sel[,i]), "\n")

### model1 Total CAT score model 
# OLS
ols1 = lm(eq5d_util~total_cat+age+sex, data = sel)
summary(ols1)
summary(ols1)$sigma # RMSE = 0.1105891
sum(abs(ols1$residuals))/ols1$df.residual # mae 0.08117308

plot(eq5d_util~total_cat, data=sel); abline(lm(eq5d_util~total_cat, data=sel), col='red')
plot(sel$eq5d_util, ols1$fitted.values, xlim = c(0.2, 1), ylim = c(0.2, 1), 
     xlab = 'EQ-5D observed', ylab = 'EQ-5D predicted OLS1')
abline(0, 1, col=2)
# OLS-sq
summary(ols1sq <- lm(eq5d_util~total_cat+I(total_cat^2)+age+sex, data=sel))
summary(ols1sq)$sigma # RMSE = 0.1101714
sum(abs(ols1sq$residuals))/ols1sq$df.residual # mae 0.08312004
# tobit1
library(AER)
tobit1 = tobit(eq5d_util~total_cat+age+sex, left = 0, right = 1, data = sel)
summary(tobit1)
names(tobit1)
yhat = tobit1$linear.predictors
yhat[yhat>1]=1
sqrt(sum((yhat-sel$eq5d_util)^2)/tobit1$df.residual) # rmse 0.1157117
sum(abs(yhat-sel$eq5d_util))/tobit1$df.residual # mae 0.08324884
# tobit-sq
tobit1sq = tobit(eq5d_util~total_cat+I(total_cat^2)+age+sex, left = 0, right = 1, data = sel)
summary(tobit1sq)
yhat = tobit1sq$linear.predictors
yhat[yhat>1]=1
sqrt(sum((yhat-sel$eq5d_util)^2)/tobit1$df.residual) # rmse 0.1159515
sum(abs(yhat-sel$eq5d_util))/tobit1$df.residual # mae 0.0829045
# GLM gaussian(link = 'log')
glm1 = glm(eq5d_util~total_cat+age+sex, data = sel, family = gaussian(link = 'log'))
summary(glm1) # AIC: -458.53
sqrt(sum((glm1$fitted.values-sel$eq5d_util)^2)/glm1$df.residual) # rmse = 0.1112812 
sum(abs(glm1$fitted.values-sel$eq5d_util))/glm1$df.residual # mae = 0.08063205 
# GLM gaussian(link = 'log') sq
glm1sq = glm(eq5d_util~total_cat+I(total_cat^2)+age+sex, data = sel, family = gaussian(link = 'log'))
summary(glm1sq) # AIC: -461.67
sqrt(sum((glm1sq$fitted.values-sel$eq5d_util)^2)/glm1sq$df.residual) # rmse = 0.1105151 
sum(abs(glm1sq$fitted.values-sel$eq5d_util))/glm1sq$df.residual # mae = 0.08267102 
# GLM Gamma(link = "inverse") 
glm1gamma = glm(eq5d_util~total_cat+age+sex, data = sel, family = Gamma)
summary(glm1gamma)
sqrt(sum(glm1gamma$residuals^2)/glm1gamma$df.residual) # rmse = 0.1964873
sum(abs(glm1gamma$residuals))/glm1gamma$df.residual # mae = 0.1265597
# GLM quasi(link = "identity", variance = "constant")
glm1inv = glm(eq5d_util~total_cat+age+sex, data = sel, family = inverse.gaussian)
summary(glm1inv)
sqrt(sum(glm1inv$residuals^2)/glm1inv$df.residual) # rmse = 0.1964873
sum(abs(glm1inv$residuals))/glm1inv$df.residual # mae = 0.1265597
# GLM quasi(link = "identity", variance = "constant") 
glm1quasi = glm(eq5d_util~total_cat+age+sex, data = sel, family = quasi)
summary(glm1quasi)
sqrt(sum(glm1quasi$residuals^2)/glm1quasi$df.residual) # rmse = 0.1964873
sum(abs(glm1quasi$residuals))/glm1quasi$df.residual # mae = 0.1265597
# beta regression
if(!require(betareg)){install.packages("betareg")}
sel$betay = (sel$eq5d_util*(nrow(sel)-1)+0.5)/nrow(sel)
summary(sel$betay) 
beta1 = betareg(betay~total_cat+age+sex, data = sel)
sqrt(sum(beta1$residuals^2)/beta1$df.residual) # rmse = 0.111161 
sum(abs(beta1$residuals))/beta1$df.residual # mae = 0.08626448 
sqrt(sum((sel$eq5d_util-beta1$fitted.values)^2)/beta1$df.residual) # rmse = 0.1114702 
sum(abs(sel$eq5d_util-beta1$fitted.values))/beta1$df.residual # mae = 0.08659026 
plot(sel$eq5d_util, beta1$fitted.values, xlim = c(0.2, 1), ylim = c(0.2, 1), 
     xlab = 'EQ-5D observed', ylab = 'EQ-5D predicted beta1')
abline(0, 1, col=2) 
# beta sq
beta1sq = betareg(betay~total_cat+I(total_cat^2)+age+sex, data = sel)
sqrt(sum((sel$eq5d_util-beta1sq$fitted.values)^2)/beta1sq$df.residual) # rmse = 0.1116405 
sum(abs(sel$eq5d_util-beta1sq$fitted.values))/beta1sq$df.residual # mae = 0.08651495 


## 2part model 
two1.logit = glm(perfect_health ~ total_cat+age+sex, data = sel, family = 'binomial') 
# ols1
pred.two1ols1 = two1.logit$fitted.values + (1-two1.logit$fitted.values)*ols1$fitted.values
sqrt(sum( (pred.two1ols1-sel$eq5d_util)^2 )/ols1$df.residual) # rmse 0.1145567
sum( abs(pred.two1ols1-sel$eq5d_util) )/ols1$df.residual # mae 0.08236606
# ols1sq
pred.two1ols1sq = two1.logit$fitted.values + (1-two1.logit$fitted.values)*ols1sq$fitted.values
sqrt(sum( (pred.two1ols1sq-sel$eq5d_util)^2 )/ols1sq$df.residual) # rmse 0.1146116
sum( abs(pred.two1ols1sq-sel$eq5d_util) )/ols1sq$df.residual # mae 0.08391098
# tobit1
pred.two1tobit1 = two1.logit$fitted.values + (1-two1.logit$fitted.values)*ifelse(tobit1$linear.predictors>1, 1, tobit1$linear.predictors)
sqrt(sum( (pred.two1tobit1-sel$eq5d_util)^2 )/tobit1$df.residual) # rmse 0.1207393
sum( abs(pred.two1tobit1-sel$eq5d_util) )/tobit1$df.residual # mae 0.08677902
# tobit1sq
pred.two1tobit1sq = two1.logit$fitted.values + (1-two1.logit$fitted.values)*ifelse(tobit1sq$linear.predictors>1, 1, tobit1sq$linear.predictors)
sqrt(sum( (pred.two1tobit1sq-sel$eq5d_util)^2 )/tobit1sq$df.residual) # rmse 0.1209245
sum( abs(pred.two1tobit1sq-sel$eq5d_util) )/tobit1sq$df.residual # mae 0.08657979
# GLM gaussian(link = 'log')
pred.two1glm1 = two1.logit$fitted.values + (1-two1.logit$fitted.values)*glm1$fitted.values
sqrt(sum( (pred.two1glm1-sel$eq5d_util)^2 )/glm1$df.residual) # rmse 0.1147914
sum( abs(pred.two1glm1-sel$eq5d_util) )/glm1$df.residual # mae 0.08168007
# GLM gaussian(link = 'log')sq
pred.two1glm1sq = two1.logit$fitted.values + (1-two1.logit$fitted.values)*glm1sq$fitted.values
sqrt(sum( (pred.two1glm1sq-sel$eq5d_util)^2 )/glm1sq$df.residual) # rmse 0.1148063
sum( abs(pred.two1glm1sq-sel$eq5d_util) )/glm1sq$df.residual # mae 0.08355911
# beta
pred.two1beta1 = two1.logit$fitted.values + (1-two1.logit$fitted.values)*beta1$fitted.values
sqrt(sum( (pred.two1beta1-sel$eq5d_util)^2 )/beta1$df.residual) # rmse 0.1166701
sum( abs(pred.two1beta1-sel$eq5d_util) )/beta1$df.residual # mae 0.08709279
# beta sq
pred.two1beta1sq = two1.logit$fitted.values + (1-two1.logit$fitted.values)*beta1sq$fitted.values
sqrt(sum( (pred.two1beta1sq-sel$eq5d_util)^2 )/beta1sq$df.residual) # rmse 0.1168008
sum( abs(pred.two1beta1sq-sel$eq5d_util) )/beta1sq$df.residual # mae 0.08705945


### model3 each question model 
# OLS3
ols2 = lm(eq5d_util ~ cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, data = sel)
summary(ols2)$sigma # RMSE = 0.1059168
sum(abs(ols2$residuals))/ols2$df.residual # 0.07816128
# tobit3
tobit2 = tobit(eq5d_util~cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, left = 0, right = 1, data = sel)
yhat = ifelse(tobit2$linear.predictors>1, 1, tobit2$linear.predictors)
sqrt(sum((yhat-sel$eq5d_util)^2)/tobit2$df.residual) # rmse = 0.1114472
sum(abs(yhat-sel$eq5d_util))/tobit2$df.residual # mae = 0.07873606
# GLM3 gaussian(link = 'log')
glm2 = glm(eq5d_util ~ cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, data = sel, family = gaussian(link = 'log'))
sqrt(sum((glm2$fitted.values-sel$eq5d_util)^2)/glm2$df.residual) # rmse = 0.1069957 
sum(abs(glm2$fitted.values-sel$eq5d_util))/glm2$df.residual # mae = 0.07769273 
# beta3
beta2 = betareg(betay~cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, data = sel)
sqrt(sum((sel$eq5d_util-beta2$fitted.values)^2)/beta2$df.residual) # rmse = 0.1073621
sum(abs(sel$eq5d_util-beta2$fitted.values))/beta2$df.residual # mae = 0.08406389

## 2part model 3
two2.logit = glm(perfect_health ~ cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, data = sel, family = 'binomial')
# ols3
pred.two2ols2 = two2.logit$fitted.values + (1-two2.logit$fitted.values)*ols2$fitted.values
sqrt(sum( (pred.two2ols2-sel$eq5d_util)^2 )/ols2$df.residual) # rmse 0.1090594
sum( abs(pred.two2ols2-sel$eq5d_util) )/ols2$df.residual # mae 0.07677168
# tobit3
pred.two2tobit2 = two2.logit$fitted.values + (1-two2.logit$fitted.values)*ifelse(tobit2$linear.predictors>1, 1, tobit2$linear.predictors)
sqrt(sum( (pred.two2tobit2-sel$eq5d_util)^2 )/tobit2$df.residual) # rmse 0.1207393
sum( abs(pred.two2tobit2-sel$eq5d_util) )/tobit2$df.residual # mae 0.08677902
# GLM3 gaussian(link = 'log')
pred.two2glm2 = two2.logit$fitted.values + (1-two2.logit$fitted.values)*glm2$fitted.values
sqrt(sum( (pred.two2glm2-sel$eq5d_util)^2 )/glm2$df.residual) # rmse 0.1147914
sum( abs(pred.two2glm2-sel$eq5d_util) )/glm2$df.residual # mae 0.08168007
# beta3
pred.two2beta2 = two2.logit$fitted.values + (1-two2.logit$fitted.values)*beta2$fitted.values
sqrt(sum( (pred.two2beta2-sel$eq5d_util)^2 )/beta2$df.residual) # rmse 0.1166701
sum( abs(pred.two2beta2-sel$eq5d_util) )/beta2$df.residual # mae 0.08709279


### bootstrap
ols1_rmse = NULL 
ols1_mae = NULL
ols1sq_rmse = NULL
ols1sq_mae = NULL
glm1_rmse = NULL
glm1_mae = NULL
glm1sq_rmse = NULL
glm1sq_mae = NULL
tobit1_rmse = NULL
tobit1_mae = NULL
tobit1sq_rmse = NULL
tobit1sq_mae = NULL
beta1_rmse = NULL
beta1_mae = NULL
beta1sq_rmse = NULL
beta1sq_mae = NULL

two_ols1_rmse = NULL
two_ols1_mae = NULL
two_ols1sq_rmse = NULL
two_ols1sq_mae = NULL
two_glm1_rmse = NULL
two_glm1_mae = NULL
two_glm1sq_rmse = NULL
two_glm1sq_mae = NULL
two_tobit1_rmse = NULL
two_tobit1_mae = NULL
two_tobit1sq_rmse = NULL
two_tobit1sq_mae = NULL
two_beta1_rmse = NULL
two_beta1_mae = NULL
two_beta1sq_rmse = NULL
two_beta1sq_mae = NULL

ols2_rmse = NULL
ols2_mae = NULL
glm2_rmse = NULL
glm2_mae = NULL
tobit2_rmse = NULL
tobit2_mae = NULL
beta2_rmse = NULL
beta2_mae = NULL

two_ols2_rmse = NULL
two_ols2_mae = NULL
two_glm2_rmse = NULL
two_glm2_mae = NULL
two_tobit2_rmse = NULL
two_tobit2_mae = NULL
two_beta2_rmse = NULL
two_beta2_mae = NULL


set.seed(1)
system.time(
for (i in 1:10000) {
  train = sample(1:299, 150)
  valid = setdiff(1:299, train)
  # OLS1
  ols1 = lm(eq5d_util~total_cat+age+sex, data = sel[train,])
  pred = predict(ols1, newdata=sel[valid,])
  ols1_rmse = c(ols1_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  ols1_mae = c(ols1_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # OLS1-sq
  ols1sq <- lm(eq5d_util~total_cat+I(total_cat^2)+age+sex, data=sel[train,])
  pred = predict(ols1sq, newdata=sel[valid,])
  ols1sq_rmse = c(ols1sq_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  ols1sq_mae = c(ols1sq_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # GLM gaussian(link = 'log')
  glm1 = glm(eq5d_util~total_cat+age+sex, data = sel[train,], family = gaussian(link = 'log'))
  pred = predict(glm1, newdata=sel[valid,], type='response' )
  glm1_rmse = c(glm1_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  glm1_mae = c(glm1_mae, mean( abs(pred-sel[valid,]$eq5d_util) ) )
  # GLM gaussian(link = 'log') sq
  glm1sq = glm(eq5d_util~total_cat+I(total_cat^2)+age+sex, data = sel[train,], family = gaussian(link = 'log'))
  pred = predict(glm1sq, newdata=sel[valid,], type='response' )
  glm1sq_rmse = c(glm1sq_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  glm1sq_mae = c(glm1sq_mae, mean( abs(pred-sel[valid,]$eq5d_util) ) )
  # tobit1
  tobit1 = tobit(eq5d_util~total_cat+age+sex, left = 0, right = 1, data = sel[train,])
  pred = ifelse(predict(tobit1, newdata = sel[valid,])>1, 1, predict(tobit1, newdata = sel[valid,]))
  tobit1_rmse = c(tobit1_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  tobit1_mae = c(tobit1_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # tobit1-sq
  tobit1sq = tobit(eq5d_util~total_cat+I(total_cat^2)+age+sex, left = 0, right = 1, data = sel[train,])
  pred = ifelse(predict(tobit1sq, newdata = sel[valid,])>1, 1, predict(tobit1sq, newdata = sel[valid,]))
  tobit1sq_rmse = c(tobit1sq_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  tobit1sq_mae = c(tobit1sq_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # beta regression
  sel$betay = (sel$eq5d_util*(nrow(sel)-1)+0.5)/nrow(sel)
  beta1 = betareg(betay~total_cat+age+sex, data = sel[train,])
  pred = predict(beta1, newdata=sel[valid,])
  beta1_rmse = c(beta1_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  beta1_mae = c(beta1_mae, mean( abs(pred-sel[valid,]$eq5d_util) ) )
  # beta sq
  beta1sq = betareg(betay~total_cat+I(total_cat^2)+age+sex, data = sel[train,])
  pred = predict(beta1sq, newdata=sel[valid,])
  beta1sq_rmse = c(beta1sq_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  beta1sq_mae = c(beta1sq_mae, mean( abs(pred-sel[valid,]$eq5d_util) ) )
  
  ## 2part model 
  two1.logit = glm(perfect_health ~ total_cat+age+sex, data = sel[train,], family = 'binomial') 
  pred1 = predict(two1.logit, newdata=sel[valid,], type = 'response')
  # two_ols1
  pred = pred1 + (1-pred1)*predict(ols1, newdata=sel[valid,])
  two_ols1_rmse = c(two_ols1_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_ols1_mae = c(two_ols1_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # two_ols1sq
  pred = pred1 + (1-pred1)*predict(ols1sq, newdata=sel[valid,])
  two_ols1sq_rmse = c(two_ols1sq_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_ols1sq_mae = c(two_ols1sq_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # two_GLM gaussian(link = 'log')
  pred = pred1 + (1-pred1)*predict(glm1, newdata=sel[valid,], type='response' )
  two_glm1_rmse = c(two_glm1_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_glm1_mae = c(two_glm1_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # two_GLM gaussian(link = 'log')sq
  pred = pred1 + (1-pred1)*predict(glm1sq, newdata=sel[valid,], type='response' )
  two_glm1sq_rmse = c(two_glm1sq_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_glm1sq_mae = c(two_glm1sq_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # two_tobit1
  pred = pred1 + (1-pred1)*ifelse(predict(tobit1, newdata = sel[valid,])>1, 1, predict(tobit1, newdata = sel[valid,]))
  two_tobit1_rmse = c(two_tobit1_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_tobit1_mae = c(two_tobit1_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # two_tobit1sq
  pred = pred1 + (1-pred1)*ifelse(predict(tobit1sq, newdata = sel[valid,])>1, 1, predict(tobit1sq, newdata = sel[valid,]))
  two_tobit1sq_rmse = c(two_tobit1sq_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_tobit1sq_mae = c(two_tobit1sq_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
    # two_beta
  pred = pred1 + (1-pred1)*predict(beta1, newdata=sel[valid,])
  two_beta1_rmse = c(two_beta1_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_beta1_mae = c(two_beta1_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # two_beta sq
  pred = pred1 + (1-pred1)*predict(beta1sq, newdata=sel[valid,])
  two_beta1sq_rmse = c(two_beta1sq_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_beta1sq_mae = c(two_beta1sq_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  
  ## model2 each question model 
  # OLS2
  ols2 = lm(eq5d_util ~ cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, data = sel[train,])
  pred = predict(ols2, newdata=sel[valid,])
  ols2_rmse = c(ols2_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  ols2_mae = c(ols2_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # GLM2 gaussian(link = 'log')
  glm2 = glm(eq5d_util ~ cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, data = sel[train,], family = gaussian(link = 'log'))
  pred = predict(glm2, newdata=sel[valid,], type='response' )
  glm2_rmse = c(glm2_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  glm2_mae = c(glm2_mae, mean( abs(pred-sel[valid,]$eq5d_util) ) )
  # tobit2
  tobit2 = tobit(eq5d_util~cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, left = 0, right = 1, data = sel[train,])
  pred = ifelse(predict(tobit2, newdata = sel[valid,])>1, 1, predict(tobit2, newdata = sel[valid,]))
  tobit2_rmse = c(tobit2_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  tobit2_mae = c(tobit2_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # beta2
  beta2 = betareg(betay~cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, data = sel[train,])
  pred = predict(beta2, newdata=sel[valid,])
  beta2_rmse = c(beta2_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  beta2_mae = c(beta2_mae, mean( abs(pred-sel[valid,]$eq5d_util) ) )
  
  ## 2part model 2
  two2.logit = glm(perfect_health ~ cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, data = sel[train,], family = 'binomial')
  pred1 = predict(two2.logit, newdata=sel[valid,], type = 'response')
  # two_ols2
  pred = pred1 + (1-pred1)*predict(ols2, newdata=sel[valid,])
  two_ols2_rmse = c(two_ols2_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_ols2_mae = c(two_ols2_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # two_GLM gaussian(link = 'log')
  pred = pred1 + (1-pred1)*predict(glm2, newdata=sel[valid,], type='response' )
  two_glm2_rmse = c(two_glm2_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_glm2_mae = c(two_glm2_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
  # two_tobit2
  pred = pred1 + (1-pred1)*ifelse(predict(tobit2, newdata = sel[valid,])>1, 1, predict(tobit2, newdata = sel[valid,]))
  two_tobit2_rmse = c(two_tobit2_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_tobit2_mae = c(two_tobit2_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
    # two_beta
  pred = pred1 + (1-pred1)*predict(beta2, newdata=sel[valid,])
  two_beta2_rmse = c(two_beta2_rmse, sqrt( mean( (pred-sel[valid,]$eq5d_util)^2 ) ) )
  two_beta2_mae = c(two_beta2_mae, mean( abs(pred-sel[valid,]$eq5d_util) )  )
}
)


mean(ols1_rmse) 
mean(ols1_rmse[1:100])
mean(ols1_rmse[1:1000])
mean(ols1_mae) 
hist(ols1_rmse, freq = F); lines(density(ols1_rmse), col=2)
hist(ols1_mae, freq = F); lines(density(ols1_mae), col=2)
summary(ols1_rmse) 
sd(ols1_rmse) 
shapiro.test(ols1_rmse[1:5000])
shapiro.test(ols1_rmse[1:1000])
shapiro.test(ols1_rmse[1:100])
summary(ols1_mae)
sd(ols1_mae) 

# mean, sd
mean(ols1_rmse); sd(ols1_rmse); mean(ols1_mae); sd(ols1_mae)
mean(ols1sq_rmse); sd(ols1sq_rmse); mean(ols1sq_mae); sd(ols1sq_mae)
mean(glm1_rmse); sd(glm1_rmse); mean(glm1_mae); sd(glm1_mae)
mean(glm1sq_rmse); sd(glm1sq_rmse); mean(glm1sq_mae); sd(glm1sq_mae)
mean(tobit1_rmse); sd(tobit1_rmse); mean(tobit1_mae); sd(tobit1_mae)
mean(tobit1sq_rmse); sd(tobit1sq_rmse); mean(tobit1sq_mae); sd(tobit1sq_mae) 
mean(beta1_rmse); sd(beta1_rmse); mean(beta1_mae); sd(beta1_mae)
mean(beta1sq_rmse); sd(beta1sq_rmse); mean(beta1sq_mae); sd(beta1sq_mae)

mean(ols2_rmse); sd(ols2_rmse); mean(ols2_mae); sd(ols2_mae)
mean(glm2_rmse); sd(glm2_rmse); mean(glm2_mae); sd(glm2_mae)
mean(tobit2_rmse); sd(tobit2_rmse); mean(tobit2_mae); sd(tobit2_mae)
mean(beta2_rmse); sd(beta2_rmse); mean(beta2_mae); sd(beta2_mae)

mean(two_ols1_rmse); sd(two_ols1_rmse); mean(two_ols1_mae); sd(two_ols1_mae)
mean(two_ols1sq_rmse); sd(two_ols1sq_rmse); mean(two_ols1sq_mae); sd(two_ols1sq_mae)
mean(two_glm1_rmse); sd(two_glm1_rmse); mean(two_glm1_mae); sd(two_glm1_mae)
mean(two_glm1sq_rmse); sd(two_glm1sq_rmse); mean(two_glm1sq_mae); sd(two_glm1sq_mae)
mean(two_tobit1_rmse); sd(two_tobit1_rmse); mean(two_tobit1_mae); sd(two_tobit1_mae)
mean(two_tobit1sq_rmse); sd(two_tobit1sq_rmse); mean(two_tobit1sq_mae); sd(two_tobit1sq_mae) 
mean(two_beta1_rmse); sd(two_beta1_rmse); mean(two_beta1_mae); sd(two_beta1_mae)
mean(two_beta1sq_rmse); sd(two_beta1sq_rmse); mean(two_beta1sq_mae); sd(two_beta1sq_mae)

mean(two_ols2_rmse); sd(two_ols2_rmse); mean(two_ols2_mae); sd(two_ols2_mae)
mean(two_glm2_rmse); sd(two_glm2_rmse); mean(two_glm2_mae); sd(two_glm2_mae)
mean(two_tobit2_rmse); sd(two_tobit2_rmse); mean(two_tobit2_mae); sd(two_tobit2_mae)
mean(two_beta2_rmse); sd(two_beta2_rmse); mean(two_beta2_mae); sd(two_beta2_mae)



# Comparison of observed and predicted utility scores using different models (Hoyle, 2016 Table3)
summary(sel$eq5d_util)
# Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
# 0.095   0.723   0.817   0.831   1.000   1.000 
sel$u5 = cut(sel$eq5d_util, c(0, 0.2, 0.4, 0.6, 0.8, 1), right = F, include.lowest = T )
summary(sel$u5)
# [0,0.2) [0.2,0.4) [0.4,0.6) [0.6,0.8)   [0.8,1] 
# 3         2         9        98       187 
aggregate(eq5d_util~u5, data = sel, mean )
#          u5   eq5d_util
# 1   [0,0.2) 0.1580000
# 2 [0.2,0.4) 0.3675000
# 3 [0.4,0.6) 0.5350000
# 4 [0.6,0.8) 0.7247041
# 5   [0.8,1] 0.9166364



# recommend model 
ols1 = lm(eq5d_util~total_cat+age+sex, data = sel)
summary(ols1)
summary(lm(eq5d_util~total_cat+age, data = sel))
summary( ols1 <- lm(eq5d_util~total_cat+age, data = sel) ) 

ols2 = lm(eq5d_util ~ cat1+cat2+cat3+cat4+cat5+cat6+cat7+cat8+age+sex, data = sel)
step(ols2)
summary(lm(eq5d_util ~ cat3+cat4+cat5+cat6+cat8, data = sel))
summary(ols2 <- lm(eq5d_util ~ cat3+cat4+cat5+cat6+cat8+age, data = sel) ) 

# EQ-5D Utility 
summary(sel$u5)
aggregate(eq5d_util~u5, data = sel, summary )

sel$fit1 = ols1$fitted.values
sel$fit2 = ols2$fitted.values
aggregate(fit1~u5, data = sel, summary )
aggregate(fit2~u5, data = sel, summary )

# severity
summary(sel$severity1)
table(sel$severity1)
aggregate(eq5d_util~severity1, data = sel, mean )
aggregate(eq5d_util~severity1, data = sel, sd )
aggregate(fit1~severity1, data = sel, mean )
aggregate(fit1~severity1, data = sel, sd )
aggregate(fit2~severity1, data = sel, mean )
aggregate(fit2~severity1, data = sel, sd )



# Fig. 1 Scatter plots of the observed and predicted EQ-5D utility values
par(mfrow=c(1,2))
plot(sel$eq5d_util, ols1$fitted.values, xlim = c(0.2, 1), ylim = c(0.2, 1), 
     main = 'OLS1', xlab = 'EQ-5D observed', ylab = 'EQ-5D predicted OLS1')
abline(0, 1, col=2)

plot(sel$eq5d_util, ols2$fitted.values, xlim = c(0.2, 1), ylim = c(0.2, 1), 
     main = 'OLS3', xlab = 'EQ-5D observed', ylab = 'EQ-5D predicted OLS3')
abline(0, 1, col=2)
par(mfrow=c(1,1))

# scatter, histogram
plot(total_cat~eq5d_util, data=sel); # abline(lm(total_cat~eq5d_util, data=sel), col='red')
par(mfrow=c(1,2))
hist(sel$eq5d_util, xlab = 'EQ-5D Utility', main = '', col = 2)
hist(sel$total_cat, xlab = 'CAT total', main = '', col = 2)
par(mfrow=c(1,1))

# severity
table(sel$severity1)
boxplot(eq5d_util~severity1, data=sel, ylim = c(0.2, 1), xlab='severity1', ylab='EQ-5D Utility')
plot(factor(sel$severity1), ols1$fitted.values, ylim = c(0.2, 1), xlab='severity1', ylab='EQ-5D predicted OLS1') 
lm(eq5d_util~total_cat+age+sex+factor(severity1), data = sel)

par(mfrow=c(1,2))
boxplot(eq5d_util~severity1, data=sel, ylim = c(0.2, 1), xlab='severity1', ylab='EQ-5D Utility')
plot(factor(sel$severity1), ols1$fitted.values, ylim = c(0.2, 1), xlab='severity1', ylab='EQ-5D predicted OLS1') 
par(mfrow=c(1,1))

