7/31/2024 Add size (total stuff) control to the models.

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")) 
cqc_skills %>% 
  mutate(overall = ifelse(domain == "Overall", 1, 0)) %>% 
  group_by(form) %>% 
  summarize(count_rating_unit = sum(overall),
            count_rating = n())
## # A tibble: 6 × 3
##   form  count_rating_unit count_rating
##   <fct>             <dbl>        <int>
## 1 FPO                5122        30732
## 2 CIC                  51          306
## 3 GOV                 378         2268
## 4 IND                 298         1788
## 5 NPO                1405         8430
## 6 <NA>                  4           24
nrow(cqc_skills)
## [1] 43548
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

where “turnover0” and “staff_level0” denote the older/crude way to calculate the variables.

Modelis Used / Reported

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

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

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

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

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

results table for new staffing variables

new_models <- modelsummary(list("total effect" = model_order_weighted,  
                                "staffing by sector"= model_staff_weighted,
                                "direct effect: staffing control" = staff_direct_order_weighted,
                                "turnover by sector"= model_turnover_weighted, 
                                "direct effect: turnover control" = turnover_direct_order_weighted),
                               coef_omit = "region", exponentiate = F,
                               statistic = "({p.value}) {stars}")
new_models
tinytable_y7vxgfend0hry1uw3iwv
total effect staffing by sector direct effect: staffing control turnover by sector direct effect: turnover control
Inadequate|Req improv -5.275 -5.221 -5.354
(<0.001) *** (<0.001) *** (<0.001) ***
Req improv|Good -2.418 -2.377 -2.430
(<0.001) *** (<0.001) *** (<0.001) ***
Good|Outstanding 2.858 2.900 2.886
(<0.001) *** (<0.001) *** (<0.001) ***
formCIC 0.355 0.526 0.240 -11.331 0.147
(0.233) (0.039) * (0.447) (0.577) (0.726)
formGOV 0.206 0.643 0.092 -24.204 0.185
(0.134) (<0.001) *** (0.518) (<0.001) *** (0.189)
formIND -0.223 -0.154 -0.169 -15.694 -0.218
(0.017) * (0.067) + (0.095) + (0.004) ** (0.043) *
formNPO 0.305 0.501 0.223 -10.517 0.265
(<0.001) *** (<0.001) *** (0.002) ** (0.006) ** (<0.001) ***
care_homeY -0.512 0.287 -0.568 -8.921 -0.591
(<0.001) *** (<0.001) *** (<0.001) *** (0.003) ** (<0.001) ***
age 0.028 -0.005 0.028 -0.163 0.028
(<0.001) *** (0.210) (<0.001) *** (0.580) (<0.001) ***
totalstaff 0.002 0.003 0.001 -0.041 0.002
(0.002) ** (<0.001) *** (0.032) * (0.158) (0.009) **
during_covidTRUE -1.773 -0.185 -1.756 6.693 -1.746
(<0.001) *** (<0.001) *** (<0.001) *** (0.024) * (<0.001) ***
(Intercept) 0.860 50.649
(<0.001) *** (<0.001) ***
staff_level 0.077
(<0.001) ***
turnover 0.000
(0.501)
Num.Obs. 12933 6162 11430 5263 9770
R2 0.038 0.010
R2 Adj. 0.035 0.007
AIC 15412.8 23060.0 13538.3 63061.1 11384.3
BIC 15554.7 23181.1 13685.2 63179.3 11528.0
Log.Lik. -11512.001 -31512.526
RMSE 2.27 1.62 2.28 91.84 2.27

Derive coefficient plots

# Tidy the models and filter out the threshold terms
staff_tidied <- tidy(model_staff_weighted, conf.int = TRUE) %>%
  filter(!term %in% c("(Intercept)", "Inadequate|Req improv", "Req improv|Good", "Good|Outstanding"))

turnover_tidied <- tidy(model_turnover_weighted, conf.int = TRUE) %>%
  filter(!term %in% c("(Intercept)", "Inadequate|Req improv", "Req improv|Good", "Good|Outstanding"))

order_tidied <- tidy(model_order_weighted, conf.int = TRUE) %>%
  filter(!term %in% c("(Intercept)", "Inadequate|Req improv", "Req improv|Good", "Good|Outstanding")) %>%
  mutate(model = "Total effects")

staff_direct_tidied <- tidy(staff_direct_order_weighted, conf.int = TRUE) %>%
  filter(!term %in% c("(Intercept)", "Inadequate|Req improv", "Req improv|Good", "Good|Outstanding")) %>%
  mutate(model = "Direct effects")

# Combine order and staff direct models
combined_tidied <- bind_rows(order_tidied, staff_direct_tidied)

# Tidy the models and filter out the threshold terms
turnover_tidied <- tidy(model_order_weighted, conf.int = TRUE) %>%
  filter(!term %in% c("(Intercept)", "Inadequate|Req improv", "Req improv|Good", "Good|Outstanding")) %>%
  mutate(model = "Total Effect")

turnover_direct_tidied <- tidy(turnover_direct_order_weighted, conf.int = TRUE) %>%
  filter(!term %in% c("(Intercept)", "Inadequate|Req improv", "Req improv|Good", "Good|Outstanding")) %>%
  mutate(model = "Direct Effect")

# Combine total effect and direct effect models
combined_turnover_tidied <- bind_rows(turnover_tidied, turnover_direct_tidied)
ggplot(staff_tidied, aes(x = estimate, y = term)) +
  geom_vline(xintercept = 0, color = "red", linetype = "dotted") +
  geom_pointrange(aes(xmin = conf.low, xmax = conf.high)) + 
  labs(x = "Coefficient estimate", y = NULL) +
  theme_minimal() +
  ggtitle("Staffing by sector Model Coefficient Plot")

ggplot(turnover_tidied, aes(x = estimate, y = term)) +
  geom_vline(xintercept = 0, color = "red", linetype = "dotted") +
  geom_pointrange(aes(xmin = conf.low, xmax = conf.high)) + 
  labs(x = "Coefficient estimate", y = NULL) +
  theme_minimal() +
  ggtitle("Turnover by Sector Model Coefficient Plot")

ggplot(combined_tidied, aes(x = estimate, y = term, color = model, shape = model)) +
  geom_vline(xintercept = 0, color = "red", linetype = "dotted") +
  geom_pointrange(aes(xmin = conf.low, xmax = conf.high), position = position_dodge(width = 0.5)) + 
  labs(x = "Coefficient estimate", y = NULL) +
  theme_minimal() +
  ggtitle("Staffing Level: total effects and direct effects")

ggplot(combined_turnover_tidied, aes(x = estimate, y = term, color = model, shape = model)) +
  geom_vline(xintercept = 0, color = "red", linetype = "dotted") +
  geom_pointrange(aes(xmin = conf.low, xmax = conf.high), position = position_dodge(width = 0.5)) + 
  labs(x = "Coefficient estimate", y = NULL) +
  theme_minimal() +
  ggtitle("Turnover: Total Effects and Direct Effects")

Additional models

Modeling on rating with old staffing variables and different category

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

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

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

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

results table for oldstaffing variables

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
tinytable_i9ao1kjn0pa6m2uepmnn
full weighted staffing weighted staff direct weighted turnover weighted turnover direct weighted
Inadequate|Req improv -5.275 -4.483 -4.640
(<0.001) *** (<0.001) *** (<0.001) ***
Req improv|Good -2.418 -1.636 -1.712
(<0.001) *** (<0.001) *** (<0.001) ***
Good|Outstanding 2.858 3.631 3.588
(<0.001) *** (<0.001) *** (<0.001) ***
formCIC 0.355 0.531 0.151 -7.773 0.191
(0.233) (0.073) + (0.632) (0.371) (0.649)
formGOV 0.206 0.844 0.032 -18.787 0.086
(0.134) (<0.001) *** (0.833) (<0.001) *** (0.569)
formIND -0.223 -0.086 -0.201 -12.195 -0.264
(0.017) * (0.379) (0.049) * (<0.001) *** (0.015) *
formNPO 0.305 0.494 0.192 -7.541 0.233
(<0.001) *** (<0.001) *** (0.009) ** (<0.001) *** (0.005) **
care_homeY -0.512
(<0.001) ***
age 0.028 -0.020 0.029 0.508 0.029
(<0.001) *** (<0.001) *** (<0.001) *** (<0.001) *** (<0.001) ***
totalstaff 0.002 0.005 0.001 -0.033 0.002
(0.002) ** (<0.001) *** (0.007) ** (0.012) * (0.001) **
during_covidTRUE -1.773 -0.140 -1.749 2.571 -1.728
(<0.001) *** (0.007) ** (<0.001) *** (0.047) * (<0.001) ***
(Intercept) 1.612 29.743
(<0.001) *** (<0.001) ***
service_type_selectedcare home w/o nursing 0.250 0.207 -6.787 0.177
(<0.001) *** (0.002) ** (<0.001) *** (0.015) *
service_type_selectedDomicilary Care -0.606 0.660 4.129 0.659
(<0.001) *** (<0.001) *** (0.017) * (<0.001) ***
service_type_selectedSupported Living 1.181 0.636 -2.656 0.619
(<0.001) *** (<0.001) *** (0.378) (<0.001) ***
staff_level0 0.059
(<0.001) ***
turnover0 -0.001
(0.117)
Num.Obs. 12933 5984 11144 5087 9503
R2 0.088 0.033
R2 Adj. 0.085 0.029
AIC 15412.8 24067.5 13246.7 52259.3 11121.7
BIC 15554.7 24201.4 13407.7 52390.0 11279.2
Log.Lik. -12013.745 -26109.673
RMSE 2.27 1.85 2.27 39.56 2.27

Models for other domains (currently without totalstaff control)

“Overall”,“Safe”,“Effective”, “Caring”, “Well-led”, “Responsive”

“Safe” domain

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

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

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

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

turnover_direct_order_weighted_safe <- clm(rating ~ form + turnover + service_type_selected + age + region + during_covid,
                data = filter(cqc_skills, domain == "Safe"),
                link = "logit",
                weights = ipw)
safe_models <- modelsummary(list("full weighted" = model_order_weighted_safe,  
                                "staffing weighted"= model_staff_weighted_safe,
                                "staff direct weighted" = staff_direct_order_weighted_safe,
                                "turnover weighted"= model_turnover_weighted_safe, 
                                "turnover direct weighted" = turnover_direct_order_weighted_safe),
                               coef_omit = "region", exponentiate = F,
                               statistic = "({p.value}) {stars}")
safe_models
tinytable_jzbd2g8wn99w6o0lok2w
full weighted staffing weighted staff direct weighted turnover weighted turnover direct weighted
Inadequate|Req improv -4.171 -4.032 -4.171
(<0.001) *** (<0.001) *** (<0.001) ***
Req improv|Good -1.356 -1.178 -1.220
(<0.001) *** (<0.001) *** (<0.001) ***
Good|Outstanding 6.376 6.633 6.396
(<0.001) *** (<0.001) *** (<0.001) ***
formCIC 0.161 0.494 -0.057 -12.839 -0.219
(0.637) (0.048) * (0.870) (0.534) (0.614)
formGOV 0.325 0.707 0.196 -22.042 0.287
(0.062) + (<0.001) *** (0.269) (0.004) ** (0.101)
formIND -0.250 -0.222 -0.151 -13.983 -0.319
(0.010) * (0.007) ** (0.155) (0.012) * (0.004) **
formNPO 0.502 0.418 0.411 -9.028 0.409
(<0.001) *** (<0.001) *** (<0.001) *** (0.027) * (<0.001) ***
service_type_selectedcare home w/o nursing 0.284 0.316 0.286 -8.583 0.331
(<0.001) *** (<0.001) *** (<0.001) *** (0.019) * (<0.001) ***
service_type_selectedDomicilary Care 0.673 -0.165 0.737 4.404 0.718
(<0.001) *** (0.005) ** (<0.001) *** (0.286) (<0.001) ***
service_type_selectedSupported Living 0.990 1.392 0.876 -9.017 1.004
(<0.001) *** (<0.001) *** (<0.001) *** (0.209) (<0.001) ***
age 0.023 0.000 0.020 -0.265 0.027
(<0.001) *** (0.916) (<0.001) *** (0.379) (<0.001) ***
during_covidTRUE -1.446 -0.119 -1.426 5.650 -1.415
(<0.001) *** (0.007) ** (<0.001) *** (0.066) + (<0.001) ***
(Intercept) 1.000 47.128
(<0.001) *** (<0.001) ***
staff_level 0.161
(<0.001) ***
turnover 0.000
(0.384)
Num.Obs. 12491 5984 11116 5085 9474
R2 0.075 0.011
R2 Adj. 0.073 0.008
AIC 12241.1 22011.8 10678.9 61049.5 9109.1
BIC 12389.8 22139.1 10832.5 61173.6 9259.4
Log.Lik. -10986.907 -30505.731
RMSE 2.11 1.58 2.11 93.27 2.11

“Effective domain”

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

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

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

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

turnover_direct_order_weighted_effective <- clm(rating ~ form + turnover + service_type_selected + age + region + during_covid,
                data = filter(cqc_skills, domain == "Effective"),
                link = "logit",
                weights = ipw)
effective_models <- modelsummary(list("full weighted" = model_order_weighted_effective,  
                                "staffing weighted"= model_staff_weighted_effective,
                                "staff direct weighted" = staff_direct_order_weighted_effective,
                                "turnover weighted"= model_turnover_weighted_effective, 
                                "turnover direct weighted" = turnover_direct_order_weighted_effective),
                               coef_omit = "region", exponentiate = F,
                               statistic = "({p.value}) {stars}")
effective_models
tinytable_u618u9eeahpm3d3tathx
full weighted staffing weighted staff direct weighted turnover weighted turnover direct weighted
Inadequate|Req improv -5.773 -5.828 -5.931
(<0.001) *** (<0.001) *** (<0.001) ***
Req improv|Good -1.877 -1.782 -1.895
(<0.001) *** (<0.001) *** (<0.001) ***
Good|Outstanding 4.884 4.982 4.842
(<0.001) *** (<0.001) *** (<0.001) ***
formCIC -0.051 0.494 -0.222 -12.839 0.043
(0.893) (0.048) * (0.567) (0.534) (0.936)
formGOV 0.195 0.707 0.046 -22.042 0.138
(0.338) (<0.001) *** (0.823) (0.004) ** (0.499)
formIND -0.391 -0.222 -0.188 -13.983 -0.211
(<0.001) *** (0.007) ** (0.151) (0.012) * (0.127)
formNPO 0.233 0.418 0.124 -9.028 0.165
(0.011) * (<0.001) *** (0.204) (0.027) * (0.129)
service_type_selectedcare home w/o nursing 0.333 0.316 0.309 -8.583 0.249
(<0.001) *** (<0.001) *** (<0.001) *** (0.019) * (0.006) **
service_type_selectedDomicilary Care 0.604 -0.165 0.655 4.404 0.619
(<0.001) *** (0.005) ** (<0.001) *** (0.286) (<0.001) ***
service_type_selectedSupported Living 0.739 1.392 0.792 -9.017 0.758
(<0.001) *** (<0.001) *** (<0.001) *** (0.209) (<0.001) ***
age 0.021 0.000 0.019 -0.265 0.019
(<0.001) *** (0.916) (0.005) ** (0.379) (0.015) *
during_covidTRUE -1.177 -0.119 -1.224 5.650 -1.161
(<0.001) *** (0.007) ** (<0.001) *** (0.066) + (<0.001) ***
(Intercept) 1.000 47.128
(<0.001) *** (<0.001) ***
staff_level 0.077
(<0.001) ***
turnover -0.001
(0.002) **
Num.Obs. 12047 5984 10733 5085 9135
R2 0.075 0.011
R2 Adj. 0.073 0.008
AIC 9023.6 22011.8 7937.5 61049.5 6744.8
BIC 9171.5 22139.1 8090.5 61173.6 6894.3
Log.Lik. -10986.907 -30505.731
RMSE 2.13 1.58 2.14 93.27 2.14

“Caring” domain

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

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

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

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

turnover_direct_order_weighted_caring <- clm(rating ~ form + turnover + service_type_selected + age + region + during_covid,
                data = filter(cqc_skills, domain == "Caring"),
                link = "logit",
                weights = ipw)
caring_models <- modelsummary(list("full weighted" = model_order_weighted_caring,  
                                "staffing weighted"= model_staff_weighted_caring,
                                "staff direct weighted" = staff_direct_order_weighted_caring,
                                "turnover weighted"= model_turnover_weighted_caring, 
                                "turnover direct weighted" = turnover_direct_order_weighted_caring),
                               coef_omit = "region", exponentiate = F,
                               statistic = "({p.value}) {stars}")
