knitr::opts_chunk$set(cache = TRUE, dev = c("png", "pdf"))
library(here)
source(here("src", "model_linear_grampians_validate_response.R"))
perf_southeast <- merge(
subset(
perf, ibra_subregion != "Greater Grampians" & !random_effect, -random_effect
),
with(
mds,
setNames(
aggregate(y, list(taxon, ibra_subregion), mean),
c("taxon", "ibra_subregion", "prev")
)
)
)
perf_southeast$dist <- dists[perf_southeast$ibra_subregion]
perf_southeast$dist_env <- kldists[perf_southeast$ibra_subregion]
perf_southeast$dist_com <- community_dist[perf_southeast$ibra_subregion]
forms <- outer(
c("log(AUC)", "log(`AUC-PR`)", "log(`Rel-AUC-PR`)", "deviance_explained"),
c("dist", "dist_com", "dist_env"),
function(perf, dist) {
sprintf(
"%s ~
scale(%s) + scale(log10(prev)) + (1 | ibra_subregion) + (1 | taxon)",
perf, dist
)
}
)
forms <- lapply(t(forms), as.formula)
models <- lapply(forms, lmer, data = perf_southeast)
model_summaries <- lapply(models, summary)
for(i in model_summaries) print(i)
Linear mixed model fit by REML ['lmerMod']
Formula: log(AUC) ~ scale(dist) + scale(log10(prev)) + (1 | ibra_subregion) +
(1 | taxon)
Data: ..1
REML criterion at convergence: -332
Scaled residuals:
Min 1Q Median 3Q Max
-3.3428 -0.7379 0.0096 0.7661 1.9102
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.001877 0.04332
ibra_subregion (Intercept) 0.001759 0.04194
Residual 0.028791 0.16968
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.410615 0.013550 -30.30
scale(dist) 0.016063 0.012649 1.27
scale(log10(prev)) -0.066578 0.008012 -8.31
Correlation of Fixed Effects:
(Intr) scl(d)
scale(dist) -0.018
scl(lg10()) 0.011 -0.156
Linear mixed model fit by REML ['lmerMod']
Formula:
log(AUC) ~ scale(dist_com) + scale(log10(prev)) + (1 | ibra_subregion) +
(1 | taxon)
Data: ..1
REML criterion at convergence: -330.5
Scaled residuals:
Min 1Q Median 3Q Max
-3.3552 -0.7389 0.0163 0.7768 1.9651
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.001837 0.04286
ibra_subregion (Intercept) 0.002051 0.04529
Residual 0.028810 0.16973
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.410510 0.014140 -29.033
scale(dist_com) 0.003784 0.012535 0.302
scale(log10(prev)) -0.065402 0.007956 -8.221
Correlation of Fixed Effects:
(Intr) scl(_)
scl(dst_cm) -0.045
scl(lg10()) 0.010 -0.078
Linear mixed model fit by REML ['lmerMod']
Formula:
log(AUC) ~ scale(dist_env) + scale(log10(prev)) + (1 | ibra_subregion) +
(1 | taxon)
Data: ..1
REML criterion at convergence: -330.4
Scaled residuals:
Min 1Q Median 3Q Max
-3.3596 -0.7430 0.0210 0.7793 1.9767
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.001832 0.04281
ibra_subregion (Intercept) 0.002057 0.04535
Residual 0.028814 0.16975
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.410346 0.014136 -29.029
scale(dist_env) 0.002127 0.012577 0.169
scale(log10(prev)) -0.065108 0.007959 -8.180
Correlation of Fixed Effects:
(Intr) scl(_)
scl(dst_nv) -0.011
scl(lg10()) 0.006 0.083
Linear mixed model fit by REML ['lmerMod']
Formula:
log(`AUC-PR`) ~ scale(dist) + scale(log10(prev)) + (1 | ibra_subregion) +
(1 | taxon)
Data: ..1
REML criterion at convergence: 1306.2
Scaled residuals:
Min 1Q Median 3Q Max
-2.8022 -0.5834 -0.1157 0.4133 5.1971
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.15016 0.3875
ibra_subregion (Intercept) 0.04496 0.2120
Residual 0.48988 0.6999
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) -3.55332 0.07498 -47.390
scale(dist) 0.02089 0.06095 0.343
scale(log10(prev)) 1.74817 0.03533 49.478
Correlation of Fixed Effects:
(Intr) scl(d)
scale(dist) -0.022
scl(lg10()) 0.034 -0.135
Linear mixed model fit by REML ['lmerMod']
Formula:
log(`AUC-PR`) ~ scale(dist_com) + scale(log10(prev)) + (1 | ibra_subregion) +
(1 | taxon)
Data: ..1
REML criterion at convergence: 1306.4
Scaled residuals:
Min 1Q Median 3Q Max
-2.8098 -0.5849 -0.1167 0.4142 5.1958
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.15038 0.3878
ibra_subregion (Intercept) 0.04535 0.2130
Residual 0.48983 0.6999
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) -3.5527588 0.0751905 -47.250
scale(dist_com) 0.0001471 0.0570058 0.003
scale(log10(prev)) 1.7498628 0.0351037 49.848
Correlation of Fixed Effects:
(Intr) scl(_)
scl(dst_cm) -0.041
scl(lg10()) 0.034 -0.071
Linear mixed model fit by REML ['lmerMod']
Formula:
log(`AUC-PR`) ~ scale(dist_env) + scale(log10(prev)) + (1 | ibra_subregion) +
(1 | taxon)
Data: ..1
REML criterion at convergence: 1304.1
Scaled residuals:
Min 1Q Median 3Q Max
-2.8500 -0.5779 -0.1164 0.3912 5.1967
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.15036 0.3878
ibra_subregion (Intercept) 0.03535 0.1880
Residual 0.49020 0.7001
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) -3.55311 0.07126 -49.859
scale(dist_env) 0.08489 0.05242 1.619
scale(log10(prev)) 1.75405 0.03503 50.077
Correlation of Fixed Effects:
(Intr) scl(_)
scl(dst_nv) -0.004
scl(lg10()) 0.033 0.091
Linear mixed model fit by REML ['lmerMod']
Formula:
log(`Rel-AUC-PR`) ~ scale(dist) + scale(log10(prev)) + (1 | ibra_subregion) +
(1 | taxon)
Data: ..1
REML criterion at convergence: 1853.6
Scaled residuals:
Min 1Q Median 3Q Max
-5.4799 -0.5305 0.0259 0.5563 3.5576
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.4852 0.6966
ibra_subregion (Intercept) 0.1177 0.3431
Residual 1.2840 1.1332
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) -4.212985 0.126246 -33.371
scale(dist) -0.008537 0.098988 -0.086
scale(log10(prev)) 1.831862 0.057676 31.762
Correlation of Fixed Effects:
(Intr) scl(d)
scale(dist) -0.023
scl(lg10()) 0.036 -0.134
Linear mixed model fit by REML ['lmerMod']
Formula: log(`Rel-AUC-PR`) ~ scale(dist_com) + scale(log10(prev)) + (1 |
ibra_subregion) + (1 | taxon)
Data: ..1
REML criterion at convergence: 1853.7
Scaled residuals:
Min 1Q Median 3Q Max
-5.4815 -0.5301 0.0238 0.5570 3.5567
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.4848 0.6963
ibra_subregion (Intercept) 0.1173 0.3425
Residual 1.2842 1.1332
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) -4.212775 0.126211 -33.379
scale(dist_com) -0.008373 0.092123 -0.091
scale(log10(prev)) 1.831494 0.057300 31.963
Correlation of Fixed Effects:
(Intr) scl(_)
scl(dst_cm) -0.040
scl(lg10()) 0.036 -0.071
Linear mixed model fit by REML ['lmerMod']
Formula: log(`Rel-AUC-PR`) ~ scale(dist_env) + scale(log10(prev)) + (1 |
ibra_subregion) + (1 | taxon)
Data: ..1
REML criterion at convergence: 1849.7
Scaled residuals:
Min 1Q Median 3Q Max
-5.4540 -0.5303 0.0178 0.5535 3.5575
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.48480 0.6963
ibra_subregion (Intercept) 0.07647 0.2765
Residual 1.28551 1.1338
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) -4.21362 0.11657 -36.148
scale(dist_env) 0.17497 0.08007 2.185
scale(log10(prev)) 1.83788 0.05704 32.223
Correlation of Fixed Effects:
(Intr) scl(_)
scl(dst_nv) -0.002
scl(lg10()) 0.037 0.097
Linear mixed model fit by REML ['lmerMod']
Formula: deviance_explained ~ scale(dist) + scale(log10(prev)) + (1 |
ibra_subregion) + (1 | taxon)
Data: ..1
REML criterion at convergence: 681.5
Scaled residuals:
Min 1Q Median 3Q Max
-9.4952 -0.3083 0.0558 0.4052 5.5121
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.169691 0.41194
ibra_subregion (Intercept) 0.002602 0.05101
Residual 0.141361 0.37598
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.06073 0.05130 1.184
scale(dist) 0.02368 0.02308 1.026
scale(log10(prev)) -0.49763 0.01946 -25.570
Correlation of Fixed Effects:
(Intr) scl(d)
scale(dist) -0.024
scl(lg10()) 0.048 -0.180
Linear mixed model fit by REML ['lmerMod']
Formula: deviance_explained ~ scale(dist_com) + scale(log10(prev)) + (1 |
ibra_subregion) + (1 | taxon)
Data: ..1
REML criterion at convergence: 682.1
Scaled residuals:
Min 1Q Median 3Q Max
-9.5068 -0.3073 0.0618 0.4155 5.4828
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.16796 0.40982
ibra_subregion (Intercept) 0.00252 0.05019
Residual 0.14176 0.37651
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.06125 0.05104 1.200
scale(dist_com) 0.01608 0.02131 0.754
scale(log10(prev)) -0.49533 0.01924 -25.750
Correlation of Fixed Effects:
(Intr) scl(_)
scl(dst_cm) -0.019
scl(lg10()) 0.046 -0.092
Linear mixed model fit by REML ['lmerMod']
Formula: deviance_explained ~ scale(dist_env) + scale(log10(prev)) + (1 |
ibra_subregion) + (1 | taxon)
Data: ..1
REML criterion at convergence: 682.7
Scaled residuals:
Min 1Q Median 3Q Max
-9.5209 -0.3061 0.0622 0.4137 5.4822
Random effects:
Groups Name Variance Std.Dev.
taxon (Intercept) 0.166756 0.40836
ibra_subregion (Intercept) 0.002947 0.05429
Residual 0.141787 0.37655
Number of obs: 560, groups: taxon, 82; ibra_subregion, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.062073 0.051143 1.214
scale(dist_env) -0.005124 0.020925 -0.245
scale(log10(prev)) -0.495066 0.019348 -25.587
Correlation of Fixed Effects:
(Intr) scl(_)
scl(dst_nv) 0.007
scl(lg10()) 0.044 0.124
var_comps <- lapply(model_summaries, getElement, "varcor")
var_comps <- data.frame(
rep(c("AUROC", "AUPRC", "Relative AUPRC", "Deviance Explained"), each = 3),
c("Geographic", "Community", "Environmental"),
sqrt(vapply(var_comps, getElement, 0, "taxon")),
sqrt(vapply(var_comps, getElement, 0, "ibra_subregion")),
vapply(var_comps, attr, 0, "sc")
)
names(var_comps) <-
c("Performance metric", "Distance metric", "Taxon", "Region", "Residual")
vtab_perf <- xtable(
subset(var_comps, `Performance metric` != "Relative AUPRC"),
caption = "Variance components (on standard deviation scale) for models of
performance metrics vs. three distance to test region metrics.",
label = "tab:varcovperf",
align = "lll|lll", digits = 2
)
dir.create(
here("notebooks/models_of_performance_files/figure-html"),
showWarnings = FALSE, recursive = TRUE
)
print(
vtab_perf,
file = here(
"notebooks/models_of_performance_files/figure-html/vtab_perf.tex"
),
include.rownames = FALSE,
table.placement = "htbp!",
caption.placement = "top",
hline.after = c(-1, 0, nrow(vtab_perf)),
sanitize.text.function = identity
)
fixefs_perf <- lapply(model_summaries, getElement, "coefficients")
fixefs_perf <- lapply(fixefs_perf, function(x) x[, 1:2])
fixefs_perf <- do.call(rbind, fixefs_perf)
fixefs_perf <- cbind(
rep(c("AUROC", "AUPRC", "Relative AUPRC", "Deviance Explained"), each = 9),
rep(c("Geographic", "Community", "Environmental"), each = 3),
c("$\\beta_0$", "Distance", "Prevalence"),
data.frame(fixefs_perf, row.names = NULL)
)
names(fixefs_perf) <- c(
"Performance metric", "Distance metric", "Coefficient", "$\\mu$", "$\\sigma$"
)
fixefs_perf <- xtable(
subset(fixefs_perf, `Performance metric` != "Relative AUPRC"),
caption = "Fixed effects for models of
performance metrics vs. three distance to test region metrics.",
label = "tab:fixefsperf",
align = "llll|ll", digits = 2
)
print(
fixefs_perf,
file = here(
"notebooks/models_of_performance_files/figure-html/fixefs_perf.tex"
),
include.rownames = FALSE,
table.placement = "htbp!",
caption.placement = "top",
hline.after = c(-1, 0, nrow(fixefs_perf)),
sanitize.text.function = identity
)
gg_and_se_taxa <- subset(mds, y)
gg_and_se_taxa <- names(
Filter(
function(x) x > 4,
table(unique(gg_and_se_taxa[, c("taxon", "ibra_subregion")])$taxon)
)
)
gg_and_se_taxa <- intersect(gg_and_se_taxa, unique(mdg$taxon))
perf_southeast$gg_and_se_taxa <- perf_southeast$taxon %in% gg_and_se_taxa
ggplot(perf_southeast) +
aes(prev, `AUC`, color = gg_and_se_taxa) +
geom_point() +
scale_color_grey() +
scale_x_log10() +
xlab("Prevalence") +
ylab("AUC Receiver-Operator") +
theme_bw() +
theme(legend.position = "none")

