I'm analyzing some data, using GLMM and obtain very strange results. The data is of student passing a test, each group of students belong to a different school. So I analyzed the data using glmer(is_pass ~ (1|school), data, family = 'binomial')
. The schools are the random effect.
Now, the proportion of passing is very high. The average across all schools is 0.99
. However, the confidence interval obtained from the GLMM is between 0.68 - 1
. Furthermore, if I construct the Clopper-Pearson CI for each of the schools individually each CI is actually shorter (with the minimal one, the only school where students failed its 0.75 - 0.99
).
Confidence.Interval Lower.limit Upper.limit alpha
two.sided 0.8765639 1.0000000 0.05
1 two.sided 0.8765639 1.0000000 0.05
2 two.sided 0.8765639 1.0000000 0.05
3 two.sided 0.8842967 1.0000000 0.05
4 two.sided 0.8765639 1.0000000 0.05
5 two.sided 0.8518149 1.0000000 0.05
6 two.sided 0.8628148 1.0000000 0.05
7 two.sided 0.8575264 1.0000000 0.05
8 two.sided 0.7486971 0.9905446 0.05
The glmer
function returns no error or warnings. Why does it happen? and how can I circumvent it?
Data attached in dput structure as well as code for analysis.
library(lme4)
library(tidyverse)
data <- structure(list(
student = c("1004", "1007", "1008", "1009", "1011",
"1012", "1014", "1015", "1016", "1017", "1018", "1020", "1021",
"1022", "1023", "1024", "1025", "1026", "1029", "1030", "1031",
"1032", "1033", "1034", "1035", "1036", "1037", "1038", "1039",
"1040", "1041", "1042", "1043", "1044", "1045", "1046", "1047",
"1048", "1049", "1050", "1051", "1052", "1053", "1054", "1055",
"1056", "1057", "1058", "1059", "1060", "1061", "1062", "1063",
"1064", "1065", "1066", "1067", "1068", "1069", "1070", "1071",
"1072", "1073", "1074", "1075", "1076", "1077", "1078", "1080",
"1081", "1082", "1083", "1084", "1085", "1086", "1087", "1088",
"1089", "1090", "1092", "1093", "1094", "1095", "1096", "2003",
"2004", "2006", "2007", "2008", "2009", "2010", "2011", "2012",
"2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020",
"2021", "2022", "2023", "2024", "2025", "2026", "2027", "2028",
"2029", "2030", "2031", "2032", "2033", "2034", "2035", "2036",
"2037", "2038", "2039", "2040", "2041", "2042", "2043", "2044",
"2045", "2046", "2047", "2048", "2049", "2050", "2052", "2053",
"2054", "2055", "2056", "2057", "2058", "2059", "2060", "2061",
"2062", "2063", "2064", "2065", "2066", "2067", "2068", "2069",
"2071", "2072", "2073", "2075", "2076", "2077", "2078", "2079",
"2080", "2081", "2082", "2083", "2084", "2085", "2086", "2087",
"5004", "5008", "5009", "5010", "5011", "5012", "5013", "5014",
"5015", "5016", "5018", "5019", "5020", "5022", "5024", "5025",
"5026", "5027", "5028", "5030", "5031", "5032", "5033", "5034",
"5035", "5036", "5037", "5038", "5039", "5040", "5041", "5042",
"5043", "5044", "5045", "5046", "5047", "5048", "5049", "5050",
"5051", "5052", "5053", "5054", "5055", "5056", "5057", "5058",
"5059", "5060", "5061", "5062", "5063", "5064", "5065", "5066",
"5067", "5068", "5069", "5071", "5072", "5073", "5074", "5075",
"5076", "5077", "5078", "5079", "5080", "5081", "5082", "5083",
"5084", "5085", "5086"),
school = c("153", "152", "153", "154",
"152", "154", "153", "152", "153", "154", "152", "153", "152",
"153", "152", "153", "152", "153", "152", "153", "152", "152",
"154", "154", "154", "154", "152", "152", "153", "152", "153",
"152", "153", "152", "154", "152", "154", "152", "154", "154",
"152", "154", "152", "152", "154", "154", "152", "152", "152",
"153", "152", "152", "153", "153", "153", "153", "153", "154",
"154", "154", "153", "153", "154", "154", "154", "154", "153",
"154", "153", "154", "153", "154", "154", "153", "153", "153",
"153", "153", "152", "152", "152", "154", "154", "154", "252",
"253", "251", "253", "252", "252", "251", "253", "251", "252",
"251", "251", "253", "251", "251", "251", "251", "253", "252",
"252", "252", "251", "251", "253", "253", "252", "251", "252",
"252", "253", "253", "253", "253", "252", "252", "253", "252",
"251", "252", "251", "253", "253", "252", "252", "251", "253",
"251", "251", "251", "252", "252", "252", "252", "251", "252",
"252", "253", "253", "251", "252", "253", "252", "251", "253",
"252", "251", "252", "253", "253", "253", "253", "251", "252",
"252", "251", "251", "251", "251", "251", "251", "251", "553",
"554", "554", "554", "553", "553", "553", "553", "553", "553",
"552", "552", "552", "552", "554", "554", "553", "552", "552",
"554", "553", "553", "553", "554", "552", "552", "552", "552",
"552", "552", "554", "554", "554", "554", "553", "553", "553",
"553", "552", "552", "552", "552", "553", "553", "553", "553",
"553", "552", "552", "553", "553", "553", "553", "552", "552",
"552", "552", "552", "552", "552", "554", "554", "554", "554",
"554", "554", "554", "554", "554", "554", "554", "554", "554",
"554", "554"),
is_pass = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE)),
class = "data.frame",
row.names = c(NA, -240L))
res <- glmer(is_pass ~ (1|school), data, family = 'binomial')
coef_logis <- coef(summary(res))
est_p <- boot::inv.logit(coef_logis[1])
lb <- boot::inv.logit(coef_logis[1] - coef_logis[2] * qnorm(1 - 0.05 / 2))
ub <- boot::inv.logit(coef_logis[1] + coef_logis[2] * qnorm(1 - 0.05 / 2))
mean(data$is_pass)
clopper_ci <- data %>%
group_by(school) %>%
summarise(mean_pass = mean(is_pass),
sum_pass = sum(is_pass),
n = n())
cis <- NULL
for (i in 1:nrow(clopper_ci)) {
ci <- GenBinomApps::clopper.pearson.ci(clopper_ci$sum_pass[i], clopper_ci$n[i], CI ='two.sided', alpha = 0.05)
cis <- rbind(cis, ci)
}
cis