caring_models
tinytable_9vxd9g70qm1nuo2ry95j
full weighted staffing weighted staff direct weighted turnover weighted turnover direct weighted
Inadequate|Req improv -7.035 -6.828 -6.739
(<0.001) *** (<0.001) *** (<0.001) ***
Req improv|Good -2.768 -2.740 -2.894
(<0.001) *** (<0.001) *** (<0.001) ***
Good|Outstanding 3.925 3.942 3.950
(<0.001) *** (<0.001) *** (<0.001) ***
formCIC 0.710 0.494 0.691 -12.839 -0.043
(0.039) * (0.048) * (0.050) + (0.534) (0.934)
formGOV 0.004 0.707 -0.100 -22.042 0.000
(0.985) (<0.001) *** (0.632) (0.004) ** (0.999)
formIND 0.081 -0.222 0.135 -13.983 0.254
(0.547) (0.007) ** (0.344) (0.012) * (0.092) +
formNPO 0.194 0.418 0.188 -9.028 0.281
(0.034) * (<0.001) *** (0.055) + (0.027) * (0.011) *
service_type_selectedcare home w/o nursing 0.327 0.316 0.265 -8.583 0.153
(<0.001) *** (<0.001) *** (0.007) ** (0.019) * (0.162)
service_type_selectedDomicilary Care 0.882 -0.165 0.881 4.404 0.881
(<0.001) *** (0.005) ** (<0.001) *** (0.286) (<0.001) ***
service_type_selectedSupported Living 0.876 1.392 0.835 -9.017 0.793
(<0.001) *** (<0.001) *** (<0.001) *** (0.209) (<0.001) ***
age 0.040 0.000 0.038 -0.265 0.044
(<0.001) *** (0.916) (<0.001) *** (0.379) (<0.001) ***
during_covidTRUE -1.071 -0.119 -1.047 5.650 -1.112
(<0.001) *** (0.007) ** (<0.001) *** (0.066) + (<0.001) ***
(Intercept) 1.000 47.128
(<0.001) *** (<0.001) ***
staff_level 0.019
(0.300)
turnover 0.000
(0.371)
Num.Obs. 11961 5984 10666 5085 9084
R2 0.075 0.011
R2 Adj. 0.073 0.008
AIC 8061.2 22011.8 7238.0 61049.5 5955.4
BIC 8209.0 22139.1 7390.8 61173.6 6104.8
Log.Lik. -10986.907 -30505.731
RMSE 2.24 1.58 2.25 93.27 2.24

“Well-led” domain

model_order_weighted_well_led <- clm(rating ~ form + service_type_selected + age + region + during_covid,
                data = filter(cqc_skills, domain == "Well-led"),
                link = "logit",
                weights = ipw)

model_staff_weighted_well_led <- lm(staff_level ~ form + service_type_selected + age + region + during_covid,
                data = filter(cqc_skills, domain == "Well-led"),
                weights = ipw)

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

model_turnover_weighted_well_led <- lm(turnover ~ form + service_type_selected + age + region + during_covid,
                data = filter(cqc_skills, domain == "Well-led"),
                weights = ipw)

turnover_direct_order_weighted_well_led <- clm(rating ~ form + turnover + service_type_selected + age + region + during_covid,
                data = filter(cqc_skills, domain == "Well-led"),
                link = "logit",
                weights = ipw)
well_led_models <- modelsummary(list("total effect" = model_order_weighted_well_led,  
                                "staffing by sector"= model_staff_weighted_well_led,
                                "direct effect: staffing control" = staff_direct_order_weighted_well_led,
                                "turnover by sector"= model_turnover_weighted_well_led, 
                                "direct effect: turnover control" = turnover_direct_order_weighted_well_led),
                               coef_omit = "region", exponentiate = F,
                               statistic = "({p.value}) {stars}")
well_led_models
tinytable_x6pn93fuzfoixdjjq7vl
total effect staffing by sector direct effect: staffing control turnover by sector direct effect: turnover control
Inadequate|Req improv -4.160 -4.051 -4.110
(<0.001) *** (<0.001) *** (<0.001) ***
Req improv|Good -1.312 -1.191 -1.269
(<0.001) *** (<0.001) *** (<0.001) ***
Good|Outstanding 3.496 3.593 3.578
(<0.001) *** (<0.001) *** (<0.001) ***
formCIC 0.529 0.494 0.395 -12.839 0.148
(0.068) + (0.048) * (0.193) (0.534) (0.711)
formGOV 0.124 0.707 0.015 -22.042 0.093
(0.370) (<0.001) *** (0.916) (0.004) ** (0.509)
formIND -0.341 -0.222 -0.292 -13.983 -0.369
(<0.001) *** (0.007) ** (0.002) ** (0.012) * (<0.001) ***
formNPO 0.324 0.418 0.235 -9.028 0.299
(<0.001) *** (<0.001) *** (<0.001) *** (0.027) * (<0.001) ***
service_type_selectedcare home w/o nursing 0.168 0.316 0.160 -8.583 0.156
(0.003) ** (<0.001) *** (0.008) ** (0.019) * (0.016) *
service_type_selectedDomicilary Care 0.565 -0.165 0.613 4.404 0.658
(<0.001) *** (0.005) ** (<0.001) *** (0.286) (<0.001) ***
service_type_selectedSupported Living 0.509 1.392 0.543 -9.017 0.531
(<0.001) *** (<0.001) *** (<0.001) *** (0.209) (<0.001) ***
age 0.032 0.000 0.031 -0.265 0.030
(<0.001) *** (0.916) (<0.001) *** (0.379) (<0.001) ***
during_covidTRUE -1.482 -0.119 -1.445 5.650 -1.452
(<0.001) *** (0.007) ** (<0.001) *** (0.066) + (<0.001) ***
(Intercept) 1.000 47.128
(<0.001) *** (<0.001) ***
staff_level 0.083
(<0.001) ***
turnover 0.000
(0.075) +
Num.Obs. 12500 5984 11125 5085 9483
R2 0.075 0.011
R2 Adj. 0.073 0.008
AIC 17172.8 22011.8 15257.1 61049.5 12788.4
BIC 17321.4 22139.1 15410.8 61173.6 12938.7
Log.Lik. -10986.907 -30505.731
RMSE 2.27 1.58 2.28 93.27 2.28