ggplot(perf_southeast) +
aes(`Rand-AUC-PR`, `AUC-PR`) +
geom_point(color = "darkgrey") +
xlab("AUC Precision-Recall of random classifier") +
ylab("AUC Precision-Recall") +
theme_bw()

ggplot(perf_southeast) +
aes(`Rand-AUC-PR`, `Rel-AUC-PR`) +
geom_point(color = "darkgrey") +
xlab("AUC Precision-Recall of random classifier") +
ylab("Relative AUC Precision-Recall") +
theme_bw()

ggplot(perf_southeast) +
aes(prev, `AUC-PR`) +
geom_point(color = "darkgrey") +
scale_x_log10()+
scale_y_log10() +
geom_line(
aes(x = prev, y = 1 + (1 - prev) * log(1 - prev) / prev), color = "black",
linetype = "dotted"
) +
xlab("Prevalence") +
ylab("AUC Precision-Recall") +
theme_bw()

pvm_data <- pivot_wider(
responses,
names_from = Var,
values_from = c(Estimate, Std..Error, Prediction, Predicted..Error)
)
pvm_data <- filter(pvm_data, Region != "Greater Grampians")
pvm_data$dist_geo <- dists[pvm_data$Region]
pvm_data$dist_env <- kldists[pvm_data$Region]
pvm_data$dist_com <- community_dist[pvm_data$Region]
pvm_data <- mutate(
pvm_data,
mlq_mc = abs(Prediction_mlq - Estimate_mlq),
twi_mc = abs(Prediction_twi - Estimate_twi),
r1k_mc = abs(Prediction_r1k - Estimate_r1k),
tn_mc = abs(Prediction_tn - Estimate_tn)
)
pvm_auroc <- lmer(
qlogis(AUC) ~
scale(log(dist_geo)) +
scale(log(dist_com)) +
scale(log(dist_env)) +
scale(log(mlq_mc)) +
scale(log(twi_mc)) +
scale(log(r1k_mc)) +
scale(log(tn_mc)) +
(1 | Taxon) +
(1 | Region),
data = pvm_data
)
summary(pvm_auroc)
Linear mixed model fit by REML ['lmerMod']
Formula:
qlogis(AUC) ~ scale(log(dist_geo)) + scale(log(dist_com)) + scale(log(dist_env)) +
scale(log(mlq_mc)) + scale(log(twi_mc)) + scale(log(r1k_mc)) +
scale(log(tn_mc)) + (1 | Taxon) + (1 | Region)
Data: pvm_data
REML criterion at convergence: 1384.4
Scaled residuals:
Min 1Q Median 3Q Max
-2.0592 -0.5922 -0.2064 0.3506 5.4023
Random effects:
Groups Name Variance Std.Dev.
Taxon (Intercept) 0.08163 0.2857
Region (Intercept) 0.03505 0.1872
Residual 0.58551 0.7652
Number of obs: 560, groups: Taxon, 82; Region, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.877001 0.065799 13.328
scale(log(dist_geo)) 0.009232 0.074625 0.124
scale(log(dist_com)) -0.048411 0.073272 -0.661
scale(log(dist_env)) 0.056034 0.061162 0.916
scale(log(mlq_mc)) -0.007920 0.036112 -0.219
scale(log(twi_mc)) -0.091729 0.036888 -2.487
scale(log(r1k_mc)) -0.039376 0.035976 -1.095
scale(log(tn_mc)) -0.023449 0.035176 -0.667
Correlation of Fixed Effects:
(Intr) scl(lg(dst_g)) scl(lg(dst_c)) scl(lg(dst_n)) scl(lg(m_))
scl(lg(dst_g)) 0.011
scl(lg(dst_c)) -0.041 -0.569
scl(lg(dst_n)) 0.016 -0.116 -0.301
scl(lg(m_)) 0.001 0.014 -0.033 -0.037
scl(lg(tw_)) 0.003 0.055 0.006 -0.036 -0.027
scl(lg(1_)) 0.002 -0.072 0.030 0.004 -0.004
scl(lg(tn_)) 0.016 -0.029 0.017 0.003 -0.022
scl(lg(tw_)) s((1_)
scl(lg(dst_g))
scl(lg(dst_c))
scl(lg(dst_n))
scl(lg(m_))
scl(lg(tw_))
scl(lg(1_)) -0.037
scl(lg(tn_)) -0.088 -0.066
pvm_auprc <- lmer(
log(`AUC-PR` / prevalence) ~
scale(log(dist_geo)) +
scale(log(dist_com)) +
scale(log(dist_env)) +
scale(log(mlq_mc)) +
scale(log(twi_mc)) +
scale(log(r1k_mc)) +
scale(log(tn_mc)) +
(1 | Taxon) +
(1 | Region),
data = pvm_data
)
summary(pvm_auprc)
Linear mixed model fit by REML ['lmerMod']
Formula:
log(`AUC-PR`/prevalence) ~ scale(log(dist_geo)) + scale(log(dist_com)) +
scale(log(dist_env)) + scale(log(mlq_mc)) + scale(log(twi_mc)) +
scale(log(r1k_mc)) + scale(log(tn_mc)) + (1 | Taxon) + (1 | Region)
Data: pvm_data
REML criterion at convergence: 1285.2
Scaled residuals:
Min 1Q Median 3Q Max
-2.6282 -0.5536 -0.1355 0.3694 5.7482
Random effects:
Groups Name Variance Std.Dev.
Taxon (Intercept) 0.16370 0.4046
Region (Intercept) 0.03251 0.1803
Residual 0.45241 0.6726
Number of obs: 560, groups: Taxon, 82; Region, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.42741 0.07080 6.037
scale(log(dist_geo)) -0.04222 0.07029 -0.601
scale(log(dist_com)) -0.07632 0.06838 -1.116
scale(log(dist_env)) 0.17035 0.05718 2.979
scale(log(mlq_mc)) -0.05378 0.03280 -1.640
scale(log(twi_mc)) -0.18672 0.03425 -5.452
scale(log(r1k_mc)) -0.14870 0.03289 -4.522
scale(log(tn_mc)) -0.04913 0.03183 -1.544
Correlation of Fixed Effects:
(Intr) scl(lg(dst_g)) scl(lg(dst_c)) scl(lg(dst_n)) scl(lg(m_))
scl(lg(dst_g)) 0.006
scl(lg(dst_c)) -0.035 -0.564
scl(lg(dst_n)) 0.016 -0.115 -0.302
scl(lg(m_)) 0.000 0.012 -0.032 -0.035
scl(lg(tw_)) 0.001 0.064 0.008 -0.038 -0.027
scl(lg(1_)) -0.001 -0.063 0.031 0.001 0.018
scl(lg(tn_)) 0.020 -0.028 0.013 0.007 -0.021
scl(lg(tw_)) s((1_)
scl(lg(dst_g))
scl(lg(dst_c))
scl(lg(dst_n))
scl(lg(m_))
scl(lg(tw_))
scl(lg(1_)) -0.020
scl(lg(tn_)) -0.097 -0.074
dir.create(
here("notebooks/models_of_performance_files/figure-html"),
showWarnings = FALSE, recursive = TRUE
)
feff_tab <- matrix("", 10, 6)
feff_tab[1, c(3, 5)] <- c("AUROC", "AUPRC/Prevalence")
feff_tab[2, 1:6] <-
c("Fixed Effect", "", "$\\mu$", "$\\sigma$","$\\mu$", "$\\sigma$")
feff_tab[c(3, 4, 7), 1] <- c("Intercept", "Distance", "Error")
feff_tab[4:10, 2] <-
c("Geographic", "Community", "Environmental", "MLQ", "TWI", "R1K", "TN")
feff_tab[3:10, 3:4] <-
format(round(summary(pvm_auroc)$coefficients[, 1:2], 2), TRUE, 2)
feff_tab[3:10, 5:6] <-
format(round(summary(pvm_auprc)$coefficients[, 1:2], 2), TRUE, 2)
feff_tab <- xtable(
feff_tab, caption = "Fixed effects", label = "tab:feff",
align = "lll|llll", digits = 1
)
print(
feff_tab,
file = here(
"notebooks/models_of_performance_files/figure-html/fefftab.tex"
),
include.rownames = FALSE,
table.placement = "htbp!",
caption.placement = "top",
hline.after = c(-1, 2, nrow(feff_tab)),
include.colnames = FALSE,
sanitize.text.function = identity
)
reff_tab <- matrix(NA_character_, 4, 3)
reff_tab[1, 1:3] <- c("Random Effect", "AUROC", "AUPRC/Prevalence")
reff_tab[2:4, 1] <- c("Taxon", "Region", "Residual")
reff_tab[2:3, 2] <- format(sqrt(unlist(summary(pvm_auroc)$varcor)), digits = 1)
reff_tab[4, 2] <- format(attr(summary(pvm_auroc)$varcor, "sc"), digits = 1)
reff_tab[2:3, 3] <- format(sqrt(unlist(summary(pvm_auprc)$varcor)), digits = 1)
reff_tab[4, 3] <- format(attr(summary(pvm_auprc)$varcor, "sc"), digits = 1)
reff_tab <- xtable(
reff_tab, caption = "Random effects", label = "tab:reff",
align = "ll|ll", digits = 1
)
print(
reff_tab,
file = here(
"notebooks/models_of_performance_files/figure-html/refftab.tex"
),
include.rownames = FALSE,
table.placement = "htbp!",
caption.placement = "top",
hline.after = c(-1, 1, nrow(reff_tab)),
include.colnames = FALSE,
sanitize.text.function = identity
)
ranef_traits <- unique(mds[c("taxon", "sla", "sm", "mh")])
ranef_traits$ranef <- ranef(pvm_auprc)$Taxon[ranef_traits$taxon, ]
ranef_traits <- pivot_longer(ranef_traits, sla:mh)
ggplot(ranef_traits) +
aes(value, ranef) +
geom_point() +
lims(x = c(-4, 4), y = c(-1.5, 1.5)) +
facet_grid(
~name,
labeller = labeller(
name = as_labeller(c(mh = "Maximum height", sla = "SLA", sm = "Seed Mass"))
)
) +
xlab("Standard Deviations") +
ylab("Random effect") +
geom_text(
data = summarise(group_by(ranef_traits, name), r = cor(ranef, value)),
mapping = aes(
x = -Inf, y = -Inf,
label = sprintf("italic('r') == %s", round(r, digits = 2))
),
hjust = -0.1,
vjust = -1,
parse = TRUE
) +
theme_bw() +
theme(strip.background = element_blank())

IycgLS0tCiMnIHRpdGxlOiAiTW9kZWxzIG9mIHBlcmZvcm1hbmNlIgojJyBhdXRob3I6ICJXaWxsaWFtIEsuIE1vcnJpcyIKIycgZGF0ZTogImByIFN5cy5EYXRlKClgIgojJyBvdXRwdXQ6CiMnICAgcm1hcmtkb3duOjpodG1sX25vdGVib29rOgojJyAgICAgY29kZV9mb2xkaW5nOiBoaWRlCiMnIC0tLQoKIysgc2V0dXAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5rZWVwPSJub25lIiwgZmlnLnNob3c9ImhpZGUiCmtuaXRyOjpvcHRzX2NodW5rJHNldChjYWNoZSA9IFRSVUUsIGRldiA9IGMoInBuZyIsICJwZGYiKSkKbGlicmFyeShoZXJlKQpzb3VyY2UoaGVyZSgic3JjIiwgIm1vZGVsX2xpbmVhcl9ncmFtcGlhbnNfdmFsaWRhdGVfcmVzcG9uc2UuUiIpKQoKIysgcGVyZi1zb3V0aGVhc3QKcGVyZl9zb3V0aGVhc3QgPC0gbWVyZ2UoCiAgc3Vic2V0KAogICAgcGVyZiwgaWJyYV9zdWJyZWdpb24gIT0gIkdyZWF0ZXIgR3JhbXBpYW5zIiAmICFyYW5kb21fZWZmZWN0LCAtcmFuZG9tX2VmZmVjdAogICksCiAgd2l0aCgKICAgIG1kcywKICAgIHNldE5hbWVzKAogICAgICBhZ2dyZWdhdGUoeSwgbGlzdCh0YXhvbiwgaWJyYV9zdWJyZWdpb24pLCBtZWFuKSwKICAgICAgYygidGF4b24iLCAiaWJyYV9zdWJyZWdpb24iLCAicHJldiIpCiAgICApCiAgKQopCgpwZXJmX3NvdXRoZWFzdCRkaXN0IDwtIGRpc3RzW3BlcmZfc291dGhlYXN0JGlicmFfc3VicmVnaW9uXQpwZXJmX3NvdXRoZWFzdCRkaXN0X2VudiA8LSBrbGRpc3RzW3BlcmZfc291dGhlYXN0JGlicmFfc3VicmVnaW9uXQpwZXJmX3NvdXRoZWFzdCRkaXN0X2NvbSA8LSBjb21tdW5pdHlfZGlzdFtwZXJmX3NvdXRoZWFzdCRpYnJhX3N1YnJlZ2lvbl0KCiMrIG1vZGVscwpmb3JtcyA8LSBvdXRlcigKICBjKCJsb2coQVVDKSIsICJsb2coYEFVQy1QUmApIiwgImxvZyhgUmVsLUFVQy1QUmApIiwgImRldmlhbmNlX2V4cGxhaW5lZCIpLAogIGMoImRpc3QiLCAiZGlzdF9jb20iLCAiZGlzdF9lbnYiKSwKICBmdW5jdGlvbihwZXJmLCBkaXN0KSB7CiAgICBzcHJpbnRmKAogICAgICAiJXMgfgogICAgICAgIHNjYWxlKCVzKSArIHNjYWxlKGxvZzEwKHByZXYpKSArICgxIHwgaWJyYV9zdWJyZWdpb24pICsgKDEgfCB0YXhvbikiLAogICAgICBwZXJmLCBkaXN0CiAgICApCiAgfQopCmZvcm1zIDwtIGxhcHBseSh0KGZvcm1zKSwgYXMuZm9ybXVsYSkKbW9kZWxzIDwtIGxhcHBseShmb3JtcywgbG1lciwgZGF0YSA9IHBlcmZfc291dGhlYXN0KQptb2RlbF9zdW1tYXJpZXMgPC0gbGFwcGx5KG1vZGVscywgc3VtbWFyeSkKCmZvcihpIGluIG1vZGVsX3N1bW1hcmllcykgcHJpbnQoaSkKCiMrIHJhbmRvbS1lZmZlY3RzCnZhcl9jb21wcyA8LSBsYXBwbHkobW9kZWxfc3VtbWFyaWVzLCBnZXRFbGVtZW50LCAidmFyY29yIikKdmFyX2NvbXBzIDwtIGRhdGEuZnJhbWUoCiAgcmVwKGMoIkFVUk9DIiwgIkFVUFJDIiwgIlJlbGF0aXZlIEFVUFJDIiwgIkRldmlhbmNlIEV4cGxhaW5lZCIpLCBlYWNoID0gMyksCiAgYygiR2VvZ3JhcGhpYyIsICJDb21tdW5pdHkiLCAiRW52aXJvbm1lbnRhbCIpLAogIHNxcnQodmFwcGx5KHZhcl9jb21wcywgZ2V0RWxlbWVudCwgMCwgInRheG9uIikpLAogIHNxcnQodmFwcGx5KHZhcl9jb21wcywgZ2V0RWxlbWVudCwgMCwgImlicmFfc3VicmVnaW9uIikpLAogIHZhcHBseSh2YXJfY29tcHMsIGF0dHIsIDAsICJzYyIpCikKbmFtZXModmFyX2NvbXBzKSA8LQogIGMoIlBlcmZvcm1hbmNlIG1ldHJpYyIsICJEaXN0YW5jZSBtZXRyaWMiLCAiVGF4b24iLCAiUmVnaW9uIiwgIlJlc2lkdWFsIikKCnZ0YWJfcGVyZiA8LSB4dGFibGUoCiAgc3Vic2V0KHZhcl9jb21wcywgYFBlcmZvcm1hbmNlIG1ldHJpY2AgIT0gIlJlbGF0aXZlIEFVUFJDIiksCiAgY2FwdGlvbiA9ICJWYXJpYW5jZSBjb21wb25lbnRzIChvbiBzdGFuZGFyZCBkZXZpYXRpb24gc2NhbGUpIGZvciBtb2RlbHMgb2YKICAgICAgICAgICAgIHBlcmZvcm1hbmNlIG1ldHJpY3MgdnMuIHRocmVlIGRpc3RhbmNlIHRvIHRlc3QgcmVnaW9uIG1ldHJpY3MuIiwKICBsYWJlbCA9ICJ0YWI6dmFyY292cGVyZiIsCiAgYWxpZ24gPSAibGxsfGxsbCIsIGRpZ2l0cyA9IDIKKQoKZGlyLmNyZWF0ZSgKICBoZXJlKCJub3RlYm9va3MvbW9kZWxzX29mX3BlcmZvcm1hbmNlX2ZpbGVzL2ZpZ3VyZS1odG1sIiksCiAgc2hvd1dhcm5pbmdzID0gRkFMU0UsIHJlY3Vyc2l2ZSA9IFRSVUUKKQoKcHJpbnQoCiAgdnRhYl9wZXJmLAogIGZpbGUgPSBoZXJlKAogICAgIm5vdGVib29rcy9tb2RlbHNfb2ZfcGVyZm9ybWFuY2VfZmlsZXMvZmlndXJlLWh0bWwvdnRhYl9wZXJmLnRleCIKICApLAogIGluY2x1ZGUucm93bmFtZXMgPSBGQUxTRSwKICB0YWJsZS5wbGFjZW1lbnQgPSAiaHRicCEiLAogIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIsCiAgaGxpbmUuYWZ0ZXIgPSBjKC0xLCAwLCBucm93KHZ0YWJfcGVyZikpLAogIHNhbml0aXplLnRleHQuZnVuY3Rpb24gPSBpZGVudGl0eQopCgojKyBmaXhlZC1lZmZlY3RzCmZpeGVmc19wZXJmIDwtIGxhcHBseShtb2RlbF9zdW1tYXJpZXMsIGdldEVsZW1lbnQsICJjb2VmZmljaWVudHMiKQpmaXhlZnNfcGVyZiA8LSBsYXBwbHkoZml4ZWZzX3BlcmYsIGZ1bmN0aW9uKHgpIHhbLCAxOjJdKQpmaXhlZnNfcGVyZiA8LSBkby5jYWxsKHJiaW5kLCBmaXhlZnNfcGVyZikKZml4ZWZzX3BlcmYgPC0gY2JpbmQoCiAgcmVwKGMoIkFVUk9DIiwgIkFVUFJDIiwgIlJlbGF0aXZlIEFVUFJDIiwgIkRldmlhbmNlIEV4cGxhaW5lZCIpLCBlYWNoID0gOSksCiAgcmVwKGMoIkdlb2dyYXBoaWMiLCAiQ29tbXVuaXR5IiwgIkVudmlyb25tZW50YWwiKSwgZWFjaCA9IDMpLAogIGMoIiRcXGJldGFfMCQiLCAiRGlzdGFuY2UiLCAiUHJldmFsZW5jZSIpLAogIGRhdGEuZnJhbWUoZml4ZWZzX3BlcmYsIHJvdy5uYW1lcyA9IE5VTEwpCikKbmFtZXMoZml4ZWZzX3BlcmYpIDwtIGMoCiAgIlBlcmZvcm1hbmNlIG1ldHJpYyIsICJEaXN0YW5jZSBtZXRyaWMiLCAiQ29lZmZpY2llbnQiLCAiJFxcbXUkIiwgIiRcXHNpZ21hJCIKKQoKZml4ZWZzX3BlcmYgPC0geHRhYmxlKAogIHN1YnNldChmaXhlZnNfcGVyZiwgYFBlcmZvcm1hbmNlIG1ldHJpY2AgIT0gIlJlbGF0aXZlIEFVUFJDIiksCiAgY2FwdGlvbiA9ICJGaXhlZCBlZmZlY3RzIGZvciBtb2RlbHMgb2YKICAgICAgICAgICAgIHBlcmZvcm1hbmNlIG1ldHJpY3MgdnMuIHRocmVlIGRpc3RhbmNlIHRvIHRlc3QgcmVnaW9uIG1ldHJpY3MuIiwKICBsYWJlbCA9ICJ0YWI6Zml4ZWZzcGVyZiIsCiAgYWxpZ24gPSAibGxsbHxsbCIsIGRpZ2l0cyA9IDIKKQoKcHJpbnQoCiAgZml4ZWZzX3BlcmYsCiAgZmlsZSA9IGhlcmUoCiAgICAibm90ZWJvb2tzL21vZGVsc19vZl9wZXJmb3JtYW5jZV9maWxlcy9maWd1cmUtaHRtbC9maXhlZnNfcGVyZi50ZXgiCiAgKSwKICBpbmNsdWRlLnJvd25hbWVzID0gRkFMU0UsCiAgdGFibGUucGxhY2VtZW50ID0gImh0YnAhIiwKICBjYXB0aW9uLnBsYWNlbWVudCA9ICJ0b3AiLAogIGhsaW5lLmFmdGVyID0gYygtMSwgMCwgbnJvdyhmaXhlZnNfcGVyZikpLAogIHNhbml0aXplLnRleHQuZnVuY3Rpb24gPSBpZGVudGl0eQopCgojKyBnZy1hbmQtc2UtdGF4YQpnZ19hbmRfc2VfdGF4YSA8LSBzdWJzZXQobWRzLCB5KQoKZ2dfYW5kX3NlX3RheGEgPC0gbmFtZXMoCiAgRmlsdGVyKAogICAgZnVuY3Rpb24oeCkgeCA+IDQsCiAgICB0YWJsZSh1bmlxdWUoZ2dfYW5kX3NlX3RheGFbLCBjKCJ0YXhvbiIsICJpYnJhX3N1YnJlZ2lvbiIpXSkkdGF4b24pCiAgKQopCgpnZ19hbmRfc2VfdGF4YSA8LSBpbnRlcnNlY3QoZ2dfYW5kX3NlX3RheGEsIHVuaXF1ZShtZGckdGF4b24pKQoKcGVyZl9zb3V0aGVhc3QkZ2dfYW5kX3NlX3RheGEgPC0gcGVyZl9zb3V0aGVhc3QkdGF4b24gJWluJSBnZ19hbmRfc2VfdGF4YQoKIysgcGxvdC1hdWMtcHJldiwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmhlaWdodCA9IDMuNQpnZ3Bsb3QocGVyZl9zb3V0aGVhc3QpICsKYWVzKHByZXYsIGBBVUNgLCBjb2xvciA9IGdnX2FuZF9zZV90YXhhKSArCmdlb21fcG9pbnQoKSArCnNjYWxlX2NvbG9yX2dyZXkoKSArCnNjYWxlX3hfbG9nMTAoKSArCnhsYWIoIlByZXZhbGVuY2UiKSArCnlsYWIoIkFVQyBSZWNlaXZlci1PcGVyYXRvciIpICsKdGhlbWVfYncoKSArCnRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCiMrIHBsb3QtYXVwcmMtcmFuZCwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmhlaWdodCA9IDMuNQpnZ3Bsb3QocGVyZl9zb3V0aGVhc3QpICsKYWVzKGBSYW5kLUFVQy1QUmAsIGBBVUMtUFJgKSArCmdlb21fcG9pbnQoY29sb3IgPSAiZGFya2dyZXkiKSArCnhsYWIoIkFVQyBQcmVjaXNpb24tUmVjYWxsIG9mIHJhbmRvbSBjbGFzc2lmaWVyIikgKwp5bGFiKCJBVUMgUHJlY2lzaW9uLVJlY2FsbCIpICsKdGhlbWVfYncoKQoKIysgcGxvdC1yZWxhdXByYy1yYW5kLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLndpZHRoID0gMy41LCBmaWcuaGVpZ2h0ID0gMy41CmdncGxvdChwZXJmX3NvdXRoZWFzdCkgKwphZXMoYFJhbmQtQVVDLVBSYCwgYFJlbC1BVUMtUFJgKSArCmdlb21fcG9pbnQoY29sb3IgPSAiZGFya2dyZXkiKSArCnhsYWIoIkFVQyBQcmVjaXNpb24tUmVjYWxsIG9mIHJhbmRvbSBjbGFzc2lmaWVyIikgKwp5bGFiKCJSZWxhdGl2ZSBBVUMgUHJlY2lzaW9uLVJlY2FsbCIpICsKdGhlbWVfYncoKQoKIysgcGxvdC1hdWNvci1wcmV2LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLndpZHRoID0gMy41LCBmaWcuaGVpZ2h0ID0gMy41CmdncGxvdChwZXJmX3NvdXRoZWFzdCkgKwphZXMocHJldiwgYEFVQy1QUmApICsKZ2VvbV9wb2ludChjb2xvciA9ICJkYXJrZ3JleSIpICsKc2NhbGVfeF9sb2cxMCgpKwpzY2FsZV95X2xvZzEwKCkgKwpnZW9tX2xpbmUoCiAgYWVzKHggPSBwcmV2LCB5ID0gMSArICgxIC0gcHJldikgKiBsb2coMSAtIHByZXYpIC8gcHJldiksIGNvbG9yID0gImJsYWNrIiwKICBsaW5ldHlwZSA9ICJkb3R0ZWQiCikgKwp4bGFiKCJQcmV2YWxlbmNlIikgKwp5bGFiKCJBVUMgUHJlY2lzaW9uLVJlY2FsbCIpICsKdGhlbWVfYncoKQoKIysgbW9kZWxzLXBlcmYtdnMtbWlzc2NsYXNzLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRQpwdm1fZGF0YSA8LSBwaXZvdF93aWRlcigKICByZXNwb25zZXMsCiAgbmFtZXNfZnJvbSA9IFZhciwKICB2YWx1ZXNfZnJvbSA9IGMoRXN0aW1hdGUsIFN0ZC4uRXJyb3IsIFByZWRpY3Rpb24sIFByZWRpY3RlZC4uRXJyb3IpCikKCnB2bV9kYXRhIDwtIGZpbHRlcihwdm1fZGF0YSwgUmVnaW9uICE9ICJHcmVhdGVyIEdyYW1waWFucyIpCgpwdm1fZGF0YSRkaXN0X2dlbyA8LSBkaXN0c1twdm1fZGF0YSRSZWdpb25dCnB2bV9kYXRhJGRpc3RfZW52IDwtIGtsZGlzdHNbcHZtX2RhdGEkUmVnaW9uXQpwdm1fZGF0YSRkaXN0X2NvbSA8LSBjb21tdW5pdHlfZGlzdFtwdm1fZGF0YSRSZWdpb25dCgpwdm1fZGF0YSA8LSBtdXRhdGUoCiAgcHZtX2RhdGEsCiAgbWxxX21jID0gYWJzKFByZWRpY3Rpb25fbWxxIC0gRXN0aW1hdGVfbWxxKSwKICB0d2lfbWMgPSBhYnMoUHJlZGljdGlvbl90d2kgLSBFc3RpbWF0ZV90d2kpLAogIHIxa19tYyA9IGFicyhQcmVkaWN0aW9uX3IxayAtIEVzdGltYXRlX3IxayksCiAgdG5fbWMgID0gYWJzKFByZWRpY3Rpb25fdG4gLSBFc3RpbWF0ZV90bikKKQoKcHZtX2F1cm9jIDwtIGxtZXIoCiAgcWxvZ2lzKEFVQykgfgogICAgc2NhbGUobG9nKGRpc3RfZ2VvKSkgKwogICAgc2NhbGUobG9nKGRpc3RfY29tKSkgKwogICAgc2NhbGUobG9nKGRpc3RfZW52KSkgKwogICAgc2NhbGUobG9nKG1scV9tYykpICsKICAgIHNjYWxlKGxvZyh0d2lfbWMpKSArCiAgICBzY2FsZShsb2cocjFrX21jKSkgKwogICAgc2NhbGUobG9nKHRuX21jKSkgKwogICAgKDEgfCBUYXhvbikgKwogICAgKDEgfCBSZWdpb24pLAogIGRhdGEgPSBwdm1fZGF0YQopCgpzdW1tYXJ5KHB2bV9hdXJvYykKCnB2bV9hdXByYyA8LSBsbWVyKAogIGxvZyhgQVVDLVBSYCAvIHByZXZhbGVuY2UpIH4KICAgIHNjYWxlKGxvZyhkaXN0X2dlbykpICsKICAgIHNjYWxlKGxvZyhkaXN0X2NvbSkpICsKICAgIHNjYWxlKGxvZyhkaXN0X2VudikpICsKICAgIHNjYWxlKGxvZyhtbHFfbWMpKSArCiAgICBzY2FsZShsb2codHdpX21jKSkgKwogICAgc2NhbGUobG9nKHIxa19tYykpICsKICAgIHNjYWxlKGxvZyh0bl9tYykpICsKICAgICgxIHwgVGF4b24pICsKICAgICgxIHwgUmVnaW9uKSwKICBkYXRhID0gcHZtX2RhdGEKKQoKc3VtbWFyeShwdm1fYXVwcmMpCgojKyBmZWZmdGFiCmRpci5jcmVhdGUoCiAgaGVyZSgibm90ZWJvb2tzL21vZGVsc19vZl9wZXJmb3JtYW5jZV9maWxlcy9maWd1cmUtaHRtbCIpLAogIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFCikKCmZlZmZfdGFiIDwtIG1hdHJpeCgiIiwgMTAsIDYpCmZlZmZfdGFiWzEsIGMoMywgNSldIDwtIGMoIkFVUk9DIiwgIkFVUFJDL1ByZXZhbGVuY2UiKQpmZWZmX3RhYlsyLCAxOjZdIDwtCiAgYygiRml4ZWQgRWZmZWN0IiwgIiIsICIkXFxtdSQiLCAiJFxcc2lnbWEkIiwiJFxcbXUkIiwgIiRcXHNpZ21hJCIpCmZlZmZfdGFiW2MoMywgNCwgNyksIDFdIDwtIGMoIkludGVyY2VwdCIsICJEaXN0YW5jZSIsICJFcnJvciIpCmZlZmZfdGFiWzQ6MTAsIDJdIDwtCiAgYygiR2VvZ3JhcGhpYyIsICJDb21tdW5pdHkiLCAiRW52aXJvbm1lbnRhbCIsICJNTFEiLCAiVFdJIiwgIlIxSyIsICJUTiIpCmZlZmZfdGFiWzM6MTAsIDM6NF0gPC0KICBmb3JtYXQocm91bmQoc3VtbWFyeShwdm1fYXVyb2MpJGNvZWZmaWNpZW50c1ssIDE6Ml0sIDIpLCBUUlVFLCAyKQpmZWZmX3RhYlszOjEwLCA1OjZdIDwtCiAgZm9ybWF0KHJvdW5kKHN1bW1hcnkocHZtX2F1cHJjKSRjb2VmZmljaWVudHNbLCAxOjJdLCAyKSwgVFJVRSwgMikKCmZlZmZfdGFiIDwtIHh0YWJsZSgKICBmZWZmX3RhYiwgY2FwdGlvbiA9ICJGaXhlZCBlZmZlY3RzIiwgbGFiZWwgPSAidGFiOmZlZmYiLAogIGFsaWduID0gImxsbHxsbGxsIiwgZGlnaXRzID0gMQopCgpwcmludCgKICBmZWZmX3RhYiwKICBmaWxlID0gaGVyZSgKICAgICJub3RlYm9va3MvbW9kZWxzX29mX3BlcmZvcm1hbmNlX2ZpbGVzL2ZpZ3VyZS1odG1sL2ZlZmZ0YWIudGV4IgogICksCiAgaW5jbHVkZS5yb3duYW1lcyA9IEZBTFNFLAogIHRhYmxlLnBsYWNlbWVudCA9ICJodGJwISIsCiAgY2FwdGlvbi5wbGFjZW1lbnQgPSAidG9wIiwKICBobGluZS5hZnRlciA9IGMoLTEsIDIsIG5yb3coZmVmZl90YWIpKSwKICBpbmNsdWRlLmNvbG5hbWVzID0gRkFMU0UsCiAgc2FuaXRpemUudGV4dC5mdW5jdGlvbiA9IGlkZW50aXR5CikKCiMrIHJlZmZ0YWIKcmVmZl90YWIgPC0gbWF0cml4KE5BX2NoYXJhY3Rlcl8sIDQsIDMpCnJlZmZfdGFiWzEsIDE6M10gPC0gYygiUmFuZG9tIEVmZmVjdCIsICJBVVJPQyIsICJBVVBSQy9QcmV2YWxlbmNlIikKcmVmZl90YWJbMjo0LCAxXSA8LSBjKCJUYXhvbiIsICJSZWdpb24iLCAiUmVzaWR1YWwiKQpyZWZmX3RhYlsyOjMsIDJdIDwtIGZvcm1hdChzcXJ0KHVubGlzdChzdW1tYXJ5KHB2bV9hdXJvYykkdmFyY29yKSksIGRpZ2l0cyA9IDEpCnJlZmZfdGFiWzQsIDJdICAgPC0gZm9ybWF0KGF0dHIoc3VtbWFyeShwdm1fYXVyb2MpJHZhcmNvciwgInNjIiksIGRpZ2l0cyA9IDEpCnJlZmZfdGFiWzI6MywgM10gPC0gZm9ybWF0KHNxcnQodW5saXN0KHN1bW1hcnkocHZtX2F1cHJjKSR2YXJjb3IpKSwgZGlnaXRzID0gMSkKcmVmZl90YWJbNCwgM10gICA8LSBmb3JtYXQoYXR0cihzdW1tYXJ5KHB2bV9hdXByYykkdmFyY29yLCAic2MiKSwgZGlnaXRzID0gMSkKCnJlZmZfdGFiIDwtIHh0YWJsZSgKICByZWZmX3RhYiwgY2FwdGlvbiA9ICJSYW5kb20gZWZmZWN0cyIsIGxhYmVsID0gInRhYjpyZWZmIiwKICBhbGlnbiA9ICJsbHxsbCIsIGRpZ2l0cyA9IDEKKQoKcHJpbnQoCiAgcmVmZl90YWIsCiAgZmlsZSA9IGhlcmUoCiAgICAibm90ZWJvb2tzL21vZGVsc19vZl9wZXJmb3JtYW5jZV9maWxlcy9maWd1cmUtaHRtbC9yZWZmdGFiLnRleCIKICApLAogIGluY2x1ZGUucm93bmFtZXMgPSBGQUxTRSwKICB0YWJsZS5wbGFjZW1lbnQgPSAiaHRicCEiLAogIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIsCiAgaGxpbmUuYWZ0ZXIgPSBjKC0xLCAxLCBucm93KHJlZmZfdGFiKSksCiAgaW5jbHVkZS5jb2xuYW1lcyA9IEZBTFNFLAogIHNhbml0aXplLnRleHQuZnVuY3Rpb24gPSBpZGVudGl0eQopCgojKyBwbG90LXJhbmVmLXRyYWl0cywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDcuNSwgZmlnLmhlaWdodCA9IDMuNQpyYW5lZl90cmFpdHMgPC0gdW5pcXVlKG1kc1tjKCJ0YXhvbiIsICJzbGEiLCAic20iLCAibWgiKV0pCnJhbmVmX3RyYWl0cyRyYW5lZiA8LSByYW5lZihwdm1fYXVwcmMpJFRheG9uW3JhbmVmX3RyYWl0cyR0YXhvbiwgXQpyYW5lZl90cmFpdHMgPC0gcGl2b3RfbG9uZ2VyKHJhbmVmX3RyYWl0cywgc2xhOm1oKQoKZ2dwbG90KHJhbmVmX3RyYWl0cykgKwphZXModmFsdWUsIHJhbmVmKSArCmdlb21fcG9pbnQoKSArCmxpbXMoeCA9IGMoLTQsIDQpLCB5ID0gYygtMS41LCAxLjUpKSArCmZhY2V0X2dyaWQoCiAgfm5hbWUsCiAgbGFiZWxsZXIgPSBsYWJlbGxlcigKICAgIG5hbWUgPSBhc19sYWJlbGxlcihjKG1oID0gIk1heGltdW0gaGVpZ2h0Iiwgc2xhID0gIlNMQSIsIHNtID0gIlNlZWQgTWFzcyIpKQogICkKKSArCnhsYWIoIlN0YW5kYXJkIERldmlhdGlvbnMiKSArCnlsYWIoIlJhbmRvbSBlZmZlY3QiKSArCmdlb21fdGV4dCgKICBkYXRhID0gc3VtbWFyaXNlKGdyb3VwX2J5KHJhbmVmX3RyYWl0cywgbmFtZSksIHIgPSBjb3IocmFuZWYsIHZhbHVlKSksCiAgbWFwcGluZyA9IGFlcygKICAgIHggPSAtSW5mLCB5ID0gLUluZiwKICAgIGxhYmVsID0gc3ByaW50ZigiaXRhbGljKCdyJykgPT0gJXMiLCByb3VuZChyLCBkaWdpdHMgPSAyKSkKICApLAogIGhqdXN0ICAgPSAtMC4xLAogIHZqdXN0ICAgPSAtMSwKICBwYXJzZSA9IFRSVUUKKSArCnRoZW1lX2J3KCkgKwp0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKQo=