Updated with newly derived variables

# environment setup to run ordered logit properly
options(contrasts = rep("contr.treatment", 2))

This chunk loads all the packages to use

#packages for ordered logit
library(tidyverse) # package for data cleaning and plotting
library(readxl) # package for reading excel file
library(broom) # extracting model summary as data frame
library(modelsummary) # deriving model tables
library(scales) # label percent
library(lubridate) # working with dates
library(marginaleffects) #to calculate marginal effects
library(ordinal) # package for ordinal logit regression
library(here) # specifying directory 

Data Preparation

First, import the sampled and coded data set

#import the raw data file
cqc_skills <- read_rds(here("data","cleaned_sfc_ipw.rds")) 
summary(cqc_skills[, c("turnover", "turnover0", "staff_level", "staff_level0")])
##     turnover          turnover0        staff_level      staff_level0   
##  Min.   :   0.000   Min.   :  0.000   Min.   : 0.000   Min.   : 0.000  
##  1st Qu.:   7.143   1st Qu.:  6.885   1st Qu.: 0.500   1st Qu.: 0.794  
##  Median :  18.868   Median : 18.182   Median : 0.808   Median : 1.273  
##  Mean   :  31.132   Mean   : 29.171   Mean   : 1.204   Mean   : 1.647  
##  3rd Qu.:  38.298   3rd Qu.: 38.095   3rd Qu.: 1.357   3rd Qu.: 1.917  
##  Max.   :4500.000   Max.   :704.348   Max.   :55.333   Max.   :67.333  
##  NA's   :10656      NA's   :10644     NA's   :5004     NA's   :5004

Modeling on rating with new staffing variables

model_order_weighted <- clm(rating ~ form + service_type_selected + region + during_covid,
                data = filter(cqc_skills, domain == "Overall"),
                link = "logit",
                weights = ipw)

model_staff_weighted <- lm(staff_level ~ form + service_type_selected + region + during_covid,
                data = filter(cqc_skills, domain == "Overall"),
                weights = ipw)

staff_direct_order_weighted <- clm(rating ~ form + staff_level + service_type_selected + region + during_covid,
                data = filter(cqc_skills, domain == "Overall"),
                link = "logit",
                weights = ipw)

model_turnover_weighted <- lm(turnover ~ form + service_type_selected+ region + during_covid,
                data = filter(cqc_skills, domain == "Overall"),
                weights = ipw)

turnover_direct_order_weighted <- clm(rating ~ form + turnover + service_type_selected + region + during_covid,
                data = filter(cqc_skills, domain == "Overall"),
                link = "logit",
                weights = ipw)

Modeling on rating with new staffing variables

model_staff_weighted0 <- lm(staff_level0 ~ form + service_type_selected + region + during_covid,
                data = filter(cqc_skills, domain == "Overall"),
                weights = ipw)

staff_direct_order_weighted0 <- clm(rating ~ form + staff_level0 + service_type_selected + region + during_covid,
                data = filter(cqc_skills, domain == "Overall"),
                link = "logit",
                weights = ipw)

model_turnover_weighted0 <- lm(turnover0 ~ form + service_type_selected+ region + during_covid,
                data = filter(cqc_skills, domain == "Overall"),
                weights = ipw)

turnover_direct_order_weighted0 <- clm(rating ~ form + turnover0 + service_type_selected + region + during_covid,
                data = filter(cqc_skills, domain == "Overall"),
                link = "logit",
                weights = ipw)

drive result tables

new_models <- modelsummary(list("full weighted" = model_order_weighted,  
                                "staffing weighted"= model_staff_weighted,
                                "staff direct weighted" = staff_direct_order_weighted,
                                "turnover weighted"= model_turnover_weighted, 
                                "turnover direct weighted" = turnover_direct_order_weighted),
                               coef_omit = "region", exponentiate = F,
                               statistic = "({p.value}) {stars}")
new_models
full weighted staffing weighted staff direct weighted turnover weighted turnover direct weighted
Inadequate|Req improv -5.019 -4.910 -5.050
(<0.001) *** (<0.001) *** (<0.001) ***
Req improv|Good -2.167 -2.065 -2.127
(<0.001) *** (<0.001) *** (<0.001) ***
Good|Outstanding 3.076 3.187 3.150
(<0.001) *** (<0.001) *** (<0.001) ***
formCIC 0.257 0.492 0.127 -12.767 0.172
(0.393) (0.049) * (0.687) (0.537) (0.680)
formGOV 0.197 0.708 0.076 -22.312 0.166
(0.182) (<0.001) *** (0.616) (0.003) ** (0.270)
formIND -0.277 -0.222 -0.205 -14.033 -0.269
(0.003) ** (0.007) ** (0.044) * (0.011) * (0.013) *
formNPO 0.315 0.418 0.237 -9.565 0.310
(<0.001) *** (<0.001) *** (0.001) ** (0.018) * (<0.001) ***
service_type_selectedcare home w/o nursing 0.134 0.316 0.145 -8.578 0.120
(0.027) * (<0.001) *** (0.024) * (0.019) * (0.089) +
service_type_selectedDomicilary Care 0.504 -0.166 0.582 4.902 0.582
(<0.001) *** (0.005) ** (<0.001) *** (0.230) (<0.001) ***
service_type_selectedSupported Living 0.513 1.390 0.511 -8.269 0.527
(<0.001) *** (<0.001) *** (<0.001) *** (0.245) (<0.001) ***
during_covidTRUE -1.787 -0.119 -1.758 5.839 -1.737
(<0.001) *** (0.006) ** (<0.001) *** (0.057) + (<0.001) ***
(Intercept) 1.006 43.991
(<0.001) *** (<0.001) ***
staff_level 0.082
(<0.001) ***
turnover 0.000
(0.509)
Num.Obs. 12521 5984 11143 5085 9500
R2 0.075 0.011
R2 Adj. 0.073 0.008
AIC 15037.6 22009.7 13275.9 61048.2 11151.6
BIC 15178.9 22130.3 13422.2 61165.9 11294.7
Log.Lik. -10986.858 -30506.119
RMSE 2.27 1.58 2.27 93.27 2.27
old_models <- modelsummary(list("full weighted" = model_order_weighted,  
                                "staffing weighted"= model_staff_weighted0,
                                "staff direct weighted" = staff_direct_order_weighted0,
                                "turnover weighted"= model_turnover_weighted0, 
                                "turnover direct weighted" = turnover_direct_order_weighted0),
                               coef_omit = "region", exponentiate = F,
                               statistic = "({p.value}) {stars}")
old_models
full weighted staffing weighted staff direct weighted turnover weighted turnover direct weighted
Inadequate|Req improv -5.019 -4.891 -5.084
(<0.001) *** (<0.001) *** (<0.001) ***
Req improv|Good -2.167 -2.047 -2.159
(<0.001) *** (<0.001) *** (<0.001) ***
Good|Outstanding 3.076 3.201 3.119
(<0.001) *** (<0.001) *** (<0.001) ***
formCIC 0.257 0.499 0.137 -7.604 0.168
(0.393) (0.095) + (0.664) (0.382) (0.688)
formGOV 0.197 0.882 0.083 -18.707 0.147
(0.182) (<0.001) *** (0.582) (<0.001) *** (0.329)
formIND -0.277 -0.152 -0.215 -11.676 -0.280
(0.003) ** (0.121) (0.035) * (<0.001) *** (0.010) **
formNPO 0.315 0.499 0.242 -6.739 0.305
(<0.001) *** (<0.001) *** (<0.001) *** (<0.001) *** (<0.001) ***
service_type_selectedcare home w/o nursing 0.134 0.098 0.165 -5.770 0.115
(0.027) * (0.116) (0.010) * (<0.001) *** (0.103)
service_type_selectedDomicilary Care 0.504 -0.589 0.604 3.380 0.584
(<0.001) *** (<0.001) *** (<0.001) *** (0.050) * (<0.001) ***
service_type_selectedSupported Living 0.513 1.237 0.550 -3.891 0.519
(<0.001) *** (<0.001) *** (<0.001) *** (0.194) (<0.001) ***
during_covidTRUE -1.787 -0.111 -1.760 2.134 -1.738
(<0.001) *** (0.034) * (<0.001) *** (0.098) + (<0.001) ***
(Intercept) 1.687 33.743
(<0.001) *** (<0.001) ***
staff_level0 0.059
(<0.001) ***
turnover0 -0.001
(0.174)
Num.Obs. 12521 5984 11143 5087 9503
R2 0.073 0.029
R2 Adj. 0.071 0.026
AIC 15037.6 24161.1 13282.2 52275.9 11154.4
BIC 15178.9 24281.6 13428.6 52393.5 11297.6
Log.Lik. -12062.547 -26119.933
RMSE 2.27 1.87 2.27 39.64 2.27