“Responsive” domain

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

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

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

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

turnover_direct_order_weighted_responsive <- clm(rating ~ form + turnover + service_type_selected + age + region + during_covid,
                data = filter(cqc_skills, domain == "Responsive"),
                link = "logit",
                weights = ipw)
responsive_models <- modelsummary(list("full weighted" = model_order_weighted_responsive,  
                                "staffing weighted"= model_staff_weighted_responsive,
                                "staff direct weighted" = staff_direct_order_weighted_responsive,
                                "turnover weighted"= model_turnover_weighted_responsive, 
                                "turnover direct weighted" = turnover_direct_order_weighted_responsive),
                               coef_omit = "region", exponentiate = F,
                               statistic = "({p.value}) {stars}")
responsive_models
tinytable_fcedq6yvvp2kw50l8ddl
full weighted staffing weighted staff direct weighted turnover weighted turnover direct weighted
Inadequate|Req improv -6.380 -6.098 -5.961
(<0.001) *** (<0.001) *** (<0.001) ***
Req improv|Good -1.822 -1.704 -1.785
(<0.001) *** (<0.001) *** (<0.001) ***
Good|Outstanding 3.679 3.805 3.783
(<0.001) *** (<0.001) *** (<0.001) ***
formCIC -0.276 0.494 -0.415 -12.839 -0.327
(0.394) (0.048) * (0.222) (0.534) (0.467)
formGOV 0.088 0.707 -0.031 -22.042 0.088
(0.598) (<0.001) *** (0.856) (0.004) ** (0.609)
formIND 0.069 -0.222 0.124 -13.983 0.108
(0.536) (0.007) ** (0.297) (0.012) * (0.400)
formNPO 0.271 0.418 0.237 -9.028 0.241
(<0.001) *** (<0.001) *** (0.004) ** (0.027) * (0.010) **
service_type_selectedcare home w/o nursing 0.598 0.316 0.610 -8.583 0.526
(<0.001) *** (<0.001) *** (<0.001) *** (0.019) * (<0.001) ***
service_type_selectedDomicilary Care 0.643 -0.165 0.742 4.404 0.749
(<0.001) *** (0.005) ** (<0.001) *** (0.286) (<0.001) ***
service_type_selectedSupported Living 1.037 1.392 1.072 -9.017 0.989
(<0.001) *** (<0.001) *** (<0.001) *** (0.209) (<0.001) ***
age 0.039 0.000 0.040 -0.265 0.041
(<0.001) *** (0.916) (<0.001) *** (0.379) (<0.001) ***
during_covidTRUE -0.773 -0.119 -0.724 5.650 -0.656
(<0.001) *** (0.007) ** (<0.001) *** (0.066) + (<0.001) ***
(Intercept) 1.000 47.128
(<0.001) *** (<0.001) ***
staff_level 0.063
(<0.001) ***
turnover 0.000
(0.952)
Num.Obs. 12027 5984 10719 5085 9123
R2 0.075 0.011
R2 Adj. 0.073 0.008
AIC 11517.6 22011.8 10240.8 61049.5 8527.0
BIC 11665.5 22139.1 10393.7 61173.6 8676.5
Log.Lik. -10986.907 -30505.731
RMSE 2.30 1.58 2.30 93.27 2.29