diff --git a/Clustering_Knowhow_files/figure-html/unnamed-chunk-10-1.png b/Clustering_Knowhow_files/figure-html/unnamed-chunk-10-1.png index 4d06723bb..f085b896a 100644 Binary files a/Clustering_Knowhow_files/figure-html/unnamed-chunk-10-1.png and b/Clustering_Knowhow_files/figure-html/unnamed-chunk-10-1.png differ diff --git a/Clustering_Knowhow_files/figure-html/unnamed-chunk-5-1.png b/Clustering_Knowhow_files/figure-html/unnamed-chunk-5-1.png index bfb607fcd..2958b7955 100644 Binary files a/Clustering_Knowhow_files/figure-html/unnamed-chunk-5-1.png and b/Clustering_Knowhow_files/figure-html/unnamed-chunk-5-1.png differ diff --git a/Clustering_Knowhow_files/figure-html/unnamed-chunk-6-1.png b/Clustering_Knowhow_files/figure-html/unnamed-chunk-6-1.png index 2a0d6dc04..4d1c629eb 100644 Binary files a/Clustering_Knowhow_files/figure-html/unnamed-chunk-6-1.png and b/Clustering_Knowhow_files/figure-html/unnamed-chunk-6-1.png differ diff --git a/Clustering_Knowhow_files/figure-html/unnamed-chunk-7-1.png b/Clustering_Knowhow_files/figure-html/unnamed-chunk-7-1.png index 84c2374c0..175d2cd9a 100644 Binary files a/Clustering_Knowhow_files/figure-html/unnamed-chunk-7-1.png and b/Clustering_Knowhow_files/figure-html/unnamed-chunk-7-1.png differ diff --git a/Clustering_Knowhow_files/figure-html/unnamed-chunk-8-1.png b/Clustering_Knowhow_files/figure-html/unnamed-chunk-8-1.png index 41933b67a..b8ee91ab8 100644 Binary files a/Clustering_Knowhow_files/figure-html/unnamed-chunk-8-1.png and b/Clustering_Knowhow_files/figure-html/unnamed-chunk-8-1.png differ diff --git a/Comp/r-sas-python_survey-stats-summary.html b/Comp/r-sas-python_survey-stats-summary.html index cbd9db683..f73230351 100644 --- a/Comp/r-sas-python_survey-stats-summary.html +++ b/Comp/r-sas-python_survey-stats-summary.html @@ -760,23 +760,23 @@

Quantiles

head(apisrs) |> gt::gt()
-
- @@ -1654,21 +1654,21 @@

Summary and Recommendations

─ Session info ───────────────────────────────────────────────────────────────
  setting  value
  version  R version 4.4.0 (2024-04-24)
- os       Ubuntu 22.04.5 LTS
+ os       Ubuntu 24.04.1 LTS
  system   x86_64, linux-gnu
  ui       X11
  language (EN)
  collate  C.UTF-8
  ctype    C.UTF-8
  tz       UTC
- date     2024-10-10
+ date     2024-10-15
  pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
 
 ─ Packages ───────────────────────────────────────────────────────────────────
  ! package * version date (UTC) lib source
  P survey  * 4.4-2   2024-03-20 [?] RSPM (R 4.4.0)
 
- [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu
+ [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu
  [2] /opt/R/4.4.0/lib/R/library
 
  P ── Loaded and on-disk path mismatch.
@@ -1683,7 +1683,7 @@ 

Summary and Recommendations

─ Python configuration ────────────────────────────────────────────────────────
- Python    3.12.7 (main, Oct  1 2024, 15:17:55) [GCC 11.4.0]
+ Python    3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0]
  samplics  0.4.22
diff --git a/Comp/r-sas_cmh.html b/Comp/r-sas_cmh.html index 378243aa4..b717fbdb5 100644 --- a/Comp/r-sas_cmh.html +++ b/Comp/r-sas_cmh.html @@ -349,23 +349,23 @@

CMH Statistics

As it can be seen, there are two schemata where R does not provide any results:

-
- diff --git a/Comp/r-sas_friedman.html b/Comp/r-sas_friedman.html index 10066d945..5177b7adb 100644 --- a/Comp/r-sas_friedman.html +++ b/Comp/r-sas_friedman.html @@ -352,21 +352,21 @@

References

─ Session info ───────────────────────────────────────────────────────────────
  setting  value
  version  R version 4.4.0 (2024-04-24)
- os       Ubuntu 22.04.5 LTS
+ os       Ubuntu 24.04.1 LTS
  system   x86_64, linux-gnu
  ui       X11
  language (EN)
  collate  C.UTF-8
  ctype    C.UTF-8
  tz       UTC
- date     2024-10-10
+ date     2024-10-15
  pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
 
 ─ Packages ───────────────────────────────────────────────────────────────────
  ! package * version date (UTC) lib source
  P rstatix * 0.7.2   2023-02-01 [?] RSPM (R 4.4.0)
 
- [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu
+ [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu
  [2] /opt/R/4.4.0/lib/R/library
 
  P ── Loaded and on-disk path mismatch.
diff --git a/Comp/r-sas_friedman_files/figure-html/unnamed-chunk-2-1.png b/Comp/r-sas_friedman_files/figure-html/unnamed-chunk-2-1.png
index 38f179706..183c619c2 100644
Binary files a/Comp/r-sas_friedman_files/figure-html/unnamed-chunk-2-1.png and b/Comp/r-sas_friedman_files/figure-html/unnamed-chunk-2-1.png differ
diff --git a/Comp/r-sas_survival_cif.html b/Comp/r-sas_survival_cif.html
index 79ef795b0..59c128691 100644
--- a/Comp/r-sas_survival_cif.html
+++ b/Comp/r-sas_survival_cif.html
@@ -276,14 +276,14 @@ 

Comparison of R and SAS

─ Session info ───────────────────────────────────────────────────────────────
  setting  value
  version  R version 4.4.0 (2024-04-24)
- os       Ubuntu 22.04.5 LTS
+ os       Ubuntu 24.04.1 LTS
  system   x86_64, linux-gnu
  ui       X11
  language (EN)
  collate  C.UTF-8
  ctype    C.UTF-8
  tz       UTC
- date     2024-10-10
+ date     2024-10-15
  pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
 
 ─ Packages ───────────────────────────────────────────────────────────────────
@@ -292,7 +292,7 @@ 

Comparison of R and SAS

survival 3.7-0 2024-06-05 [1] RSPM (R 4.4.0) tidycmprsk 1.1.0 2024-08-17 [1] RSPM (R 4.4.0) - [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu + [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu [2] /opt/R/4.4.0/lib/R/library ─ External software ────────────────────────────────────────────────────────── diff --git a/R/Accelerated_Failure_time_model_files/figure-html/unnamed-chunk-3-1.png b/R/Accelerated_Failure_time_model_files/figure-html/unnamed-chunk-3-1.png index fdfb6c658..1d52c0ad0 100644 Binary files a/R/Accelerated_Failure_time_model_files/figure-html/unnamed-chunk-3-1.png and b/R/Accelerated_Failure_time_model_files/figure-html/unnamed-chunk-3-1.png differ diff --git a/R/Accelerated_Failure_time_model_files/figure-html/unnamed-chunk-6-1.png b/R/Accelerated_Failure_time_model_files/figure-html/unnamed-chunk-6-1.png index 55ab7cc00..eabb5fd3d 100644 Binary files a/R/Accelerated_Failure_time_model_files/figure-html/unnamed-chunk-6-1.png and b/R/Accelerated_Failure_time_model_files/figure-html/unnamed-chunk-6-1.png differ diff --git a/R/PCA_analysis.html b/R/PCA_analysis.html index 162bb582e..ad9b67831 100644 --- a/R/PCA_analysis.html +++ b/R/PCA_analysis.html @@ -387,8 +387,8 @@

Vi scene = list(bgcolor = "lightgray")) fig

-
- +
+
diff --git a/R/PCA_analysis_files/figure-html/unnamed-chunk-3-1.png b/R/PCA_analysis_files/figure-html/unnamed-chunk-3-1.png index 0dd9943f8..19dd1c5c1 100644 Binary files a/R/PCA_analysis_files/figure-html/unnamed-chunk-3-1.png and b/R/PCA_analysis_files/figure-html/unnamed-chunk-3-1.png differ diff --git a/R/PCA_analysis_files/figure-html/unnamed-chunk-4-1.png b/R/PCA_analysis_files/figure-html/unnamed-chunk-4-1.png index 58e10dc46..0b9bde753 100644 Binary files a/R/PCA_analysis_files/figure-html/unnamed-chunk-4-1.png and b/R/PCA_analysis_files/figure-html/unnamed-chunk-4-1.png differ diff --git a/R/Weighted-log-rank.html b/R/Weighted-log-rank.html index 107ad5561..01ba54c63 100644 --- a/R/Weighted-log-rank.html +++ b/R/Weighted-log-rank.html @@ -386,14 +386,14 @@

References

─ Session info ───────────────────────────────────────────────────────────────
  setting  value
  version  R version 4.4.0 (2024-04-24)
- os       Ubuntu 22.04.5 LTS
+ os       Ubuntu 24.04.1 LTS
  system   x86_64, linux-gnu
  ui       X11
  language (EN)
  collate  C.UTF-8
  ctype    C.UTF-8
  tz       UTC
- date     2024-10-10
+ date     2024-10-15
  pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
 
 ─ Packages ───────────────────────────────────────────────────────────────────
@@ -401,7 +401,7 @@ 

References

P nphRCT * 0.1.1 2024-06-27 [?] RSPM (R 4.4.0) P survival * 3.7-0 2024-06-05 [?] RSPM (R 4.4.0) - [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu + [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu [2] /opt/R/4.4.0/lib/R/library P ── Loaded and on-disk path mismatch. diff --git a/R/ancova.html b/R/ancova.html index 0f1eb964b..4169513db 100644 --- a/R/ancova.html +++ b/R/ancova.html @@ -273,23 +273,23 @@

The Model

model_tidy <- model_ancova %>% tidy() model_glance %>% gt()
-
- @@ -762,23 +762,23 @@

The Model

model_tidy   %>% gt()
-
- @@ -1265,23 +1265,23 @@

The Model

add_row(term = "Total", df = sum(.$df), sumsq = sum(.$sumsq)) model_table %>% gt()
-
- @@ -1773,23 +1773,23 @@

Type 1

get_anova_table() %>% gt()
-
- @@ -2275,23 +2275,23 @@

Type 2

get_anova_table() %>% gt()
-
- @@ -2777,23 +2777,23 @@

Type 3

get_anova_table() %>% gt()
-
- diff --git a/R/ancova_files/figure-html/unnamed-chunk-7-1.png b/R/ancova_files/figure-html/unnamed-chunk-7-1.png index 9cde2d3fa..2da726adb 100644 Binary files a/R/ancova_files/figure-html/unnamed-chunk-7-1.png and b/R/ancova_files/figure-html/unnamed-chunk-7-1.png differ diff --git a/R/cmh.html b/R/cmh.html index dffb3b445..72d22db16 100644 --- a/R/cmh.html +++ b/R/cmh.html @@ -241,23 +241,23 @@

Available R packages<

We did not find any R package that delivers all the same measures as SAS at once. Therefore, we tried out multiple packages:

-
- diff --git a/R/count_data_regression_files/figure-html/unnamed-chunk-3-1.png b/R/count_data_regression_files/figure-html/unnamed-chunk-3-1.png index ec2d572b6..fcaeefe03 100644 Binary files a/R/count_data_regression_files/figure-html/unnamed-chunk-3-1.png and b/R/count_data_regression_files/figure-html/unnamed-chunk-3-1.png differ diff --git a/R/gsd-tte.html b/R/gsd-tte.html index d7612fc5c..aa949f5ed 100644 --- a/R/gsd-tte.html +++ b/R/gsd-tte.html @@ -439,23 +439,23 @@

Example using gsDe summary() |> as_gt()

-
- @@ -1008,23 +1008,23 @@

Example using gsDe summary() |> as_gt()

-
- diff --git a/R/mi_mar_predictive_mean_match.html b/R/mi_mar_predictive_mean_match.html index 2be0face2..97649be50 100644 --- a/R/mi_mar_predictive_mean_match.html +++ b/R/mi_mar_predictive_mean_match.html @@ -363,15 +363,15 @@

Impute with PMM

imp_pmm$imp$bmi
      1    2    3    4    5
-1  29.6 22.0 33.2 33.2 30.1
-3  30.1 22.0 28.7 35.3 29.6
-4  26.3 22.5 21.7 22.5 24.9
-6  22.7 24.9 24.9 20.4 24.9
-10 28.7 27.5 30.1 22.5 29.6
-11 27.2 22.0 30.1 22.0 29.6
-12 33.2 29.6 29.6 20.4 29.6
-16 33.2 27.2 27.4 30.1 27.4
-21 27.2 30.1 27.4 30.1 27.2
+1 27.2 30.1 27.2 35.3 27.4 +3 30.1 33.2 22.0 27.2 35.3 +4 22.0 20.4 25.5 22.5 21.7 +6 22.7 22.7 24.9 22.5 20.4 +10 27.4 22.0 28.7 22.7 22.5 +11 22.0 35.3 30.1 30.1 20.4 +12 27.4 28.7 27.2 28.7 22.7 +16 28.7 33.2 20.4 35.3 20.4 +21 26.3 33.2 22.0 27.2 20.4

An alternative to the standard PMM is midastouch.

@@ -448,15 +448,15 @@

Impute with PMM

imp_pmms$imp$bmi
      1    2    3    4    5
-1  29.6 20.4 30.1 30.1 20.4
-3  29.6 22.0 30.1 30.1 29.6
-4  24.9 21.7 27.2 21.7 21.7
-6  24.9 21.7 27.2 21.7 21.7
-10 26.3 27.4 30.1 27.4 20.4
-11 29.6 20.4 33.2 33.2 29.6
-12 26.3 21.7 26.3 26.3 20.4
-16 27.4 33.2 30.1 33.2 29.6
-21 29.6 20.4 33.2 30.1 35.3
+1 22.5 30.1 30.1 22.0 29.6 +3 30.1 30.1 30.1 22.0 29.6 +4 25.5 25.5 30.1 24.9 27.4 +6 25.5 21.7 28.7 33.2 27.4 +10 21.7 29.6 22.7 22.7 26.3 +11 28.7 29.6 30.1 33.2 29.6 +12 21.7 29.6 22.7 20.4 22.7 +16 27.2 30.1 35.3 33.2 30.1 +21 27.2 29.6 30.1 33.2 29.6
diff --git a/R/mi_mar_regression_files/figure-html/missing-pattern-1.png b/R/mi_mar_regression_files/figure-html/missing-pattern-1.png index 90e7c7a2e..2f1820bd4 100644 Binary files a/R/mi_mar_regression_files/figure-html/missing-pattern-1.png and b/R/mi_mar_regression_files/figure-html/missing-pattern-1.png differ diff --git a/R/nonpara_wilcoxon_ranksum_files/figure-html/unnamed-chunk-4-1.png b/R/nonpara_wilcoxon_ranksum_files/figure-html/unnamed-chunk-4-1.png index 16ff1d7f1..a8426cb45 100644 Binary files a/R/nonpara_wilcoxon_ranksum_files/figure-html/unnamed-chunk-4-1.png and b/R/nonpara_wilcoxon_ranksum_files/figure-html/unnamed-chunk-4-1.png differ diff --git a/R/survey-stats-summary.html b/R/survey-stats-summary.html index 8de70288a..7aaca36da 100644 --- a/R/survey-stats-summary.html +++ b/R/survey-stats-summary.html @@ -269,23 +269,23 @@

Simple Survey Designs

head(apisrs) |> gt::gt()
-
- @@ -1138,23 +1138,23 @@

Summary Statistics on Complex Survey Designs

head(nhanes) |> gt::gt()
-
- @@ -1724,21 +1724,21 @@

Summary Statistics on Complex Survey Designs

─ Session info ───────────────────────────────────────────────────────────────
  setting  value
  version  R version 4.4.0 (2024-04-24)
- os       Ubuntu 22.04.5 LTS
+ os       Ubuntu 24.04.1 LTS
  system   x86_64, linux-gnu
  ui       X11
  language (EN)
  collate  C.UTF-8
  ctype    C.UTF-8
  tz       UTC
- date     2024-10-10
+ date     2024-10-15
  pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
 
 ─ Packages ───────────────────────────────────────────────────────────────────
  ! package * version date (UTC) lib source
  P survey  * 4.4-2   2024-03-20 [?] RSPM (R 4.4.0)
 
- [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu
+ [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu
  [2] /opt/R/4.4.0/lib/R/library
 
  P ── Loaded and on-disk path mismatch.
diff --git a/R/survival_cif.html b/R/survival_cif.html
index 1a89c40ad..bee7f6ac9 100644
--- a/R/survival_cif.html
+++ b/R/survival_cif.html
@@ -502,14 +502,14 @@ 

Summary

─ Session info ───────────────────────────────────────────────────────────────
  setting  value
  version  R version 4.4.0 (2024-04-24)
- os       Ubuntu 22.04.5 LTS
+ os       Ubuntu 24.04.1 LTS
  system   x86_64, linux-gnu
  ui       X11
  language (EN)
  collate  C.UTF-8
  ctype    C.UTF-8
  tz       UTC
- date     2024-10-10
+ date     2024-10-15
  pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
 
 ─ Packages ───────────────────────────────────────────────────────────────────
@@ -518,7 +518,7 @@ 

Summary

P survival * 3.7-0 2024-06-05 [?] RSPM (R 4.4.0) P tidycmprsk * 1.1.0 2024-08-17 [?] RSPM (R 4.4.0) - [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu + [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu [2] /opt/R/4.4.0/lib/R/library P ── Loaded and on-disk path mismatch. diff --git a/R/survival_cif_files/figure-html/cr.plot-1.png b/R/survival_cif_files/figure-html/cr.plot-1.png index 21e9fed1d..507b96213 100644 Binary files a/R/survival_cif_files/figure-html/cr.plot-1.png and b/R/survival_cif_files/figure-html/cr.plot-1.png differ diff --git a/R/survival_cif_files/figure-html/cr.plot-2.png b/R/survival_cif_files/figure-html/cr.plot-2.png index 40bf81060..fa4f105ed 100644 Binary files a/R/survival_cif_files/figure-html/cr.plot-2.png and b/R/survival_cif_files/figure-html/cr.plot-2.png differ diff --git a/R/xgboost.html b/R/xgboost.html index 74e097b09..0429bff91 100644 --- a/R/xgboost.html +++ b/R/xgboost.html @@ -289,7 +289,7 @@

Data used

✖ MASS::select() masks dplyr::select() ✖ yardstick::spec() masks readr::spec() ✖ recipes::step() masks stats::step() -• Use tidymodels_prefer() to resolve common conflicts.
+• Dig deeper into tidy modeling with R at https://www.tmwr.org
library(xgboost)
@@ -391,9 +391,9 @@

Classification

3 Not Low 0.985 0.0151 4 Not Low 0.985 0.0151 5 Not Low 0.985 0.0151 - 6 Not Low 0.988 0.0116 - 7 Not Low 0.988 0.0116 - 8 Not Low 0.988 0.0116 + 6 Not Low 0.985 0.0151 + 7 Not Low 0.985 0.0151 + 8 Not Low 0.985 0.0151 9 Not Low 0.988 0.0116 10 Not Low 0.988 0.0116 # ℹ 38 more rows @@ -492,14 +492,14 @@

Reference

─ Session info ───────────────────────────────────────────────────────────────
  setting  value
  version  R version 4.4.0 (2024-04-24)
- os       Ubuntu 22.04.5 LTS
+ os       Ubuntu 24.04.1 LTS
  system   x86_64, linux-gnu
  ui       X11
  language (EN)
  collate  C.UTF-8
  ctype    C.UTF-8
  tz       UTC
- date     2024-10-10
+ date     2024-10-15
  pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
 
 ─ Packages ───────────────────────────────────────────────────────────────────
@@ -591,7 +591,7 @@ 

Reference

P yaml 2.3.10 2024-07-26 [?] RSPM (R 4.4.0) P yardstick * 1.3.1 2024-03-21 [?] RSPM (R 4.4.0) - [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu + [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu [2] /opt/R/4.4.0/lib/R/library P ── Loaded and on-disk path mismatch. diff --git a/SAS/linear-regression.html b/SAS/linear-regression.html index ad68218fe..9c5479a51 100644 --- a/SAS/linear-regression.html +++ b/SAS/linear-regression.html @@ -217,7 +217,7 @@

Linear Regression

Published
-

10 October, 2024

+

15 October, 2024

diff --git a/SAS/logistic-regr.html b/SAS/logistic-regr.html index 308120cf0..6fb3cea0c 100644 --- a/SAS/logistic-regr.html +++ b/SAS/logistic-regr.html @@ -219,7 +219,7 @@

Logistic Regression in SAS

Published
-

10 October, 2024

+

15 October, 2024

diff --git a/SAS/survey-stats-summary.html b/SAS/survey-stats-summary.html index cf3fef4f6..fcee7ba41 100644 --- a/SAS/survey-stats-summary.html +++ b/SAS/survey-stats-summary.html @@ -264,23 +264,23 @@

Simple Survey Designs

We will use the API dataset (“API Data Files” 2006), which contains a number of datasets based on different samples from a dataset of academic performance. Initially we will just cover the methodology with a simple random sample and a finite population correction to demonstrate functionality.

-
- @@ -1145,23 +1145,23 @@

Summary Statistics on Complex Survey Designs

Much of the previous examples and notes still stand for more complex survey designs, here we will demonstrate using a dataset from NHANES (“National Health and Nutrition Examination Survey Data” 2010), which uses both stratification and clustering:

-
- @@ -1757,21 +1757,21 @@

Summary Statistics on Complex Survey Designs

─ Session info ───────────────────────────────────────────────────────────────
  setting  value
  version  R version 4.4.0 (2024-04-24)
- os       Ubuntu 22.04.5 LTS
+ os       Ubuntu 24.04.1 LTS
  system   x86_64, linux-gnu
  ui       X11
  language (EN)
  collate  C.UTF-8
  ctype    C.UTF-8
  tz       UTC
- date     2024-10-10
+ date     2024-10-15
  pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
 
 ─ Packages ───────────────────────────────────────────────────────────────────
  ! package * version date (UTC) lib source
  P survey  * 4.4-2   2024-03-20 [?] RSPM (R 4.4.0)
 
- [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu
+ [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu
  [2] /opt/R/4.4.0/lib/R/library
 
  P ── Loaded and on-disk path mismatch.
diff --git a/blogs/index.html b/blogs/index.html
index caf5d3994..4ec18633f 100644
--- a/blogs/index.html
+++ b/blogs/index.html
@@ -244,7 +244,7 @@ 

Blogs

-
+
-
+
-
+

diff --git a/images/mmrm/review-convergence-rate-missingness-1.png b/images/mmrm/review-convergence-rate-missingness-1.png index de8d37117..29c912f69 100644 Binary files a/images/mmrm/review-convergence-rate-missingness-1.png and b/images/mmrm/review-convergence-rate-missingness-1.png differ diff --git a/images/mmrm/review-treatment-bcva-1.png b/images/mmrm/review-treatment-bcva-1.png index 7ef94d4fc..e3e3b1b79 100644 Binary files a/images/mmrm/review-treatment-bcva-1.png and b/images/mmrm/review-treatment-bcva-1.png differ diff --git a/images/mmrm/review-treatment-bcva-2.png b/images/mmrm/review-treatment-bcva-2.png index d6c1e0bc8..2a742cf4c 100644 Binary files a/images/mmrm/review-treatment-bcva-2.png and b/images/mmrm/review-treatment-bcva-2.png differ diff --git a/images/mmrm/review-treatment-fev-1.png b/images/mmrm/review-treatment-fev-1.png index 181d721d2..9836b2176 100644 Binary files a/images/mmrm/review-treatment-fev-1.png and b/images/mmrm/review-treatment-fev-1.png differ diff --git a/index.html b/index.html index e241a6230..18e5a9019 100644 --- a/index.html +++ b/index.html @@ -204,23 +204,23 @@

Repository

The repository below provides examples of statistical methodology in different software and languages, along with a comparison of the results obtained and description of any discrepancies.

-
- diff --git a/minutes/index.html b/minutes/index.html index a8c12d2d3..411db4ca1 100644 --- a/minutes/index.html +++ b/minutes/index.html @@ -248,7 +248,7 @@

Meeting Minutes

-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+

 
diff --git a/minutes/posts/10June2024.html b/minutes/posts/10June2024.html index 45e40d31a..7a9a833d7 100644 --- a/minutes/posts/10June2024.html +++ b/minutes/posts/10June2024.html @@ -389,6 +389,10 @@

Attendees

Prem Kant Shekhar No + +Sunil +No + diff --git a/minutes/posts/11Mar2024.html b/minutes/posts/11Mar2024.html index 95e353c96..87dbfa29b 100644 --- a/minutes/posts/11Mar2024.html +++ b/minutes/posts/11Mar2024.html @@ -382,6 +382,10 @@

Attendees

Prem Kant Shekhar No + +Sunil +No + diff --git a/minutes/posts/12Aug2024.html b/minutes/posts/12Aug2024.html index 15a83fb02..6fa103ba1 100644 --- a/minutes/posts/12Aug2024.html +++ b/minutes/posts/12Aug2024.html @@ -386,6 +386,10 @@

Attendees

Prem Kant Shekhar No + +Sunil +No + diff --git a/minutes/posts/12Feb2024.html b/minutes/posts/12Feb2024.html index 5d09b8e17..84ded4d75 100644 --- a/minutes/posts/12Feb2024.html +++ b/minutes/posts/12Feb2024.html @@ -382,6 +382,10 @@

Attendees

Prem Kant Shekhar No + +Sunil +No + diff --git a/minutes/posts/13May2024.html b/minutes/posts/13May2024.html index 5d6b05761..e68bb8afd 100644 --- a/minutes/posts/13May2024.html +++ b/minutes/posts/13May2024.html @@ -389,6 +389,10 @@

Attendees

Prem Kant Shekhar No + +Sunil +No + diff --git a/minutes/posts/15July2024.html b/minutes/posts/15July2024.html index 240628af1..d0ac0353c 100644 --- a/minutes/posts/15July2024.html +++ b/minutes/posts/15July2024.html @@ -382,6 +382,10 @@

Attendees

Prem Kant Shekhar No + +Sunil +No + diff --git a/minutes/posts/8Apr2024.html b/minutes/posts/8Apr2024.html index eb0475583..4479a083b 100644 --- a/minutes/posts/8Apr2024.html +++ b/minutes/posts/8Apr2024.html @@ -389,6 +389,10 @@

Attendees

Prem Kant Shekhar No + +Sunil +No + diff --git a/minutes/posts/8Jan2024.html b/minutes/posts/8Jan2024.html index e7c3afbc0..20cd83290 100644 --- a/minutes/posts/8Jan2024.html +++ b/minutes/posts/8Jan2024.html @@ -382,6 +382,10 @@

Attendees

Prem Kant Shekhar No + +Sunil +No + diff --git a/minutes/posts/9sept2024.html b/minutes/posts/9sept2024.html index a624a670b..0bd0b2ec5 100644 --- a/minutes/posts/9sept2024.html +++ b/minutes/posts/9sept2024.html @@ -389,6 +389,10 @@

Attendees

Prem Kant Shekhar Yes + +Sunil +No + diff --git a/python/MANOVA.html b/python/MANOVA.html index 727c5ac6d..d1ba15468 100644 --- a/python/MANOVA.html +++ b/python/MANOVA.html @@ -229,7 +229,7 @@

MANOVA in Python

Example 39.6 Multivariate Analysis of Variance from SAS MANOVA User Guide

This example employs multivariate analysis of variance (MANOVA) to measure differences in the chemical characteristics of ancient pottery found at four kiln sites in Great Britain. The data are from Tubb, Parker, and Nickless (1980), as reported in Hand et al. (1994).

For each of 26 samples of pottery, the percentages of oxides of five metals are measured. The following statements create the data set and invoke the GLM procedure to perform a one-way MANOVA. Additionally, it is of interest to know whether the pottery from one site in Wales (Llanederyn) differs from the samples from other sites; a CONTRAST statement is used to test this hypothesis.

-
+
import pandas as pd
 from statsmodels.multivariate.manova import MANOVA
 
diff --git a/python/Rounding.html b/python/Rounding.html
index 25dd489a0..ec79ce336 100644
--- a/python/Rounding.html
+++ b/python/Rounding.html
@@ -218,7 +218,7 @@ 

Rounding in Python

Python has a built-in round() function that takes two numeric arguments, number and ndigits, and returns a floating point number that is a rounded version of the number up to the specified number of decimals.

The default number of decimal is 0, meaning that the function will return the nearest integer.

-
+
# For integers
 x= 12
 print(round(x))
diff --git a/python/Summary_statistics.html b/python/Summary_statistics.html
index 10901ce95..b21b9d803 100644
--- a/python/Summary_statistics.html
+++ b/python/Summary_statistics.html
@@ -223,7 +223,7 @@ 

Summary statistics

4.out (optional): An alternate output array where we can place the result.

5.overwrite_input (optional): Used to modify the input array.

6.keepdims (optional): Creates reduced axes with dimensions of one size.

-
+
import numpy as np
 
 sample_data=[12, 25, 16, 50, 34, 29, 60, 86, 52, 39, 41]
diff --git a/python/ancova.html b/python/ancova.html
index 8598a9ac3..29727bbbb 100644
--- a/python/ancova.html
+++ b/python/ancova.html
@@ -233,7 +233,7 @@ 

Introduction

Data Summary

-
+
import pandas as pd
 
 # Input data
@@ -251,7 +251,7 @@ 

Data Summary

df = pd.DataFrame(data)
-
+
# Descriptive statistics
 summary_stats = df.describe()
 
@@ -280,7 +280,7 @@ 

Data Summary

Ancova in Python

In Python, Ancova can be performed using the statsmodels library from the scipy package.

-
+
import statsmodels.api as sm
 import statsmodels.formula.api as smf
 from tabulate import tabulate
@@ -313,8 +313,8 @@ 

Ancova in Python

Dep. Variable: post R-squared: 0.676 Model: OLS Adj. R-squared: 0.639 Method: Least Squares F-statistic: 18.10 -Date: Thu, 10 Oct 2024 Prob (F-statistic): 1.50e-06 -Time: 16:53:10 Log-Likelihood: -82.054 +Date: Tue, 15 Oct 2024 Prob (F-statistic): 1.50e-06 +Time: 16:24:24 Log-Likelihood: -82.054 No. Observations: 30 AIC: 172.1 Df Residuals: 26 BIC: 177.7 Df Model: 3 @@ -355,7 +355,7 @@

Ancova in Python

Please note that all values match with the corresponding R version, except for the AIC and BIC values, which differ slightly. This should be acceptable for most practical purposes in statistical analysis. Currently, there are ongoing discussions in the statsmodels community regarding the computational details of AIC and BIC.

The following code can be used to enforce complete consistency of AIC and BIC values with R outputs by adding 1 to the number of parameters:

-
+
import numpy as np
 
 # Manual calculation of AIC and BIC to ensure consistency with R
@@ -384,7 +384,7 @@ 

Ancova in Python

There are different types of anova computations. The statsmodels.stats.anova.anova_lm function allows the types 1, 2 and 3. The code to compute these types is depicted below:

-
+
import statsmodels.formula.api as smf
 import statsmodels.stats.anova as ssa
 
@@ -456,7 +456,7 @@ 

Ancova in Python

Type 1 Ancova in Python

-
+
print(tabulate(ancova_table_type_1, headers='keys', tablefmt='grid'))
+----+----------+-------+-------+---------+---------+----------+-------------+----------+----------+
@@ -471,7 +471,7 @@ 

Type 1 Ancova in P

Type 2 Ancova in Python

-
+
print(tabulate(ancova_table_type_2, headers='keys', tablefmt='grid'))
+----+----------+-------+-------+----------+---------+----------+-------------+----------+----------+
@@ -486,7 +486,7 @@ 

Type 2 Ancova in P

Type 3 Ancova in Python

-
+
print(tabulate(ancova_table_type_3, headers='keys', tablefmt='grid'))
+----+-----------+-------+-------+----------+---------+----------+-------------+----------+----------+
diff --git a/python/anova.html b/python/anova.html
index a2c782f90..f45ef8030 100644
--- a/python/anova.html
+++ b/python/anova.html
@@ -234,7 +234,7 @@ 

Introduction

Anova Test in Python

To perform a one-way ANOVA test in Python we can use the f_oneway() function from SciPy library. Similarly, to perform two-way ANOVA test anova_lm() function from the statsmodel library is frequently used.

For this test, we’ll create a data frame called df_disease taken from the SAS documentation. The corresponding data can be found here. In this experiment, we are trying to find the impact of different drug and disease group on the stem-length

-
+
import pandas as pd
 import statsmodels.api as sm
 from statsmodels.formula.api import ols
diff --git a/python/binomial_test.html b/python/binomial_test.html
index 2deb4882a..688227d64 100644
--- a/python/binomial_test.html
+++ b/python/binomial_test.html
@@ -267,7 +267,7 @@ 

Creating a sampl
  • We will generate a dataset where we record the outcomes of 1000 coin flips.

  • We will use the binom.test function to test if the proportion of heads is significantly different from 0.5.

  • -
    +
    import numpy as np
     from scipy.stats import binomtest
     
    @@ -276,7 +276,7 @@ 

    Creating a sampl coin_flips = np.random.choice(['H', 'T'], size=1000, replace=True, p=[0.5, 0.5])

    Now, we will count the heads and tails and summarize the data.

    -
    +
    # Count heads and tails
     heads_count = np.sum(coin_flips == 'H')
     tails_count = np.sum(coin_flips == 'T')
    @@ -290,7 +290,7 @@ 

    Creating a sampl

    Conducting Binomial Test

    -
    +
    # Perform the binomial test
     binom_test_result = binomtest(heads_count, total_flips, p=0.5)
     binom_test_result
    @@ -307,7 +307,7 @@

    Results:

    Example of Clinical Trial Data

    We load the lung dataset from survival package. We want to test if the proportion of patients with survival status 1 (dead) is significantly different from a hypothesized proportion (e.g. 50%)

    We will calculate number of deaths and total number of patients.

    -
    +
    import pandas as pd
     
     # Load the lung cancer dataset from CSV file
    @@ -325,7 +325,7 @@ 

    Example of Clinical Trial Data

    Conduct the Binomial Test

    We will conduct the Binomial test and hypothesize that the proportion of death should be 19%.

    -
    +
    # Perform the binomial test
     binom_test_clinical = binomtest(num_deaths, total_pat, p=0.19)
     binom_test_clinical
    diff --git a/python/chi-square.html b/python/chi-square.html index 488d902d9..53ef7983c 100644 --- a/python/chi-square.html +++ b/python/chi-square.html @@ -240,7 +240,7 @@

    Data used

    Implementing Chi-Square test in Python

    We can use crosstab() function to create contingency table of two selected variables.

    -
    +
    import pandas as pd 
     import numpy as np
     import scipy.stats as stats 
    @@ -274,13 +274,13 @@ 

    Imp Name: ecog_grp, Length: 213, dtype: object

    -
    /tmp/ipykernel_7549/2909872460.py:13: SettingWithCopyWarning: 
    +
    /tmp/ipykernel_26195/2909872460.py:13: SettingWithCopyWarning: 
     A value is trying to be set on a copy of a slice from a DataFrame.
     Try using .loc[row_indexer,col_indexer] = value instead
     
     See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
       df['ecog_grp']= np.where(df['ph.ecog']>0, "fully active","symptomatic")
    -/tmp/ipykernel_7549/2909872460.py:15: SettingWithCopyWarning: 
    +/tmp/ipykernel_26195/2909872460.py:15: SettingWithCopyWarning: 
     A value is trying to be set on a copy of a slice from a DataFrame.
     Try using .loc[row_indexer,col_indexer] = value instead
     
    @@ -322,7 +322,7 @@ 

    Imp

    Furthermore, the chi2_contingency() function in scipy.stats library in Python can be used to implement Chi-square test.

    -
    +
    # Parsing the values from the contingency table
     value = np.array([contingency_table.iloc[0][0:5].values,
                       contingency_table.iloc[1][0:5].values])
    @@ -345,7 +345,7 @@ 

    Imp

    Implementing Fisher exact test in Python

    To implement Fischer’s exact test in Python, we can use the fischer_exact() function from the stats module in SciPy library. It returns SignificanceResult object with statistic and pvalue as it’s attributes.

    -
    +
    stats.fisher_exact(value, alternative="two-sided")
    SignificanceResult(statistic=np.float64(0.6118262268704746), pvalue=np.float64(0.13500579984749855))
    diff --git a/python/correlation.html b/python/correlation.html index c1203ab85..ca962fff4 100644 --- a/python/correlation.html +++ b/python/correlation.html @@ -229,7 +229,7 @@

    Correlation Analysis in Python

    Pearson’s Correlation

    It is a parametric correlation test because it depends on the distribution of data. It measures the linear dependence between two variables x and y. It is the ratio between the covariance of two variables and the product of their standard deviation. The result always have a value between 1 and -1.

    -
    +
    import pandas as pd
     from scipy.stats import pearsonr
     
    @@ -251,7 +251,7 @@ 

    Pearson’s Correlati

    Kendall’s Rank

    A τ test is a non-parametric hypothesis test for statistical dependence based on the τ coefficient. It is a measure of rank correlation: the similarity of the orderings of the data when ranked by each of the quantities. The Kendall correlation between two variables will be high when observations have a similar (or identical for a correlation of 1) rank (i.e. relative position label of the observations within the variable: 1st, 2nd, 3rd, etc.) between the two variables, and low when observations have a dissimilar (or fully different for a correlation of −1) rank between the two variables.

    -
    +
    import pandas as pd
     from scipy.stats import kendalltau 
     
    @@ -274,7 +274,7 @@ 

    Kendall’s Rank

    Spearman’s Rank

    Spearman’s Rank Correlation is a statistical measure of the strength and direction of the monotonic relationship between two continuous variables. Therefore, these attributes are ranked or put in the order of their preference. It is denoted by the symbol “rho” (ρ) and can take values between -1 to +1. A positive value of rho indicates that there exists a positive relationship between the two variables, while a negative value of rho indicates a negative relationship. A rho value of 0 indicates no association between the two variables.

    -
    +
    import pandas as pd
     from scipy.stats import spearmanr
      
    diff --git a/python/kruskal_wallis.html b/python/kruskal_wallis.html
    index 61a7e4f18..a9374c0ba 100644
    --- a/python/kruskal_wallis.html
    +++ b/python/kruskal_wallis.html
    @@ -227,7 +227,7 @@ 

    Kruskal Wallis in Python

    Introduction

    The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of the iris dataset, testing for difference in sepal width between species of flower.

    -
    +
    import pandas as pd
     
     # Define the data
    @@ -267,7 +267,7 @@ 

    Introduction

    Implementing Kruskal-Wallis in Python

    The Kruskal-Wallis test can be implemented in Python using the kruskal function from scipy.stats. The null hypothesis is that the samples are from identical populations.

    -
    +
    from scipy.stats import kruskal
     
     # Separate the data for each species
    diff --git a/python/linear_regression.html b/python/linear_regression.html
    index 8d004bea2..6edbade93 100644
    --- a/python/linear_regression.html
    +++ b/python/linear_regression.html
    @@ -230,7 +230,7 @@ 

    Linear Regression

    Descriptive Statistics

    The first step is to obtain the simple descriptive statistics for the numeric variables of htwt data, and one-way frequencies for categorical variables. This is accomplished by employing summary function. There are 237 participants who are from 13.9 to 25 years old. It is a cross-sectional study, with each participant having one observation. We can use this data set to examine the relationship of participants’ height to their age and sex.

    -
    +
    import pandas as pd
     import statsmodels.api as sm
     
    @@ -238,7 +238,7 @@ 

    Descriptive Statist htwt = pd.read_csv("../data/htwt.csv")

    In order to create a regression model to demonstrate the relationship between age and height for females, we first need to create a flag variable identifying females and an interaction variable between age and female gender flag.

    -
    +
    htwt['female'] = (htwt['SEX'] == 'f').astype(int)
     htwt['fem_age'] = htwt['AGE'] * htwt['female']
     htwt.head()
    @@ -320,7 +320,7 @@

    Descriptive Statist

    Regression Analysis

    Next, we fit a regression model, representing the relationships between gender, age, height and the interaction variable created in the datastep above. We again use a where statement to restrict the analysis to those who are less than or equal to 19 years old. We use the clb option to get a 95% confidence interval for each of the parameters in the model. The model that we are fitting is height = b0 + b1 x female + b2 x age + b3 x fem_age + e

    -
    +
    X = htwt[['female', 'AGE', 'fem_age']][htwt['AGE'] <= 19]
     X = sm.add_constant(X)
     Y = htwt['HEIGHT'][htwt['AGE'] <= 19]
    @@ -352,13 +352,13 @@ 

    Regression Analysis Date: -Thu, 10 Oct 2024 +Tue, 15 Oct 2024 Prob (F-statistic): 1.50e-28 Time: -16:52:29 +16:24:11 Log-Likelihood: -534.17 diff --git a/python/logistic_regression.html b/python/logistic_regression.html index 2839e1c2a..1ecd1a0ed 100644 --- a/python/logistic_regression.html +++ b/python/logistic_regression.html @@ -268,7 +268,7 @@

    Logistic Regression

    Imports

    -
    +
    #data manipulation
     import pandas as pd
     import numpy as np
    @@ -290,7 +290,7 @@ 

    Background

    Example : Lung cancer data

    Data source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601-7, 1994.

    These data were sourced from the R package {survival} and have been downloaded and stored in the data folder.

    -
    +
    # importing and prepare
     lung2 = pd.read_csv("../data/lung_cancer.csv")
     
    @@ -303,7 +303,7 @@ 

    Example : Lung cancer data

    Logistic Regression Modelling

    Let’s further prepare our data for modelling by selecting the explanatory variables and the dependent variable. The Python packages that we are are aware of require complete (i.e. no missing values) data so for convenience of demonstrating these methods we will drop rows with missing values.

    -
    +
    x_vars = ["age", "sex", "ph.ecog", "meal.cal"]
     y_var = "wt_grp"
     
    @@ -317,7 +317,7 @@ 

    Logistic Regression Modelling

    Statsmodels package

    We will use the sm.Logit() method to fit our logistic regression model.

    -
    +
    #intercept column
     x_sm = sm.add_constant(x)
     
    @@ -333,8 +333,8 @@ 

    Statsmodels packageStatsmodels package

    Model fitting

    In addition to the information contained in the summary, we can display the model coefficients as odds ratios:

    -
    +
    print("Odds ratios for statsmodels logistic regression:")
     print(np.exp(lr_sm.params))
    @@ -365,7 +365,7 @@

    Model fitting

    We can also provide the 5% confidence intervals for the odds ratios:

    -
    +
    print("CI at 5% for statsmodels logistic regression:")
     print(np.exp(lr_sm.conf_int(alpha = 0.05)))
    @@ -382,7 +382,7 @@

    Model fitting

    Prediction

    Let’s use our trained model to make a weight loss prediction about a new patient.

    -
    +
    # new female, symptomatic but completely ambulatory patient consuming 2500 calories
     new_pt = pd.DataFrame({
         "age": [56],
    @@ -420,11 +420,11 @@ 

    Scikit-learn Package<

    It’s important to note that l2 regularisation is applied by default in the scikit-learn implementation of logistic regression. More recent releases of this package include an option to have no regularisation penalty.

    -
    +
    lr_sk = LogisticRegression(penalty=None).fit(x, y)

    Unlike the statsmodels approach scikit-learn doesn’t have a summary method for the model but you can extract some of the model parameters as follows:

    -
    +
    print("Intercept for scikit learn logistic regression:")
     print(lr_sk.intercept_)
     print("Odds ratios for scikit learn logistic regression:")
    @@ -440,7 +440,7 @@ 

    Scikit-learn Package<

    Prediction

    Using the same new patient example we can use our logistic regression model to make a prediction. The predict_proba method is used to return the probability for each class. If you are interested in viewing the prediction for y = 1, i.e. the probability of weight loss then you can select the second probability as shown:

    -
    +
    print("Probability of weight loss using the scikit-learn package:")
     print(lr_sk.predict_proba(new_pt)[:,1])
    diff --git a/python/one_sample_t_test.html b/python/one_sample_t_test.html index 307d715e9..388fe4fc3 100644 --- a/python/one_sample_t_test.html +++ b/python/one_sample_t_test.html @@ -234,7 +234,7 @@

    One Sample t-t

    Data Used

    -
    +
    import pandas as pd
     
     # Create sample data
    @@ -249,7 +249,7 @@ 

    Data Used

    subsubtitle: “t-test”


    The following code was used to test the comparison in Python. Note that the baseline null hypothesis goes in the “popmean” parameter.

    -
    +
    import pandas as pd
     from scipy import stats
     
    diff --git a/python/paired_t_test.html b/python/paired_t_test.html
    index 248acbfa4..f9d588157 100644
    --- a/python/paired_t_test.html
    +++ b/python/paired_t_test.html
    @@ -236,7 +236,7 @@ 

    Paired t-test in P

    Data Used

    -
    +
    import pandas as pd
     
     # Create sample data
    @@ -251,7 +251,7 @@ 

    Data Used

    Paired t-test

    The following code was used to test the comparison in Python. Note that the baseline null hypothesis goes in the “popmean” parameter.

    -
    +
    import pandas as pd
     from scipy import stats
     
    diff --git a/python/skewness_kurtosis.html b/python/skewness_kurtosis.html
    index 1f7f7a214..a36668931 100644
    --- a/python/skewness_kurtosis.html
    +++ b/python/skewness_kurtosis.html
    @@ -259,7 +259,7 @@ 

    Skewness and Kurtosis in Python

    Skewness measures the the amount of asymmetry in a distribution, while Kurtosis describes the “tailedness” of the curve. These measures are frequently used to assess the normality of the data. There are several methods to calculate these measures. In Python, the packages pandas, scipy.stats.skew and scipy.stats.kurtosis can be used.

    Data Used

    -
    +
    import pandas as pd
     from scipy.stats import skew, kurtosis
     
    @@ -289,7 +289,7 @@ 

    Skewness

    \]

    All three skewness measures are unbiased under normality. The three methods are illustrated in the following code:

    -
    +
    # Skewness
     type1_skew = skew(df['points'])
     type2_skew = df['points'].skew()
    @@ -320,7 +320,7 @@ 

    Kurtosis

    \[b_2 = m_4/s^4-3 = (g_2 + 3)(1-1/n)^2-3\]

    Only \(G_2\) (corresponding to type 2) is unbiased under normality. The three methods are illustrated in the following code:

    -
    +
    # Kurtosis
     type1_kurt = kurtosis(df['points'])
     
    diff --git a/python/survey-stats-summary.html b/python/survey-stats-summary.html
    index 7dc22a779..2a8810af3 100644
    --- a/python/survey-stats-summary.html
    +++ b/python/survey-stats-summary.html
    @@ -265,23 +265,23 @@ 

    Complex Survey Designs

    For R and SAS, we give examples of summary statistics on a simple survey design which just had a finite population correction. Unfortunately, samplics does not have the ability to just use an fpc with no PSU or Strata, so we will instead demonstrate just with a more complete (and realistic) survey design, using the NHANES (“National Health and Nutrition Examination Survey Data” 2010) dataset:

    -
    - @@ -929,21 +929,21 @@

    Domain Estimations

    ─ Session info ───────────────────────────────────────────────────────────────
      setting  value
      version  R version 4.4.0 (2024-04-24)
    - os       Ubuntu 22.04.5 LTS
    + os       Ubuntu 24.04.1 LTS
      system   x86_64, linux-gnu
      ui       X11
      language (EN)
      collate  C.UTF-8
      ctype    C.UTF-8
      tz       UTC
    - date     2024-10-10
    + date     2024-10-15
      pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
     
     ─ Packages ───────────────────────────────────────────────────────────────────
      ! package * version date (UTC) lib source
      P survey  * 4.4-2   2024-03-20 [?] RSPM (R 4.4.0)
     
    - [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu
    + [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu
      [2] /opt/R/4.4.0/lib/R/library
     
      P ── Loaded and on-disk path mismatch.
    @@ -954,7 +954,7 @@ 

    Domain Estimations

    ─ Python configuration ────────────────────────────────────────────────────────
    - Python    3.12.7 (main, Oct  1 2024, 15:17:55) [GCC 11.4.0]
    + Python    3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0]
      samplics  0.4.22
    diff --git a/python/two_samples_t_test.html b/python/two_samples_t_test.html index 1b00be340..43c794634 100644 --- a/python/two_samples_t_test.html +++ b/python/two_samples_t_test.html @@ -236,7 +236,7 @@

    Two Sample t-test in Python

    Data Used

    The following data was used in this example.

    -
    +
    import pandas as pd
     import numpy as np
     from scipy import stats
    @@ -258,7 +258,7 @@ 

    Student’s T-Test

    Code

    The following code was used to test the comparison in Python. Note that we must separate the single variable into two variables to satisfy the scipy stats package syntax.

    -
    +
    # Separate data into two groups
     group1 = df[df['trt_grp'] == 'placebo']['WtGain']
     group2 = df[df['trt_grp'] == 'treatment']['WtGain']
    @@ -282,7 +282,7 @@ 

    Welch’s T-Test

    Code

    The following code was used to test the comparison in Python using Welch’s t-test.

    -
    +
    # Perform Welch's t-test assuming unequal variances
     t_stat_welch, p_value_unequal_var = stats.ttest_ind(group1, group2, equal_var=False)
     
    diff --git a/search.json b/search.json
    index 65ef474cd..687538de3 100644
    --- a/search.json
    +++ b/search.json
    @@ -1,549 +1,486 @@
     [
       {
    -    "objectID": "templates/RvsSAS_template.html",
    -    "href": "templates/RvsSAS_template.html",
    -    "title": "R vs SAS [Name of Method]",
    +    "objectID": "Clustering_Knowhow.html",
    +    "href": "Clustering_Knowhow.html",
    +    "title": "Clustering_knowhow",
         "section": "",
    -    "text": "Provide a brief overview of the analysis, its purpose, and its applications.\nExample: This section compares the implementation of Poisson Regression in R and SAS. Poisson regression is used to model count data and contingency tables. It’s particularly useful for modeling the number of events occurring within a fixed period of time or space.\n\n\n\nThe following table provides an overview of the support and results comparability between R and SAS for the new analysis point.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nScenario 1: Basic Functionality\nExample: Yes\nExample: Yes\nExample 1: Yes\nExample 2: No\nSpecific settings or packages required for exact match\n\n\nScenario 2: Advanced Feature\nExample: Yes\nExample: Yes\nExample 3: Partial\nSpecial considerations for data structure or assumptions\n\n\n\n\n\n\nList the R packages required for this analysis. Include a brief description if necessary.\n\n# Example R packages required\nlibrary() # Call what packages are needed\nlibrary()\n\n\n\n\nProvide an example of the dataset being used. For simulated / dummy datasets please provide some context on how you construct the dataset and its relevance to the methodology. For real data please provide the code for how these data can be accessed and a reference that describes the data source.\n\n# Simulate an example dataset for Poisson Regression\nset.seed(123)\nexample_data <- data.frame(\n  count = rpois(100, lambda = 2),\n  predictor = rnorm(100)\n)\n\n# Display the first few rows of the dataset\nhead(example_data)\n\n/* Example dataset in SAS */\ndata example_data;\n  do id = 1 to 100;\n    count = ranpoi(123, 2); /* random Poisson variable */\n    predictor = rannor(123); /* random normal variable */\n    output;\n  end;\nrun;\n\n/* Display the first few rows of the dataset */\nproc print data=example_data(obs=10);\nrun;\n\n\n\n\n\nProvide a detailed description of the scenario.\n\n\n/* SAS code for basic Poisson Regression */\nproc genmod data=example_data;\n  class predictor;\n  model count = predictor / dist=poisson link=log;\nrun;\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\n\n# R code for basic Poisson Regression\nexample_model <- glm(count ~ predictor, family = poisson(link = \"log\"), data = example_data)\n\n# Summary of the model\nsummary(example_model)\n\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\nProvide a detailed comparison of the results obtained from both SAS and R. Highlight any differences and provide explanations if possible.\n\n\n\n\n\n\n\n\n\n\nStatistic\nR Result\nSAS Result\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n98\n98\nYes\n\n\n\nCoefficient Estimate for Predictor\n0.1\n0.1\nYes\n\n\n\np-value\n0.05\n0.05\nYes\n\n\n\n\n\n\n\n\nProvide a detailed description of the scenario. Example: Address specific advanced features or configurations that may be necessary for more complex analyses.\n\n\n/* SAS code for handling overdispersion */\nproc genmod data=example_data;\n  class predictor;\n  model count = predictor / dist=poisson link=log scale=pearson;\nrun;\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\n\n# R code for handling overdispersion\nalternative_model <- glm(count ~ predictor, family = quasipoisson(link = \"log\"), data = example_data)\n\n# Summary of the alternative model\nsummary(alternative_model)\n\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\nProvide a detailed comparison of the results obtained from both SAS and R. Highlight any differences and provide explanations if possible.\n\n\n\n\n\n\n\n\n\n\nStatistic\nR Result\nSAS Result\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n98\n98\nYes\n\n\n\nCoefficient Estimate for Predictor\n0.1\n0.1\nYes\n\n\n\np-value\n0.05\n0.05\nYes\n\n\n\n\n\n\n\n\n\nAddress any additional features or settings that need to be considered. This might include specific configuration settings, handling of special cases, or performance considerations.\nExample: For handling overdispersion in Poisson Regression, SAS provides the scale option in PROC GENMOD, while in R, one may have to switch to a quasi-Poisson family or use negative binomial regression.\n\n\n\nSummarize the key findings from the analysis. Highlight any major differences observed and offer recommendations on which software/packages to use. Provide guidance on how to interpret the differences between the results obtained from various software of packages.\n\n\n\nList potential issues that users may encounter and propose solutions or troubleshooting steps.\nExample:\n\nIssue: Non-convergence in Poisson Regression.\nSolution: Check for multicollinearity among predictors, scale the predictors, or switch to a more appropriate model family.\n\n\n\n\nProvide references and additional reading materials for both R and SAS documentation related to the analysis.\nR Documentation:\n\nglm function: https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/glm\n\nSAS Documentation:\n\nPROC GENMOD: https://documentation.sas.com/doc/en/statcdc/14.2/statug/statug_genmod_overview.htm\n\n\n\n\nInclude any additional information, extended examples, or advanced topics that may be helpful for expert users.\nThis template is designed to be comprehensive and flexible, able to accommodate multiple scenarios and diverse datasets. It ensures that each section clearly communicates the necessary information and comparisons, making it easier for users to understand and apply the analyses appropriately across both R and SAS platforms.\n\n\n\n\n\n\nSession Info"
    +    "text": "Clustering is a method of segregating unlabeled data or data points into different groups/clusters such that similar data points fall in the same cluster than those which differ from the others. The similarity measures are calculated using distance based metrics like Euclidean distance, Cosine similarity, Manhattan distance, etc.\nFor Example, In the graph given below, we can clearly see that the data points can be grouped into 3 clusters"
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#introduction",
    -    "href": "templates/RvsSAS_template.html#introduction",
    -    "title": "R vs SAS [Name of Method]",
    +    "objectID": "Clustering_Knowhow.html#what-is-clustering",
    +    "href": "Clustering_Knowhow.html#what-is-clustering",
    +    "title": "Clustering_knowhow",
         "section": "",
    -    "text": "Provide a brief overview of the analysis, its purpose, and its applications.\nExample: This section compares the implementation of Poisson Regression in R and SAS. Poisson regression is used to model count data and contingency tables. It’s particularly useful for modeling the number of events occurring within a fixed period of time or space."
    +    "text": "Clustering is a method of segregating unlabeled data or data points into different groups/clusters such that similar data points fall in the same cluster than those which differ from the others. The similarity measures are calculated using distance based metrics like Euclidean distance, Cosine similarity, Manhattan distance, etc.\nFor Example, In the graph given below, we can clearly see that the data points can be grouped into 3 clusters"
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#general-comparison-table",
    -    "href": "templates/RvsSAS_template.html#general-comparison-table",
    -    "title": "R vs SAS [Name of Method]",
    -    "section": "",
    -    "text": "The following table provides an overview of the support and results comparability between R and SAS for the new analysis point.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nScenario 1: Basic Functionality\nExample: Yes\nExample: Yes\nExample 1: Yes\nExample 2: No\nSpecific settings or packages required for exact match\n\n\nScenario 2: Advanced Feature\nExample: Yes\nExample: Yes\nExample 3: Partial\nSpecial considerations for data structure or assumptions"
    +    "objectID": "Clustering_Knowhow.html#type-of-clustering-algorithm",
    +    "href": "Clustering_Knowhow.html#type-of-clustering-algorithm",
    +    "title": "Clustering_knowhow",
    +    "section": "Type of Clustering Algorithm",
    +    "text": "Type of Clustering Algorithm\nSome of the popular clustering algorithms are:\n\nCentroid-based Clustering (Partitioning methods)\nDensity-based Clustering (Model-based methods)\nConnectivity-based Clustering (Hierarchical clustering)\nDistribution-based Clustering\n\n\n1.Centroid-based Clustering (Partitioning methods)\nPartitioning methods group data points on the basis of their closeness. The similarity measure chosen for these algorithms are Euclidean distance, Manhattan Distance or Minkowski Distance.\nThe primary drawback for these algorithms is we need to pre define the number of clusters before allocating the data points to a group.\nOne of the popular centroid based clustering technique is K means Clustering. \n\nK Means Clustering\nK means is an iterative clustering algorithm that works in these 5 steps:\n\nSpecify the desired number of clusters K: Let us choose k=2 for these 5 data points in 2-D space.\n\nRandomly assign each data point to a cluster: Let’s assign three points in cluster 1, shown using orange color, and two points in cluster 2, shown using grey color.\n\nCompute cluster centroids: Centroids correspond to the arithmetic mean of data points assigned to the cluster. The centroid of data points in the orange cluster is shown using the orange cross, and those in the grey cluster using a grey cross.\n\nAssigns each observation to their closest centroid, based on the Euclidean distance between the object and the centroid\n\nRe-computing the centroids for both clusters.\n\n\nWe will repeat the 4th and 5th steps until no further switching of data points between two clusters for two successive repeats. \n\n\nK-Means Clustering in R\nStep 1: Load packages\nFirst, we’ll load below packages that contain several useful functions regarding k-means clustering in R.\n\nlibrary(cluster) #Contain cluster function\nlibrary(dplyr) #Data manipulation\nlibrary(ggplot2) #Plotting function\nlibrary(readr) #Read and write excel/csv files\nlibrary(factoextra) #Extract and Visualize the Results of Multivariate Data Analyses\n\nStep 2: Load Data\nWe have used the “Mall_Customer” dataset in R for this case study.\n\n#Loading the data\ndf <- read_csv(\"data/Mall_Customers.csv\")\n\n#Structure of the data\nstr(df)\n\nspc_tbl_ [200 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)\n $ CustomerID            : chr [1:200] \"0001\" \"0002\" \"0003\" \"0004\" ...\n $ Genre                 : chr [1:200] \"Male\" \"Male\" \"Female\" \"Female\" ...\n $ Age                   : num [1:200] 19 21 20 23 31 22 35 23 64 30 ...\n $ Annual Income (k$)    : num [1:200] 15 15 16 16 17 17 18 18 19 19 ...\n $ Spending Score (1-100): num [1:200] 39 81 6 77 40 76 6 94 3 72 ...\n - attr(*, \"spec\")=\n  .. cols(\n  ..   CustomerID = col_character(),\n  ..   Genre = col_character(),\n  ..   Age = col_double(),\n  ..   `Annual Income (k$)` = col_double(),\n  ..   `Spending Score (1-100)` = col_double()\n  .. )\n - attr(*, \"problems\")=<externalptr> \n\n\ndataset consists of 200 customers data with their age, annual income and Spending score.\n\n#Rename the columns\ndf <- df %>% \n  rename(\"Annual_Income\"= `Annual Income (k$)`, \"Spending_score\"= `Spending Score (1-100)`)\n\n#remove rows with missing values\ndf <- na.omit(df)\n\n#scale each variable to have a mean of 0 and sd of 1\ndf1 <- df %>% \n  mutate(across(where(is.numeric), scale))\n\n#view first six rows of dataset\nhead(df1)\n\n# A tibble: 6 × 5\n  CustomerID Genre  Age[,1] Annual_Income[,1] Spending_score[,1]\n  <chr>      <chr>    <dbl>             <dbl>              <dbl>\n1 0001       Male    -1.42              -1.73             -0.434\n2 0002       Male    -1.28              -1.73              1.19 \n3 0003       Female  -1.35              -1.70             -1.71 \n4 0004       Female  -1.13              -1.70              1.04 \n5 0005       Female  -0.562             -1.66             -0.395\n6 0006       Female  -1.21              -1.66              0.999\n\n\n\nWe have separated the CustomerID and Genre from the dataset. The reason for removing these variables from the cluster dataset as Kmeans can handle only numerical variables.\nTo create cluster with categorical or ordinal variable we can use k-Medoid clustering. \n\ndf1 <- df1[,4:5]\n\nStep 3: Find the Optimal Number of Clusters\nTo perform k-means clustering in R we can use the built-in kmeans() function, which uses the following syntax:\n kmeans(data, centers, iter.max, nstart)\n where:\n - data: Name of the dataset.\n - centers: The number of clusters, denoted k.\n - iter.max (optional): The maximum number of iterations allowed. Default value is 10.\n - nstart (optional): The number of initial configurations. Default value is 1.\n\nCenters is the k of K Means. centers = 5 would results in 5 clusters being created. We need to predefine the k before the cluster process starts.\n\niter.max is the number of times the algorithm will repeat the cluster assignment and update the centers / centroids. Iteration stops after this many iterations even if the convergence criterion is not satisfied\nnstart is the number of times the initial starting points are re-sampled. It means at the initialization of Clusters you need to specify how many clusters you want and the algorithm will randomly find same number of centroids to initialize. nstart gives you an edge to initialize the centroids through re sampling.\nFor example if total number of cluster is 3 and nstart=25 then it extracts 3 sets of data, 25 times, and for each of these times, the algorithm is run (up to iter.max # of iterations) and the cost function (total sum of the squares) is evaluated and finally 3 centroids with lowest cost function are chosen to start the clustering process.\n\nTo find the best number of clusters/centroids there are two popular methods as shown below.\nA. Elbow Method:\nIt has two parts as explained below-\n\nWSS: The Within Sum of Squares (WSS) is the sum of distance between the centroids and every other data points within a cluster. Small WSS indicates that every data point is close to its nearest centroids.\nElbow rule/method: Here we plot out the WSS score against the number of K. Because with the number of K increasing, the WSS will always decrease; however, the magnitude of decrease between each k will be diminishing, and the plot will be a curve which looks like an arm that curled up. In this way, we can find out which point falls on the elbow.\n\n\nset.seed(1)\nwss<- NULL\n\n#Feeding different centroid/cluster and record WSS\n\nfor (i in 1:10){\n  fit = kmeans(df1,centers = i,nstart=25)\n  wss = c(wss, fit$tot.withinss)\n}\n\n#Visualize the plot\nplot(1:10, wss, type = \"o\", xlab='Number of clusters(k)')\n\n\n\n\n\n\n\n\nBased on the above plot at k=5 we can see an “elbow” where the sum of squares begins to “bend” or level off so the ideal number of clusters should be 5.\nThe above process to compute the “Elbow method” has been wrapped up in a single function (fviz_nbclust):\n\nfviz_nbclust(df1, kmeans, method = \"wss\",nstart=25)\n\n\n\n\n\n\n\n\nB. Silhouette Method:\nThe silhouette coefficient or silhouette score is a measure of how similar a data point is within-cluster (intra-cluster) compared to other clusters (inter-cluster).\nThe Silhouette Coefficient is calculated using the mean intra-cluster distance (a) and the mean nearest-cluster distance (b) for each sample. The Silhouette Coefficient for a sample is (b - a) / max(a, b)\nHere we will plot the silhouette width/coefficient for different number of clusters and will choose the point where the silhouette width is highest.\nPoints to Remember While Calculating Silhouette Coefficient:\nThe value of the silhouette coefficient is between [-1, 1]. A score of 1 denotes the best, meaning that the data points are very compact within the cluster to which it belongs and far away from the other clusters. The worst value is -1. Values near 0 denote overlapping clusters.\nIn this demonstration, we are going to see how silhouette method is used.\n\nsilhouette_score <- function(k){\n  km <- kmeans(df1, centers = k,nstart = 25)\n  ss <- silhouette(km$cluster, dist(df1))\n  mean(ss[, 3])\n}\nk <- 2:10\n\navg_sil <- sapply(k, silhouette_score)\nplot(k, type='b', avg_sil, xlab='Number of clusters', ylab='Average Silhouette Scores', frame=FALSE)\n\n\n\n\n\n\n\n\nFrom the above method we can see the silhouette width is highest at cluster 5 so the optimal number of cluster should be 5.\nSimilar to the elbow method, this process to compute the “average silhoutte method” has been wrapped up in a single function (fviz_nbclust):\n\nfviz_nbclust(df1, kmeans, method='silhouette',nstart=25)\n\n\n\n\n\n\n\n\nThe optimal number of clusters is 5.\nStep 4: Perform K-Means Clustering with Optimal K\nLastly, we can perform k-means clustering on the dataset using the optimal value for k of 5:\n\n#make this example reproducible\nset.seed(1)\n\n#perform k-means clustering with k = 5 clusters\nfit <- kmeans(df1, 5, nstart=25)\n#view results\nfit\n\nK-means clustering with 5 clusters of sizes 22, 35, 81, 39, 23\n\nCluster means:\n  Annual_Income Spending_score\n1    -1.3262173     1.12934389\n2     1.0523622    -1.28122394\n3    -0.2004097    -0.02638995\n4     0.9891010     1.23640011\n5    -1.3042458    -1.13411939\n\nClustering vector:\n  [1] 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5\n [38] 1 5 1 5 1 5 3 5 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3\n [75] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3\n[112] 3 3 3 3 3 3 3 3 3 3 3 3 4 2 4 3 4 2 4 2 4 3 4 2 4 2 4 2 4 2 4 3 4 2 4 2 4\n[149] 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2\n[186] 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4\n\nWithin cluster sum of squares by cluster:\n[1]  5.217630 18.304646 14.485632 19.655252  7.577407\n (between_SS / total_SS =  83.6 %)\n\nAvailable components:\n\n[1] \"cluster\"      \"centers\"      \"totss\"        \"withinss\"     \"tot.withinss\"\n[6] \"betweenss\"    \"size\"         \"iter\"         \"ifault\"      \n\n\nWe can visualize the clusters on a scatterplot that displays the first two principal components on the axes using the fivz_cluster() function:\n\n#plot results of final k-means model\n\nfviz_cluster(fit, data = df1)\n\n\n\n\n\n\n\n\nStep 5: Exporting the data by adding generated clusters\n\n#Adding the clusters in the main data\n\ndf_cluster <- df %>% \n  mutate(cluster=fit$cluster)\n\n#Creating Summary of created clusters based on existing variables\n\ndf_summary <- df_cluster %>% \n  group_by(cluster) %>% \n  summarise(records=n(),avg_age=mean(Age),avg_annual_income=mean(Annual_Income),avg_spending_score=mean(Spending_score))\n\nprint(df_summary)\n\n# A tibble: 5 × 5\n  cluster records avg_age avg_annual_income avg_spending_score\n    <int>   <int>   <dbl>             <dbl>              <dbl>\n1       1      22    25.3              25.7               79.4\n2       2      35    41.1              88.2               17.1\n3       3      81    42.7              55.3               49.5\n4       4      39    32.7              86.5               82.1\n5       5      23    45.2              26.3               20.9\n\n\nWe can create a group of potential customers to target based on their age, average annual income and average spending score."
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#prerequisites-r-packages",
    -    "href": "templates/RvsSAS_template.html#prerequisites-r-packages",
    -    "title": "R vs SAS [Name of Method]",
    +    "objectID": "Comp/r-sas_chi-sq.html",
    +    "href": "Comp/r-sas_chi-sq.html",
    +    "title": "R/SAS Chi-Squared and Fisher’s Exact Comparision",
         "section": "",
    -    "text": "List the R packages required for this analysis. Include a brief description if necessary.\n\n# Example R packages required\nlibrary() # Call what packages are needed\nlibrary()"
    +    "text": "Chi-Squared Test\nChi-Squared test is a hypothesis test for independent contingency tables, dependent on rows and column totals. The test assumes:\n\nobservations are independent of each other\nall values are 1 or more and at least 80% of the cells are greater than 5.\ndata should be categorical\n\nThe Chi-Squared statistic is found by:\n\\[\n\\chi^2=\\frac{\\sum(O-E)^2}{E}\n\\]\nWhere O is the observed and E is the expected.\nFor an r x c table (where r is the number of rows and c the number of columns), the Chi-squared distribution’s degrees of freedom is (r-1)*(c-1). The resultant statistic with correct degrees of freedom follows this distribution when its expected values are aligned with the assumptions of the test, under the null hypothesis. The resultant p value informs the magnitude of disagreement with the null hypothesis and not the magnitude of association\nFor this example we will use data about cough symptoms and history of bronchitis.\n\nbronch <- matrix(c(26, 247, 44, 1002), ncol = 2)\nrow.names(bronch) <- c(\"cough\", \"no cough\")\ncolnames(bronch) <- c(\"bronchitis\", \"no bronchitis\")\n\nTo a chi-squared test in R you will use the following code.\n\nchisq.test(bronch)\n\n\n    Pearson's Chi-squared test with Yates' continuity correction\n\ndata:  bronch\nX-squared = 11.145, df = 1, p-value = 0.0008424\n\n\nTo run a chi-squared test in SAS you used the following code.\n\nproc freq data=proj1.bronchitis;\ntables Cough*Bronchitis / chisq;\nrun;\n\nThe result in the “Chi-Square” section of the results table in SAS will not match R, in this case it will be 12.1804 with a p-value of 0.0005. This is because by default R does a Yate’s continuity adjustment. To change this set correct to false.\n\nchisq.test(bronch, correct = FALSE)\n\n\n    Pearson's Chi-squared test\n\ndata:  bronch\nX-squared = 12.18, df = 1, p-value = 0.0004829\n\n\nAlternatively, SAS also produces the correct chi-square value by default. It is the “Continuity Adj. Chi-Square” value in the results table.\n\n\nFisher’s Exact Test\nComparison between the Fisher’s Exact Test in both R and SAS shows that the two software match on the p-value and confidence intervals. The odd ratio does not match. The reason the odds ratio does not match is because R uses an “exact” odds ratio based on the hypergeomtric distribution, while SAS uses a standard AD/BC odds ratio. Note that R always uses an “exact” Fisher test. Therefore, when trying to match SAS, you must use the “exact” statement on the PROC FREQ."
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#example-data",
    -    "href": "templates/RvsSAS_template.html#example-data",
    -    "title": "R vs SAS [Name of Method]",
    +    "objectID": "Comp/r-sas-python_survey-stats-summary.html",
    +    "href": "Comp/r-sas-python_survey-stats-summary.html",
    +    "title": "R vs SAS vs Python Survey Summary Statistics",
         "section": "",
    -    "text": "Provide an example of the dataset being used. For simulated / dummy datasets please provide some context on how you construct the dataset and its relevance to the methodology. For real data please provide the code for how these data can be accessed and a reference that describes the data source.\n\n# Simulate an example dataset for Poisson Regression\nset.seed(123)\nexample_data <- data.frame(\n  count = rpois(100, lambda = 2),\n  predictor = rnorm(100)\n)\n\n# Display the first few rows of the dataset\nhead(example_data)\n\n/* Example dataset in SAS */\ndata example_data;\n  do id = 1 to 100;\n    count = ranpoi(123, 2); /* random Poisson variable */\n    predictor = rannor(123); /* random normal variable */\n    output;\n  end;\nrun;\n\n/* Display the first few rows of the dataset */\nproc print data=example_data(obs=10);\nrun;"
    +    "text": "This document will compare the survey summary statistics functionality in SAS (available through SAS/STAT), R (available from the {survey} package), and Python (available from the samplics package), highlighting differences in methods and results. Only the default Taylor series linearisation method for calculating variances is used in all languages. A more detailed comparison between R and SAS for specific methods and use-cases is available in (“Software for Analysis of YRBS Data” 2017), (So et al. 2020), or (Damico 2009). For a general guide to survey statistics, which has companion guides for both R and SAS, see (Lohr 2022)."
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#analysis-scenarios",
    -    "href": "templates/RvsSAS_template.html#analysis-scenarios",
    -    "title": "R vs SAS [Name of Method]",
    -    "section": "",
    -    "text": "Provide a detailed description of the scenario.\n\n\n/* SAS code for basic Poisson Regression */\nproc genmod data=example_data;\n  class predictor;\n  model count = predictor / dist=poisson link=log;\nrun;\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\n\n# R code for basic Poisson Regression\nexample_model <- glm(count ~ predictor, family = poisson(link = \"log\"), data = example_data)\n\n# Summary of the model\nsummary(example_model)\n\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\nProvide a detailed comparison of the results obtained from both SAS and R. Highlight any differences and provide explanations if possible.\n\n\n\n\n\n\n\n\n\n\nStatistic\nR Result\nSAS Result\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n98\n98\nYes\n\n\n\nCoefficient Estimate for Predictor\n0.1\n0.1\nYes\n\n\n\np-value\n0.05\n0.05\nYes\n\n\n\n\n\n\n\n\nProvide a detailed description of the scenario. Example: Address specific advanced features or configurations that may be necessary for more complex analyses.\n\n\n/* SAS code for handling overdispersion */\nproc genmod data=example_data;\n  class predictor;\n  model count = predictor / dist=poisson link=log scale=pearson;\nrun;\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\n\n# R code for handling overdispersion\nalternative_model <- glm(count ~ predictor, family = quasipoisson(link = \"log\"), data = example_data)\n\n# Summary of the alternative model\nsummary(alternative_model)\n\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\nProvide a detailed comparison of the results obtained from both SAS and R. Highlight any differences and provide explanations if possible.\n\n\n\n\n\n\n\n\n\n\nStatistic\nR Result\nSAS Result\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n98\n98\nYes\n\n\n\nCoefficient Estimate for Predictor\n0.1\n0.1\nYes\n\n\n\np-value\n0.05\n0.05\nYes"
    +    "objectID": "Comp/r-sas-python_survey-stats-summary.html#r",
    +    "href": "Comp/r-sas-python_survey-stats-summary.html#r",
    +    "title": "R vs SAS vs Python Survey Summary Statistics",
    +    "section": "R",
    +    "text": "R\n\nlibrary(survey)\n\ndata(\"nhanes\")\n\nnhanes_design <- svydesign(\n  data = nhanes,\n  id = ~SDMVPSU, # Specify the PSU/cluster column\n  strata = ~SDMVSTRA,  # The stratification column\n  weights = ~WTMEC2YR,  # The weighting column\n  nest = TRUE  # Allows for PSUs with the same name nested within different strata\n)\n\n# Mean of HI_CHOL\nhi_chol_mean <- svymean(~HI_CHOL, nhanes_design, na.rm=TRUE)\n\n# Sum of HI_CHOL\nhi_chol_sum <- svytotal(~HI_CHOL, nhanes_design, na.rm=TRUE)\n\n# Ratio of HI_CHOL / RIAGENDR\nhi_chol_ratio <- svyratio(\n  numerator = ~HI_CHOL,\n  denominator = ~RIAGENDR,\n  nhanes_design,\n  na.rm=TRUE,\n  ci=TRUE,\n  se=TRUE,\n  separate=FALSE\n)\n\n# Proportion of different AGECAT values\nagecat_props <- svymean(~agecat, nhanes_design, na.rm=TRUE)\n\n# Quantiles of HI_CHOL\nhi_chol_quart <- svyquantile(\n  ~HI_CHOL,\n  nhanes_design,\n  quantiles=c(0.025, 0.5, 0.975),\n  na.rm=TRUE,\n  ci=TRUE\n)\n\n# Domain analysis of mean of HI_CHOL by race, with design effect\nhi_chol_mean_by_race <- svyby(~HI_CHOL, ~race, nhanes_design, svymean, na.rm=TRUE, deff=\"replace\")\n\nprint(list(\n  \"Mean of HI_CHOL\" = coef(hi_chol_mean),\n  \"SE of Mean HI_CHOL\" = SE(hi_chol_mean),\n  \"CL of Mean HI_CHOL\" = confint(hi_chol_mean, df=degf(nhanes_design)),\n  \"Sum of HI_CHOL\" = coef(hi_chol_sum),\n  \"SE of Sum HI_CHOL\" = SE(hi_chol_sum),\n  \"CL of Sum HI_CHOL\" = confint(hi_chol_sum, df=degf(nhanes_design)),\n  \"Ratio of HI_CHOL / RIAGENDR\" = coef(hi_chol_ratio),\n  \"SE of Ratio HI_CHOL / RIAGENDR\" = SE(hi_chol_ratio),\n  \"CL of Ratio HI_CHOL / RIAGENDR\" = confint(hi_chol_ratio, df=degf(nhanes_design)),\n  \"Proportion of AGECAT\" = coef(agecat_props),\n  \"SE of Proportion AGECAT\" = SE(agecat_props),\n  \"CL of Proportion AGECAT\" = confint(agecat_props, df=degf(nhanes_design)),\n  \"Quantiles of HI_CHOL\" = coef(hi_chol_quart),\n  \"SE of Quantiles HI_CHOL\" = SE(hi_chol_quart),\n  \"CL of Quantiles HI_CHOL\" = confint(hi_chol_quart, df=degf(nhanes_design)),\n  \"Mean of HI_CHOL by race\" = coef(hi_chol_mean_by_race),\n  \"SE of HI_CHOL by race\" = SE(hi_chol_mean_by_race),\n  \"CL of HI_CHOL by race\" = confint(hi_chol_mean_by_race, df=degf(nhanes_design)),\n  \"Design Effect of HI_CHOL by race\" = hi_chol_mean_by_race$DEff.HI_CHOL\n))\n\n$`Mean of HI_CHOL`\n HI_CHOL \n0.112143 \n\n$`SE of Mean HI_CHOL`\n           HI_CHOL\nHI_CHOL 0.00544584\n\n$`CL of Mean HI_CHOL`\n            2.5 %    97.5 %\nHI_CHOL 0.1005983 0.1236876\n\n$`Sum of HI_CHOL`\n HI_CHOL \n28635245 \n\n$`SE of Sum HI_CHOL`\n        HI_CHOL\nHI_CHOL 2020711\n\n$`CL of Sum HI_CHOL`\n           2.5 %   97.5 %\nHI_CHOL 24351530 32918961\n\n$`Ratio of HI_CHOL / RIAGENDR`\nHI_CHOL/RIAGENDR \n      0.07422209 \n\n$`SE of Ratio HI_CHOL / RIAGENDR`\nHI_CHOL/RIAGENDR \n     0.003714728 \n\n$`CL of Ratio HI_CHOL / RIAGENDR`\n                      2.5 %     97.5 %\nHI_CHOL/RIAGENDR 0.06634722 0.08209696\n\n$`Proportion of AGECAT`\n  agecat(0,19]  agecat(19,39]  agecat(39,59] agecat(59,Inf] \n     0.2077495      0.2934079      0.3032896      0.1955530 \n\n$`SE of Proportion AGECAT`\n  agecat(0,19]  agecat(19,39]  agecat(39,59] agecat(59,Inf] \n   0.006129950    0.009560692    0.004519463    0.008092578 \n\n$`CL of Proportion AGECAT`\n                   2.5 %    97.5 %\nagecat(0,19]   0.1947546 0.2207444\nagecat(19,39]  0.2731401 0.3136756\nagecat(39,59]  0.2937088 0.3128704\nagecat(59,Inf] 0.1783975 0.2127085\n\n$`Quantiles of HI_CHOL`\nHI_CHOL.0.025   HI_CHOL.0.5 HI_CHOL.0.975 \n            0             0             1 \n\n$`SE of Quantiles HI_CHOL`\nHI_CHOL.0.025   HI_CHOL.0.5 HI_CHOL.0.975 \n    0.2358596     0.2358596     0.0000000 \n\n$`CL of Quantiles HI_CHOL`\n              l u\nHI_CHOL.0.025 0 1\nHI_CHOL.0.5   0 1\nHI_CHOL.0.975 1 1\n\n$`Mean of HI_CHOL by race`\n         1          2          3          4 \n0.10149167 0.12164921 0.07864006 0.09967861 \n\n$`SE of HI_CHOL by race`\n[1] 0.006245843 0.006604134 0.010384645 0.024666227\n\n$`CL of HI_CHOL by race`\n       2.5 %    97.5 %\n1 0.08825107 0.1147323\n2 0.10764907 0.1356493\n3 0.05662560 0.1006545\n4 0.04738854 0.1519687\n\n$`Design Effect of HI_CHOL by race`\n[1] 1.082734 1.407822 2.091156 3.098290"
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#special-considerations",
    -    "href": "templates/RvsSAS_template.html#special-considerations",
    -    "title": "R vs SAS [Name of Method]",
    -    "section": "",
    -    "text": "Address any additional features or settings that need to be considered. This might include specific configuration settings, handling of special cases, or performance considerations.\nExample: For handling overdispersion in Poisson Regression, SAS provides the scale option in PROC GENMOD, while in R, one may have to switch to a quasi-Poisson family or use negative binomial regression."
    +    "objectID": "Comp/r-sas-python_survey-stats-summary.html#sas",
    +    "href": "Comp/r-sas-python_survey-stats-summary.html#sas",
    +    "title": "R vs SAS vs Python Survey Summary Statistics",
    +    "section": "SAS",
    +    "text": "SAS\n* Mean, sum quantile of HI_CHOL;\nproc surveymeans data=nhanes mean sum clm quantile=(0.025 0.5 0.975);\n    cluster SDMVPSU;\n    strata SDMVSTRA;\n    weight WTMEC2YR;\n    var HI_CHOL;\nrun;\n\n* Ratio of HI_CHOL / RIAGENDR;\nproc surveymeans data=nhanes;\n    cluster SDMVPSU;\n    strata SDMVSTRA;\n    weight WTMEC2YR;\n    ratio HI_CHOL / RIAGENDR;\nrun;\n\n* Proportions of agecat;\nproc surveyfreq data=nhanes;\n    cluster SDMVPSU;\n    strata SDMVSTRA;\n    weight WTMEC2YR;\n    table agecat / cl;\nrun;\n\n* Mean and DEFF of HI_CHOL by race;\nproc surveymeans data=nhanes mean deff;\n    cluster SDMVPSU;\n    strata SDMVSTRA;\n    weight WTMEC2YR;\n    domain race;\n    var HI_CHOL;\nrun;\n\n                                                 The SURVEYMEANS Procedure\n\n                                                        Data Summary\n\n                                            Number of Strata                  15\n                                            Number of Clusters                31\n                                            Number of Observations          8591\n                                            Sum of Weights             276536446\n\n\n                                                         Statistics\n\n                                Std Error                                                Std Error\n Variable            Mean         of Mean       95% CL for Mean                Sum          of Sum        95% CL for Sum\n --------------------------------------------------------------------------------------------------------------------------\n HI_CHOL         0.112143        0.005446    0.10059829 0.12368762        28635245         2020711    24351529.8 32918960.7\n --------------------------------------------------------------------------------------------------------------------------\n\n\n                                                         Quantiles\n\n                                                                          Std\n                     Variable       Percentile       Estimate           Error    95% Confidence Limits\n                     ---------------------------------------------------------------------------------\n                     HI_CHOL          2.5                   0        0.024281    -0.0514730 0.05147298\n                                       50 Median            0        0.024281    -0.0514730 0.05147298\n                                     97.5            0.777070        0.024281     0.7255973 0.82854324\n                     ---------------------------------------------------------------------------------\n\n                                                 The SURVEYMEANS Procedure\n\n                                                        Data Summary\n\n                                            Number of Strata                  15\n                                            Number of Clusters                31\n                                            Number of Observations          8591\n                                            Sum of Weights             276536446\n\n\n                                                        Statistics\n\n                                                                    Std Error\n                     Variable               N            Mean         of Mean       95% CL for Mean\n                     ---------------------------------------------------------------------------------\n                     HI_CHOL             7846        0.112143        0.005446    0.10059829 0.12368762\n                     RIAGENDR            8591        1.512019        0.005302    1.50077977 1.52325807\n                     ---------------------------------------------------------------------------------\n\n\n                                                       Ratio Analysis\n\n                                                                              Std\n               Numerator Denominator            N           Ratio           Error        95% CL for Ratio\n               ----------------------------------------------------------------------------------------------\n               HI_CHOL   RIAGENDR            7846        0.074222        0.003715    0.06634722    0.08209696\n               ----------------------------------------------------------------------------------------------\n\n                                                  The SURVEYFREQ Procedure\n\n                                                        Data Summary\n\n                                            Number of Strata                  15\n                                            Number of Clusters                31\n                                            Number of Observations          8591\n                                            Sum of Weights             276536446\n\n\n                                                      Table of agecat\n\n                                        Weighted    Std Err of                Std Err of    95% Confidence Limits\n          agecat         Frequency     Frequency      Wgt Freq     Percent       Percent         for Percent\n          -------------------------------------------------------------------------------------------------------\n          (0,19]              2532      57450307       3043819     20.7749        0.6130     19.4755      22.0744\n          (19,39]             2033      81137975       3692818     29.3408        0.9561     27.3140      31.3676\n          (39,59]             2021      83870623       4853936     30.3290        0.4519     29.3709      31.2870\n          (59,Inf]            2005      54077541       4284296     19.5553        0.8093     17.8398      21.2709\n\n          Total               8591     276536446      13935730    100.0000                                       \n          -------------------------------------------------------------------------------------------------------\n\n                                                 The SURVEYMEANS Procedure\n\n                                                        Data Summary\n\n                                            Number of Strata                  15\n                                            Number of Clusters                31\n                                            Number of Observations          8591\n                                            Sum of Weights             276536446\n\n\n                                                         Statistics\n\n                                                                 Std Error          Design\n                                  Variable            Mean         of Mean          Effect\n                                  --------------------------------------------------------\n                                  HI_CHOL         0.112143        0.005446        2.336725\n                                  --------------------------------------------------------\n\n                                                 The SURVEYMEANS Procedure\n\n                                                 Statistics for race Domains\n\n                                                                         Std Error          Design\n                                  race    Variable            Mean         of Mean          Effect\n                          ------------------------------------------------------------------------\n                                     1    HI_CHOL         0.101492        0.006246        1.082734\n                                     2    HI_CHOL         0.121649        0.006604        1.407822\n                                     3    HI_CHOL         0.078640        0.010385        2.091156\n                                     4    HI_CHOL         0.099679        0.024666        3.098290\n                          ------------------------------------------------------------------------"
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#summary-and-recommendation",
    -    "href": "templates/RvsSAS_template.html#summary-and-recommendation",
    -    "title": "R vs SAS [Name of Method]",
    -    "section": "",
    -    "text": "Summarize the key findings from the analysis. Highlight any major differences observed and offer recommendations on which software/packages to use. Provide guidance on how to interpret the differences between the results obtained from various software of packages."
    +    "objectID": "Comp/r-sas-python_survey-stats-summary.html#python",
    +    "href": "Comp/r-sas-python_survey-stats-summary.html#python",
    +    "title": "R vs SAS vs Python Survey Summary Statistics",
    +    "section": "Python",
    +    "text": "Python\n\nimport pandas as pd\nfrom samplics import TaylorEstimator\nfrom samplics.utils.types import PopParam\n\nnhanes = pd.read_csv(\"../data/nhanes.csv\")\n\nnhanes_design_kwargs = dict(\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    remove_nan=True,\n)\n\n# Mean of HI_CHOL\nmean_estimator = TaylorEstimator(PopParam.mean)\nmean_estimator.estimate(nhanes[\"HI_CHOL\"], **nhanes_design_kwargs)\nhi_chol_means = mean_estimator.to_dataframe()\n\n# Sum of HI_CHOL\ntotal_estimator = TaylorEstimator(PopParam.total)\ntotal_estimator.estimate(nhanes[\"HI_CHOL\"], **nhanes_design_kwargs)\nhi_chol_totals = total_estimator.to_dataframe()\n\n# Ratio of HI_CHOL / RIAGENDR\nratio_estimator = TaylorEstimator(PopParam.ratio)\nratio_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"], x=nhanes[\"RIAGENDR\"], **nhanes_design_kwargs\n)\nhi_chol_ratio = ratio_estimator.to_dataframe()\n\n# Proportion of different AGECAT values\nprop_estimator = TaylorEstimator(PopParam.prop)\nprop_estimator.estimate(nhanes[\"agecat\"], **nhanes_design_kwargs)\nagecat_prop = prop_estimator.to_dataframe()\n\n# Quantiles of HI_CHOL\n# NA\n\n# Domain analysis of mean of HI_CHOL by race, with design effect\nmean_estimator = TaylorEstimator(PopParam.mean)\nmean_estimator.estimate(\n    nhanes[\"HI_CHOL\"],\n    **nhanes_design_kwargs,\n    domain=nhanes[\"race\"],\n    deff=True,  # Design effect param currently has no effect\n)\nhi_chol_domain_means = mean_estimator.to_dataframe()\n\n\nag_dict = agecat_prop.set_index(\"_level\").to_dict()\nhc_dict = hi_chol_domain_means.set_index(\"_domain\").to_dict()\n\nprint(\n    f\"\"\"\n    Mean of HI_CHOL: {hi_chol_means[\"_estimate\"][0]}\n    SE of Mean HI_CHOL: {hi_chol_means[\"_stderror\"][0]}\n    CL of Mean HI_CHOL: {(hi_chol_means[\"_lci\"][0], hi_chol_means[\"_uci\"][0])}\n    Sum of HI_CHOL: {hi_chol_totals[\"_estimate\"][0]}\n    SE of Sum HI_CHOL: {hi_chol_totals[\"_stderror\"][0]}\n    CL of Sum HI_CHOL: {(hi_chol_totals[\"_lci\"][0], hi_chol_totals[\"_uci\"][0])}\n    Ratio of HI_CHOL / RIAGENDR: {hi_chol_ratio[\"_estimate\"][0]}\n    SE of Ratio HI_CHOL / RIAGENDR: {hi_chol_ratio[\"_stderror\"][0]}\n    CL of Ratio HI_CHOL / RIAGENDR: {(hi_chol_ratio[\"_lci\"][0], hi_chol_ratio[\"_uci\"][0])}\n    Proportion of AGECAT: {ag_dict[\"_estimate\"]}\n    SE of Proportion AGECAT: {ag_dict[\"_stderror\"]}\n    LCL of Proportion AGECAT: {ag_dict[\"_lci\"]}\n    UCL of Proportion AGECAT: {ag_dict[\"_uci\"]}\n    Quantiles of HI_CHOL: Not available\n    Mean of HI_CHOL by race: {hc_dict[\"_estimate\"]}\n    SE of HI_CHL by race: {hc_dict[\"_stderror\"]}\n    LCL of HI_CHOL by race: {hc_dict[\"_lci\"]}\n    UCL of HI_CHOL by race: {hc_dict[\"_uci\"]}\n    Design Effect of HI_CHOL by race: Not available\n    \"\"\"\n)\n\n\n    Mean of HI_CHOL: 0.11214295634969222\n    SE of Mean HI_CHOL: 0.005445839698954557\n    CL of Mean HI_CHOL: (np.float64(0.1005982919131703), np.float64(0.12368762078621415))\n    Sum of HI_CHOL: 28635245.254672\n    SE of Sum HI_CHOL: 2020710.7436996205\n    CL of Sum HI_CHOL: (np.float64(24351529.84091034), np.float64(32918960.668433655))\n    Ratio of HI_CHOL / RIAGENDR: 0.07422209323594066\n    SE of Ratio HI_CHOL / RIAGENDR: 0.0037147278931070065\n    CL of Ratio HI_CHOL / RIAGENDR: (np.float64(0.06634722189017901), np.float64(0.0820969645817023))\n    Proportion of AGECAT: {'(0,19]': 0.2077494937870972, '(19,39]': 0.29340788818591346, '(39,59]': 0.30328958320385285, '(59,Inf]': 0.19555303482313666}\n    SE of Proportion AGECAT: {'(0,19]': 0.006129950336419631, '(19,39]': 0.009560691634608896, '(39,59]': 0.004519462827363183, '(59,Inf]': 0.008092578243976422}\n    LCL of Proportion AGECAT: {'(0,19]': 0.19505410930097866, '(19,39]': 0.27355685874096586, '(39,59]': 0.2937950591158628, '(59,Inf]': 0.1789647230500222}\n    UCL of Proportion AGECAT: {'(0,19]': 0.2210442684297426, '(19,39]': 0.3140766293472951, '(39,59]': 0.31295496708023285, '(59,Inf]': 0.21327950895208636}\n    Quantiles of HI_CHOL: Not available\n    Mean of HI_CHOL by race: {1: 0.10149166545397208, 2: 0.12164920535593333, 3: 0.07864006039908408, 4: 0.09967860947712034}\n    SE of HI_CHL by race: {1: 0.006245843308749599, 2: 0.006604133623532979, 3: 0.010384645000548863, 4: 0.024666226871851268}\n    LCL of HI_CHOL by race: {1: 0.0882510691256497, 2: 0.10764906749064211, 3: 0.056625596431891564, 4: 0.04738854441969514}\n    UCL of HI_CHOL by race: {1: 0.11473226178229445, 2: 0.13564934322122454, 3: 0.1006545243662766, 4: 0.15196867453454554}\n    Design Effect of HI_CHOL by race: Not available"
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#troubleshooting-and-edge-cases",
    -    "href": "templates/RvsSAS_template.html#troubleshooting-and-edge-cases",
    -    "title": "R vs SAS [Name of Method]",
    -    "section": "",
    -    "text": "List potential issues that users may encounter and propose solutions or troubleshooting steps.\nExample:\n\nIssue: Non-convergence in Poisson Regression.\nSolution: Check for multicollinearity among predictors, scale the predictors, or switch to a more appropriate model family."
    +    "objectID": "Comp/r-sas-python_survey-stats-summary.html#quantiles",
    +    "href": "Comp/r-sas-python_survey-stats-summary.html#quantiles",
    +    "title": "R vs SAS vs Python Survey Summary Statistics",
    +    "section": "Quantiles",
    +    "text": "Quantiles\nsamplics in Python does not have a method for calculating quantiles, and in R and SAS the available methods lead to different results. To demonstrate the differences in calculating quantiles, we will use the apisrs dataset from the survey package in R (“API Data Files” 2006).\n\nlibrary(survey)\n\ndata(\"api\")\n\nhead(apisrs) |> gt::gt()\n\n\n\n\n\n\n\ncds\nstype\nname\nsname\nsnum\ndname\ndnum\ncname\ncnum\nflag\npcttest\napi00\napi99\ntarget\ngrowth\nsch.wide\ncomp.imp\nboth\nawards\nmeals\nell\nyr.rnd\nmobility\nacs.k3\nacs.46\nacs.core\npct.resp\nnot.hsg\nhsg\nsome.col\ncol.grad\ngrad.sch\navg.ed\nfull\nemer\nenroll\napi.stu\npw\nfpc\n\n\n\n\n15739081534155\nH\nMcFarland High\nMcFarland High\n1039\nMcFarland Unified\n432\nKern\n14\nNA\n98\n462\n448\n18\n14\nNo\nYes\nNo\nNo\n44\n31\nNA\n6\nNA\nNA\n24\n82\n44\n34\n12\n7\n3\n1.91\n71\n35\n477\n429\n30.97\n6194\n\n\n19642126066716\nE\nStowers (Cecil\nStowers (Cecil B.) Elementary\n1124\nABC Unified\n1\nLos Angeles\n18\nNA\n100\n878\n831\nNA\n47\nYes\nYes\nYes\nYes\n8\n25\nNA\n15\n19\n30\nNA\n97\n4\n10\n23\n43\n21\n3.66\n90\n10\n478\n420\n30.97\n6194\n\n\n30664493030640\nH\nBrea-Olinda Hig\nBrea-Olinda High\n2868\nBrea-Olinda Unified\n79\nOrange\n29\nNA\n98\n734\n742\n3\n-8\nNo\nNo\nNo\nNo\n10\n10\nNA\n7\nNA\nNA\n28\n95\n5\n9\n21\n41\n24\n3.71\n83\n18\n1410\n1287\n30.97\n6194\n\n\n19644516012744\nE\nAlameda Element\nAlameda Elementary\n1273\nDowney Unified\n187\nLos Angeles\n18\nNA\n99\n772\n657\n7\n115\nYes\nYes\nYes\nYes\n70\n25\nNA\n23\n23\nNA\nNA\n100\n37\n40\n14\n8\n1\n1.96\n85\n18\n342\n291\n30.97\n6194\n\n\n40688096043293\nE\nSunnyside Eleme\nSunnyside Elementary\n4926\nSan Luis Coastal Unified\n640\nSan Luis Obispo\n39\nNA\n99\n739\n719\n4\n20\nYes\nYes\nYes\nYes\n43\n12\nNA\n12\n20\n29\nNA\n91\n8\n21\n27\n34\n10\n3.17\n100\n0\n217\n189\n30.97\n6194\n\n\n19734456014278\nE\nLos Molinos Ele\nLos Molinos Elementary\n2463\nHacienda la Puente Unif\n284\nLos Angeles\n18\nNA\n93\n835\n822\nNA\n13\nYes\nYes\nYes\nNo\n16\n19\nNA\n13\n19\n29\nNA\n71\n1\n8\n20\n38\n34\n3.96\n75\n20\n258\n211\n30.97\n6194\n\n\n\n\n\n\n\nIn SAS, PROC SURVEYMEANS will calculate quantiles of specific probabilities as you request them, using Woodruff’s method for intervals and a custom quantile method (SAS/STAT® 15.1 User’s Guide 2018, 9834). The quantile method does not match any of the available qrules in R, and although the default interval.types in the R survey::svyquantile function also uses Woodruff’s method, it is a different implementation.\nThe method and results from SAS are as follows:\nproc surveymeans data=apisrs total=6194 quantile=(0.025 0.5 0.975);\n    var growth;\nrun;\n                             The SURVEYMEANS Procedure\n\n                                    Data Summary\n\n                        Number of Observations           200\n\n\n\n\n                                     Quantiles\n\n                                                      Std\n Variable       Percentile       Estimate           Error    95% Confidence Limits\n ---------------------------------------------------------------------------------\n growth           2.5          -16.500000        1.755916    -19.962591 -13.037409\n                   50 Median    26.500000        1.924351     22.705263  30.294737\n                 97.5           99.000000       16.133827     67.184794 130.815206\n ---------------------------------------------------------------------------------\nIf in R we use the default qrule=\"math\" (equivalent to qrule=\"hf1\" and matches type=1 in the quantile function for unweighted data) along with the default interval.type=\"mean\", we get the following results:\n\nsrs_design <- svydesign(data = apisrs,id = ~1,fpc = ~fpc,)\n\nsvyquantile(\n  ~growth,\n  srs_design,\n  quantiles = c(0.025, 0.5, 0.975),\n  ci=TRUE,\n  se=TRUE\n)\n\n$growth\n      quantile ci.2.5 ci.97.5        se\n0.025      -16    -21     -12  2.281998\n0.5         27     24      31  1.774887\n0.975       99     84     189 26.623305\n\nattr(,\"hasci\")\n[1] TRUE\nattr(,\"class\")\n[1] \"newsvyquantile\"\n\n\nHere we can see that the quantiles, confidence intervals, and standard errors do not match SAS. From testing, none of the available qrule methods match SAS for the quantile values, so it is recommended to use the default values unless you have need of some of the other properties of different quantile definitions - see vignette(\"qrule\", package=\"survey\") for more detail. If an exact match to SAS is required, then the svyquantile function allows for passing a custom function to the qrule argument to define your own method for calculating quantiles. Below is an example that will match SAS:\n\nsas_qrule <- function(x, w, p) {\n  # Custom qrule to match SAS, based on survey::oldsvyquantile's internal method\n  if (any(is.na(x))) \n    return(NA * p)\n  w <- rowsum(w, x, reorder = TRUE)\n  x <- sort(unique(x))\n  cum.w <- cumsum(w)/sum(w)\n  cdf <- approxfun(cum.w, x, method = \"linear\", f = 1, \n    yleft = min(x), yright = max(x), ties = min)\n  cdf(p)\n}\n\n\nsas_quants <- svyquantile(\n  ~growth,\n  srs_design,\n  quantiles = c(0.025, 0.5, 0.975),\n  qrule=sas_qrule,\n  ci=TRUE,\n  se=TRUE\n)\n\nsas_quants\n\n$growth\n      quantile    ci.2.5   ci.97.5        se\n0.025    -16.5 -22.00000 -15.07482  1.755916\n0.5       26.5  23.03563  30.62510  1.924351\n0.975     99.0  83.70616 147.33657 16.133827\n\nattr(,\"hasci\")\n[1] TRUE\nattr(,\"class\")\n[1] \"newsvyquantile\"\n\n\nNote that although the quantiles and standard errors match, the confidence intervals still do not match SAS. For this another custom calculation is required, based on the formula used in SAS:\n\nsas_quantile_confint <- function(newsvyquantile, level=0.05, df=Inf) {\n  q <- coef(newsvyquantile)\n  se <- SE(newsvyquantile)\n  ci <- cbind(\n    q,\n    q + se * qt(level/2, df),\n    q - se * qt(1 - level/2, df),\n    se\n  )\n  colnames(ci) <- c(\"quantile\", paste0(\"ci.\", c(100 * level / 2, 100 * (1 - level / 2))), \"se\")\n\n  ci\n}\n\nsas_quantile_confint(sas_quants, df=degf(srs_design))\n\n             quantile    ci.2.5   ci.97.5        se\ngrowth.0.025    -16.5 -19.96259 -19.96259  1.755916\ngrowth.0.5       26.5  22.70526  22.70526  1.924351\ngrowth.0.975     99.0  67.18479  67.18479 16.133827"
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#additional-references",
    -    "href": "templates/RvsSAS_template.html#additional-references",
    -    "title": "R vs SAS [Name of Method]",
    -    "section": "",
    -    "text": "Provide references and additional reading materials for both R and SAS documentation related to the analysis.\nR Documentation:\n\nglm function: https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/glm\n\nSAS Documentation:\n\nPROC GENMOD: https://documentation.sas.com/doc/en/statcdc/14.2/statug/statug_genmod_overview.htm"
    +    "objectID": "Comp/r-sas-python_survey-stats-summary.html#other-considerations",
    +    "href": "Comp/r-sas-python_survey-stats-summary.html#other-considerations",
    +    "title": "R vs SAS vs Python Survey Summary Statistics",
    +    "section": "Other considerations",
    +    "text": "Other considerations\n\nDegrees of Freedom\nSome of the functions in R require the degrees of freedom to be specified when calculating confidence intervals, otherwise it assumes a normal distribution. This can be done easily by using the survey::degf function, which calculates the degrees of freedom for a survey design object.\n\n\nSingle PSU Strata\nAlthough it was not apparent with the examples used here, if there is only one PSU from a stratum then R will by default error, whereas SAS will remove that stratum from the variance calculation. This can be changed in R by setting the options(survey.lonely.psu=\"certainty\") to match SAS and have it make no contribution to the variance. In samplics, this behaviour can be configured using the single_psu argument to the estimate method, and can be set to to match SAS using SinglePSUEst.certainty. This should be considered carefully however, in R and Python there are additional methods of handling single PSUs that may be more appropriate for your use-case.\n\n\nDocumentation Differences\nOne key consideration when choosing a statistical package is the documentation available. In this case, both the survey package in R and the survey procedures in SAS have a much more comprehensive set of documentation and examples than samplics in Python. This includes both detailed examples, as well as the underlying theory and methods used in the calculations including references to the literature."
       },
       {
    -    "objectID": "templates/RvsSAS_template.html#appendix-optional",
    -    "href": "templates/RvsSAS_template.html#appendix-optional",
    -    "title": "R vs SAS [Name of Method]",
    +    "objectID": "Comp/r-sas_ttest_1Sample.html",
    +    "href": "Comp/r-sas_ttest_1Sample.html",
    +    "title": "R vs SAS One Sample T-Test",
         "section": "",
    -    "text": "Include any additional information, extended examples, or advanced topics that may be helpful for expert users.\nThis template is designed to be comprehensive and flexible, able to accommodate multiple scenarios and diverse datasets. It ensures that each section clearly communicates the necessary information and comparisons, making it easier for users to understand and apply the analyses appropriately across both R and SAS platforms.\n\n\n\n\n\n\nSession Info"
    +    "text": "The following table shows the types of One Sample t-test analysis, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nOne sample t-test, normal data\nYes\nYes\nYes\nIn Base R, use mu parameter on t.test() function to set null hypothesis value\n\n\nOne sample t-test, lognormal data\nMaybe\nYes\nNA\nMay be supported by envstats package\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n29\n29\n29\nYes\n\n\n\nt value\n2.364306\n2.364306\n2.364306\nYes\n\n\n\np value\n0.0249741\n0.0249741\n0.0249741\nYes\n\n\n\n\n\n\n\nSince there is currently no known support for lognormal t-test in R, this comparison is not applicable."
       },
       {
    -    "objectID": "blogs/posts/202403_phuseUS2024.html",
    -    "href": "blogs/posts/202403_phuseUS2024.html",
    -    "title": "PHUSE US connect 2024 Poster Presentation by Soma & Vikash",
    +    "objectID": "Comp/r-sas_ttest_1Sample.html#comparison-results",
    +    "href": "Comp/r-sas_ttest_1Sample.html#comparison-results",
    +    "title": "R vs SAS One Sample T-Test",
         "section": "",
    -    "text": "Congratulations, Soma Sekhar Sriadibhatla, on your poster presentation “CAMIS-An open source repository to document differences in statistical methodology software” at PHUSE US Connect 2024.\n\nA poster was presented on PHUSE DVOST-CAMIS effort to document discrepancies between programming languages such as SAS, R, and Python (due to software default choices) in order to conduct the same end-point analysis, a cheat sheet across multilingual languages, and the CAMIS-ONCO subgroup.\n\nWe are pleased to inform you that we have received positive feedback from the industry on our CAMIS repository, which helps them to eliminate the risk of doing end point analysis in a multilingual world."
    +    "text": "Here is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n29\n29\n29\nYes\n\n\n\nt value\n2.364306\n2.364306\n2.364306\nYes\n\n\n\np value\n0.0249741\n0.0249741\n0.0249741\nYes\n\n\n\n\n\n\n\nSince there is currently no known support for lognormal t-test in R, this comparison is not applicable."
       },
       {
    -    "objectID": "blogs/posts/202305_introduction_to_CAMIS_blog.html",
    -    "href": "blogs/posts/202305_introduction_to_CAMIS_blog.html",
    -    "title": "Introduction Comparing Analysis Method Implementations in Software (CAMIS)",
    +    "objectID": "Comp/r-sas_ancova.html",
    +    "href": "Comp/r-sas_ancova.html",
    +    "title": "R vs SAS ANCOVA",
         "section": "",
    -    "text": "Are you trying to replicate results using different software/languages and struggling to find out why you can’t match the results? Check out the CAMIS repository!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe CAMIS repository stores documentation detailing the reasons for observed differences when performing statistical analysis in SAS and R. The repository is housed on github, and will be populated through open-source community contributions.\nDifferences between software could be due to different default and available options, including the methods being used. By documenting these known differences in a repository, we aim to reduce time-consuming efforts within the community, where multiple people are investigating the same issues. If you find an issue not already investigated, please log an Issue in github. If you have time to investigate and document the reason for the issue, then please submit a pull request with the new content in a quarto file. Details of how to contribute can be found on the website.\nCAMIS is a PHUSE working group in collaboration with PSI and the R consortium. Initially the repository contains R and SAS analysis result comparisons, however the team hope to extend to other software/languages in the near future. Our white paper will soon be available on the website. Please help us to build a high quality and comprehensive repository."
    +    "text": "The following table shows the types of One Sample t-test analysis, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nANCOVA using general linear model and lsmeans\nYes\nYes\nYes\nGLM() function from sasLM with EMEANS=TRUE is the easiest to use and matches SAS\n\n\n\n\n\nHere is a table of comparison values between lm() from the stats package, GLM() from the sasLM package, and SAS PROC GLM:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nlm()\nGLM()\nPROC GLM\nMatch\nNotes\n\n\n\n\nType I, Sum sq, drug\n293.6000\n293.6000\n293.6000\nYes\n\n\n\nType I, Sum sq, pre\n577.897\n577.8974\n577.8974\nYes\n\n\n\nType III, Sum sq, drug\n68.554\n68.55371\n68.55371\nYes\n\n\n\nType III, Sum sq, pre\n577.897\n577.89740\n577.89740\nYes\n\n\n\nLSmean drugA\n6.71\n6.714963\n6.714963\nYes\n\n\n\nLSmean drugD\n6.82\n6.823935\n6.823935\nYes\n\n\n\nLSmean drugF\n10.16\n10.161102\n10.161102\nYes"
       },
       {
    -    "objectID": "R/nparestimate.html",
    -    "href": "R/nparestimate.html",
    -    "title": "Non-parametric point estimation",
    +    "objectID": "Comp/r-sas_ancova.html#comp",
    +    "href": "Comp/r-sas_ancova.html#comp",
    +    "title": "R vs SAS ANCOVA",
         "section": "",
    -    "text": "The Hodges-Lehman estimator (Hodges and Lehmann 1962) provides a point estimate which is associated with the Wilcoxon rank sum statistics based on location shift. This is typically used for the 2-sample comparison with small sample size. Note: The Hodges-Lehman estimates the median of the difference and not the difference of the medians. The corresponding distribution-free confidence interval is also based on the Wilcoxon rank sum statistics (Moses).\nThere are several packages covering this functionality. However, we will focus on the wilcox.test function implemented in R base. The {pairwiseCI} package provides further resources to derive various types of confidence intervals for the pairwise comparison case. This package is very flexible and uses the functions of related packages.\nHodges, J. L. and Lehmann, E. L. (1962) Rank methods for combination of independent experiments in analysis of variance. Annals of Mathematical Statistics, 33, 482-4."
    -  },
    -  {
    -    "objectID": "R/nparestimate.html#base",
    -    "href": "R/nparestimate.html#base",
    -    "title": "Non-parametric point estimation",
    -    "section": "{base}",
    -    "text": "{base}\nThe base function provides the Hodges-Lehmann estimate and the Moses confidence interval. The function will provide warnings in case of ties in the data and will not provide the exact confidence interval.\n\nwt <- wilcox.test(x, y, exact = TRUE, conf.int = TRUE)\n\nWarning in wilcox.test.default(x, y, exact = TRUE, conf.int = TRUE): cannot\ncompute exact p-value with ties\n\n\nWarning in wilcox.test.default(x, y, exact = TRUE, conf.int = TRUE): cannot\ncompute exact confidence intervals with ties\n\n# Hodges-Lehmann estimator\nwt$estimate\n\ndifference in location \n             0.5600562 \n\n# Moses confidence interval\nwt$conf.int\n\n[1] -0.3699774  1.1829708\nattr(,\"conf.level\")\n[1] 0.95\n\n\nNote: You can process the long format also for wilcox.test using the formula structure:\n\nwilcox.test(all$value ~ all$treat, exact = TRUE, conf.int = TRUE)\n\nWarning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): cannot\ncompute exact p-value with ties\n\n\nWarning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): cannot\ncompute exact confidence intervals with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  all$value by all$treat\nW = 58, p-value = 0.1329\nalternative hypothesis: true location shift is not equal to 0\n95 percent confidence interval:\n -0.3699774  1.1829708\nsample estimates:\ndifference in location \n             0.5600562"
    -  },
    -  {
    -    "objectID": "R/nparestimate.html#pairwiseci",
    -    "href": "R/nparestimate.html#pairwiseci",
    -    "title": "Non-parametric point estimation",
    -    "section": "{pairwiseCI}",
    -    "text": "{pairwiseCI}\nThe pairwiseCI package requires data to be in a long format to use the formula structure. Via the control parameter the direction can be defined. Setting method to “HL.diff” provides exact confidence intervals together with the Hodges-Lehmann point estimate.\n\n# pairwiseCI is using the formula structure \npairwiseCI(value ~ treat, data = all, \n           method=\"HL.diff\", control=\"B\",\n           conf.level = .95)\n\n  \n95 %-confidence intervals \n Method:  Difference in location (Hodges-Lehmann estimator) \n  \n  \n      estimate lower upper\nA - B     0.56 -0.22 1.082"
    +    "text": "Here is a table of comparison values between lm() from the stats package, GLM() from the sasLM package, and SAS PROC GLM:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nlm()\nGLM()\nPROC GLM\nMatch\nNotes\n\n\n\n\nType I, Sum sq, drug\n293.6000\n293.6000\n293.6000\nYes\n\n\n\nType I, Sum sq, pre\n577.897\n577.8974\n577.8974\nYes\n\n\n\nType III, Sum sq, drug\n68.554\n68.55371\n68.55371\nYes\n\n\n\nType III, Sum sq, pre\n577.897\n577.89740\n577.89740\nYes\n\n\n\nLSmean drugA\n6.71\n6.714963\n6.714963\nYes\n\n\n\nLSmean drugD\n6.82\n6.823935\n6.823935\nYes\n\n\n\nLSmean drugF\n10.16\n10.161102\n10.161102\nYes"
       },
       {
    -    "objectID": "R/logistic_regr.html",
    -    "href": "R/logistic_regr.html",
    -    "title": "Logistic Regression",
    +    "objectID": "Comp/r-sas-wilcoxonsr_HL.html",
    +    "href": "Comp/r-sas-wilcoxonsr_HL.html",
    +    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
         "section": "",
    -    "text": "A model of the dependence of binary variables on explanatory variables. The logit of expectation is explained as linear for of explanatory variables. If we observed \\((y_i, x_i),\\) where \\(y_i\\) is a Bernoulli variable and \\(x_i\\) a vector of explanatory variables, the model for \\(\\pi_i = P(y_i=1)\\) is\n\\[\n\\text{logit}(\\pi_i)= \\log\\left\\{ \\frac{\\pi_i}{1-\\pi_i}\\right\\} = \\beta_0 + \\beta x_i, i = 1,\\ldots,n\n\\]\nThe model is especially useful in case-control studies and leads to the effect of risk factors by odds ratios.\n\nExample: Lung Cancer Data\nData source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601-7, 1994.\nSurvival in patients with advanced lung cancer from the North Central Cancer Treatment Group. Performance scores rate how well the patient can perform usual daily activities (see ?lung for details).\n\nlibrary(survival) \nglimpse(lung)\n\nRows: 228\nColumns: 10\n$ inst      <dbl> 3, 3, 3, 5, 1, 12, 7, 11, 1, 7, 6, 16, 11, 21, 12, 1, 22, 16…\n$ time      <dbl> 306, 455, 1010, 210, 883, 1022, 310, 361, 218, 166, 170, 654…\n$ status    <dbl> 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …\n$ age       <dbl> 74, 68, 56, 57, 60, 74, 68, 71, 53, 61, 57, 68, 68, 60, 57, …\n$ sex       <dbl> 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, …\n$ ph.ecog   <dbl> 1, 0, 0, 1, 0, 1, 2, 2, 1, 2, 1, 2, 1, NA, 1, 1, 1, 2, 2, 1,…\n$ ph.karno  <dbl> 90, 90, 90, 90, 100, 50, 70, 60, 70, 70, 80, 70, 90, 60, 80,…\n$ pat.karno <dbl> 100, 90, 90, 60, 90, 80, 60, 80, 80, 70, 80, 70, 90, 70, 70,…\n$ meal.cal  <dbl> 1175, 1225, NA, 1150, NA, 513, 384, 538, 825, 271, 1025, NA,…\n$ wt.loss   <dbl> NA, 15, 15, 11, 0, 0, 10, 1, 16, 34, 27, 23, 5, 32, 60, 15, …\n\n\n\n\nModel Fit\nWe analyze the weight loss in lung cancer patients in dependency of age, sex, ECOG performance score and calories consumed at meals.\n\nlung2 <- survival::lung %>% \n  mutate(\n    wt_grp = factor(wt.loss > 0, labels = c(\"weight loss\", \"weight gain\"))\n  ) \n\n\nm1 <- glm(wt_grp ~ age + sex + ph.ecog + meal.cal, data = lung2, family = binomial(link=\"logit\"))\nsummary(m1)\n\n\nCall:\nglm(formula = wt_grp ~ age + sex + ph.ecog + meal.cal, family = binomial(link = \"logit\"), \n    data = lung2)\n\nCoefficients:\n              Estimate Std. Error z value Pr(>|z|)  \n(Intercept)  3.2631673  1.6488207   1.979   0.0478 *\nage         -0.0101717  0.0208107  -0.489   0.6250  \nsex         -0.8717357  0.3714042  -2.347   0.0189 *\nph.ecog      0.4179665  0.2588653   1.615   0.1064  \nmeal.cal    -0.0008869  0.0004467  -1.985   0.0471 *\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for binomial family taken to be 1)\n\n    Null deviance: 202.36  on 169  degrees of freedom\nResidual deviance: 191.50  on 165  degrees of freedom\n  (58 observations deleted due to missingness)\nAIC: 201.5\n\nNumber of Fisher Scoring iterations: 4\n\n\nThe model summary contains the parameter estimates \\(\\beta_j\\) for each explanatory variable \\(x_j\\), corresponding to the log-odds for the response variable to take the value \\(1\\), conditional on all other explanatory variables remaining constant. For better interpretation, we can exponentiate these estimates, to obtain estimates for the odds instead and provide \\(95\\)% confidence intervals:\n\nexp(coef(m1))\n\n(Intercept)         age         sex     ph.ecog    meal.cal \n 26.1321742   0.9898798   0.4182250   1.5188698   0.9991135 \n\nexp(confint(m1))\n\nWaiting for profiling to be done...\n\n\n                2.5 %      97.5 %\n(Intercept) 1.0964330 730.3978786\nage         0.9495388   1.0307216\nsex         0.1996925   0.8617165\nph.ecog     0.9194053   2.5491933\nmeal.cal    0.9982107   0.9999837\n\n\n\n\nModel Comparison\nTo compare two logistic models, one tests the difference in residual variances from both models using a \\(\\chi^2\\)-distribution with a single degree of freedom (here at the \\(5\\)% level):\n\nm2 <- glm(wt_grp ~ sex + ph.ecog + meal.cal, data = lung2, family = binomial(link=\"logit\"))\nsummary(m2)\n\n\nCall:\nglm(formula = wt_grp ~ sex + ph.ecog + meal.cal, family = binomial(link = \"logit\"), \n    data = lung2)\n\nCoefficients:\n              Estimate Std. Error z value Pr(>|z|)   \n(Intercept)  2.5606595  0.7976887   3.210  0.00133 **\nsex         -0.8359241  0.3637378  -2.298  0.02155 * \nph.ecog      0.3794295  0.2469030   1.537  0.12435   \nmeal.cal    -0.0008334  0.0004346  -1.918  0.05517 . \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for binomial family taken to be 1)\n\n    Null deviance: 202.36  on 169  degrees of freedom\nResidual deviance: 191.74  on 166  degrees of freedom\n  (58 observations deleted due to missingness)\nAIC: 199.74\n\nNumber of Fisher Scoring iterations: 4\n\nanova(m1, m2, test = \"Chisq\")\n\nAnalysis of Deviance Table\n\nModel 1: wt_grp ~ age + sex + ph.ecog + meal.cal\nModel 2: wt_grp ~ sex + ph.ecog + meal.cal\n  Resid. Df Resid. Dev Df Deviance Pr(>Chi)\n1       165     191.50                     \n2       166     191.75 -1 -0.24046   0.6239\n\n\n\n\nPrediction\nPredictions from the model for the log-odds of a patient with new data to experience a weight loss are derived using predict():\n\n# new female, symptomatic but completely ambulatory patient consuming 2500 calories\nnew_pt <- data.frame(sex=2, ph.ecog=1, meal.cal=2500)\npredict(m2, new_pt, type = \"response\")\n\n       1 \n0.306767"
    +    "text": "This section compares the implementation of Wilcoxon signed-rank test in R, SAS and StatXact.\n\n\n\nThe following table provides an overview of the methods support comparability between R, SAS and StatXact for the new analysis point.\n\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nSupported in StatXact\nNotes\n\n\n\n\nWilcoxon signed-rank test with p value only\nYES\nYES\nYES\nAvailable in all, but results match only between R and StatXact. See details on p value on each software page.\n\n\nHodges-Lehmann estimator\nYES\nNO\nYES\nAvailable in R and StatXact only. In SAS needs to be derived manually.\n\n\nExact/non-exact method\nNon-exact method with/without continuity correction\nYES\nYES\nNO\nNO\nYES\nNO\nStats package in R and StatXact support both options. SAS applies a default one depending on N.\nOnly Stats package in R support both options.\n\n\nDataset with “0” differences\nYES\nNO\nYES\nSAS ignores 0s. In R only Coin package supports.\n\n\nDataset with ties\nYES\nYES\nYES\nSupported in SAS and StatXact. In R only in Coin.\n\n\n\n\n\n\nAnalysis will be conducted on the example of anonymized data from 2-period, cross-over study comparing treatments A and B in patients with asthma and acute airway obstruction induced by repeated mannitol challenges.\nFor the purpose of the results comparison we will consider a specific case where the dataset has no ties and N (number of observations) = 240.\nWilcoxon signed rank test was applied to analyse the time to return to baseline FEV1 post-mannitol challenge 2. Median difference, p value and 95% CI were provided using the Hodges-Lehmann estimator.\n\nblood_p <- read.csv(\"../data/WilcoxonSignedRank_TTR.csv\", dec = \".\")\n\n\nhead(blood_p)\n\n  SUBJID   TRT_A   TRT_B\n1      1 143.670 153.316\n2      2 163.082 170.576\n3      3 153.393 168.599\n4      4 153.082 142.358\n5      5 146.720 141.193\n6      6 150.668 147.204\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nIf you need a flexibility of choosing between methods (exact, non-exact etc) in one software, go for R or StatXact.\nIf you need a detailed documentation explaining applied methods, go for StatXact.\nIf you only need p value and don’t mind a default exact or t-Student distribution depending on N, you can choose SAS.\nIf you need 0s to contribute to the analysis, go for Coin package in R or StatXact.\nIf your dataset has ties, go for Coin package in R or StatXact.\n\n\n\n\nDetails of how to implement the methods in the discussed software are available below:\nR:\n\nCheck how to perform this analysis in R here\n\nSAS & StatXact:\n\nCheck how to perform this analysis in SAS & StatXact here"
       },
       {
    -    "objectID": "R/mi_mar_predictive_mean_match.html",
    -    "href": "R/mi_mar_predictive_mean_match.html",
    -    "title": "Multiple Imputation: Predictive Mean Matching",
    +    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#introduction",
    +    "href": "Comp/r-sas-wilcoxonsr_HL.html#introduction",
    +    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
         "section": "",
    -    "text": "Predictive mean matching is a technique for missing value imputation. It calculates the predicted value of the missing variable based on a regression model from complete data, then selects one value (from the observed) that produces the closest prediction. PMM is robust to transformation, less vulnerable to model misspecification. More theoretical details for PMM can be found here.\nAssumption for PMM: distribution of missing is the same aas obsereved data of the candidates that produce the closest values to the predicted value by the missing entry."
    +    "text": "This section compares the implementation of Wilcoxon signed-rank test in R, SAS and StatXact."
       },
       {
    -    "objectID": "R/mi_mar_predictive_mean_match.html#overview",
    -    "href": "R/mi_mar_predictive_mean_match.html#overview",
    -    "title": "Multiple Imputation: Predictive Mean Matching",
    +    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#general-comparison-table",
    +    "href": "Comp/r-sas-wilcoxonsr_HL.html#general-comparison-table",
    +    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
         "section": "",
    -    "text": "Predictive mean matching is a technique for missing value imputation. It calculates the predicted value of the missing variable based on a regression model from complete data, then selects one value (from the observed) that produces the closest prediction. PMM is robust to transformation, less vulnerable to model misspecification. More theoretical details for PMM can be found here.\nAssumption for PMM: distribution of missing is the same aas obsereved data of the candidates that produce the closest values to the predicted value by the missing entry."
    -  },
    -  {
    -    "objectID": "R/mi_mar_predictive_mean_match.html#available-r-package",
    -    "href": "R/mi_mar_predictive_mean_match.html#available-r-package",
    -    "title": "Multiple Imputation: Predictive Mean Matching",
    -    "section": "Available R package",
    -    "text": "Available R package\nmice is a powerful R package developed by Stef van Buuren, Karin Groothuis-Oudshoorn and other contributors.\nImplementation of PMM in mice:\n\nPredictive mean matching, mice.impute.pmm\nWeighted predictive mean matching, mice.impute.midastouch\nMultivariate predictive mean matching, mice.impute.mpmm"
    +    "text": "The following table provides an overview of the methods support comparability between R, SAS and StatXact for the new analysis point.\n\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nSupported in StatXact\nNotes\n\n\n\n\nWilcoxon signed-rank test with p value only\nYES\nYES\nYES\nAvailable in all, but results match only between R and StatXact. See details on p value on each software page.\n\n\nHodges-Lehmann estimator\nYES\nNO\nYES\nAvailable in R and StatXact only. In SAS needs to be derived manually.\n\n\nExact/non-exact method\nNon-exact method with/without continuity correction\nYES\nYES\nNO\nNO\nYES\nNO\nStats package in R and StatXact support both options. SAS applies a default one depending on N.\nOnly Stats package in R support both options.\n\n\nDataset with “0” differences\nYES\nNO\nYES\nSAS ignores 0s. In R only Coin package supports.\n\n\nDataset with ties\nYES\nYES\nYES\nSupported in SAS and StatXact. In R only in Coin."
       },
       {
    -    "objectID": "R/mi_mar_predictive_mean_match.html#example",
    -    "href": "R/mi_mar_predictive_mean_match.html#example",
    -    "title": "Multiple Imputation: Predictive Mean Matching",
    -    "section": "Example",
    -    "text": "Example\nWe use the small dataset nhanes included in mice package. It has 25 rows, and three out of four variables have missings.\nThe original NHANES data is a large national level survey, some are publicly available via R package nhanes.\n\nlibrary(mice)\n\n\nAttaching package: 'mice'\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\nThe following objects are masked from 'package:base':\n\n    cbind, rbind\n\n# load example dataset from mice\nhead(nhanes)\n\n  age  bmi hyp chl\n1   1   NA  NA  NA\n2   2 22.7   1 187\n3   1   NA   1 187\n4   3   NA  NA  NA\n5   1 20.4   1 113\n6   3   NA  NA 184\n\nsummary(nhanes)\n\n      age            bmi             hyp             chl       \n Min.   :1.00   Min.   :20.40   Min.   :1.000   Min.   :113.0  \n 1st Qu.:1.00   1st Qu.:22.65   1st Qu.:1.000   1st Qu.:185.0  \n Median :2.00   Median :26.75   Median :1.000   Median :187.0  \n Mean   :1.76   Mean   :26.56   Mean   :1.235   Mean   :191.4  \n 3rd Qu.:2.00   3rd Qu.:28.93   3rd Qu.:1.000   3rd Qu.:212.0  \n Max.   :3.00   Max.   :35.30   Max.   :2.000   Max.   :284.0  \n                NA's   :9       NA's   :8       NA's   :10     \n\n\n\nImpute with PMM\nTo impute with PMM is straightforward: specify the method, method = pmm.\n\nimp_pmm <- mice(nhanes, method = 'pmm', m=5, maxit=10)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n  1   2  bmi  hyp  chl\n  1   3  bmi  hyp  chl\n  1   4  bmi  hyp  chl\n  1   5  bmi  hyp  chl\n  2   1  bmi  hyp  chl\n  2   2  bmi  hyp  chl\n  2   3  bmi  hyp  chl\n  2   4  bmi  hyp  chl\n  2   5  bmi  hyp  chl\n  3   1  bmi  hyp  chl\n  3   2  bmi  hyp  chl\n  3   3  bmi  hyp  chl\n  3   4  bmi  hyp  chl\n  3   5  bmi  hyp  chl\n  4   1  bmi  hyp  chl\n  4   2  bmi  hyp  chl\n  4   3  bmi  hyp  chl\n  4   4  bmi  hyp  chl\n  4   5  bmi  hyp  chl\n  5   1  bmi  hyp  chl\n  5   2  bmi  hyp  chl\n  5   3  bmi  hyp  chl\n  5   4  bmi  hyp  chl\n  5   5  bmi  hyp  chl\n  6   1  bmi  hyp  chl\n  6   2  bmi  hyp  chl\n  6   3  bmi  hyp  chl\n  6   4  bmi  hyp  chl\n  6   5  bmi  hyp  chl\n  7   1  bmi  hyp  chl\n  7   2  bmi  hyp  chl\n  7   3  bmi  hyp  chl\n  7   4  bmi  hyp  chl\n  7   5  bmi  hyp  chl\n  8   1  bmi  hyp  chl\n  8   2  bmi  hyp  chl\n  8   3  bmi  hyp  chl\n  8   4  bmi  hyp  chl\n  8   5  bmi  hyp  chl\n  9   1  bmi  hyp  chl\n  9   2  bmi  hyp  chl\n  9   3  bmi  hyp  chl\n  9   4  bmi  hyp  chl\n  9   5  bmi  hyp  chl\n  10   1  bmi  hyp  chl\n  10   2  bmi  hyp  chl\n  10   3  bmi  hyp  chl\n  10   4  bmi  hyp  chl\n  10   5  bmi  hyp  chl\n\nimp_pmm\n\nClass: mids\nNumber of multiple imputations:  5 \nImputation methods:\n  age   bmi   hyp   chl \n   \"\" \"pmm\" \"pmm\" \"pmm\" \nPredictorMatrix:\n    age bmi hyp chl\nage   0   1   1   1\nbmi   1   0   1   1\nhyp   1   1   0   1\nchl   1   1   1   0\n\n# imputations for bmi\nimp_pmm$imp$bmi\n\n      1    2    3    4    5\n1  29.6 22.0 33.2 33.2 30.1\n3  30.1 22.0 28.7 35.3 29.6\n4  26.3 22.5 21.7 22.5 24.9\n6  22.7 24.9 24.9 20.4 24.9\n10 28.7 27.5 30.1 22.5 29.6\n11 27.2 22.0 30.1 22.0 29.6\n12 33.2 29.6 29.6 20.4 29.6\n16 33.2 27.2 27.4 30.1 27.4\n21 27.2 30.1 27.4 30.1 27.2\n\n\nAn alternative to the standard PMM is midastouch.\n\nimp_pmms <- mice(nhanes, method = 'midastouch', m=5, maxit=10)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n  1   2  bmi  hyp  chl\n  1   3  bmi  hyp  chl\n  1   4  bmi  hyp  chl\n  1   5  bmi  hyp  chl\n  2   1  bmi  hyp  chl\n  2   2  bmi  hyp  chl\n  2   3  bmi  hyp  chl\n  2   4  bmi  hyp  chl\n  2   5  bmi  hyp  chl\n  3   1  bmi  hyp  chl\n  3   2  bmi  hyp  chl\n  3   3  bmi  hyp  chl\n  3   4  bmi  hyp  chl\n  3   5  bmi  hyp  chl\n  4   1  bmi  hyp  chl\n  4   2  bmi  hyp  chl\n  4   3  bmi  hyp  chl\n  4   4  bmi  hyp  chl\n  4   5  bmi  hyp  chl\n  5   1  bmi  hyp  chl\n  5   2  bmi  hyp  chl\n  5   3  bmi  hyp  chl\n  5   4  bmi  hyp  chl\n  5   5  bmi  hyp  chl\n  6   1  bmi  hyp  chl\n  6   2  bmi  hyp  chl\n  6   3  bmi  hyp  chl\n  6   4  bmi  hyp  chl\n  6   5  bmi  hyp  chl\n  7   1  bmi  hyp  chl\n  7   2  bmi  hyp  chl\n  7   3  bmi  hyp  chl\n  7   4  bmi  hyp  chl\n  7   5  bmi  hyp  chl\n  8   1  bmi  hyp  chl\n  8   2  bmi  hyp  chl\n  8   3  bmi  hyp  chl\n  8   4  bmi  hyp  chl\n  8   5  bmi  hyp  chl\n  9   1  bmi  hyp  chl\n  9   2  bmi  hyp  chl\n  9   3  bmi  hyp  chl\n  9   4  bmi  hyp  chl\n  9   5  bmi  hyp  chl\n  10   1  bmi  hyp  chl\n  10   2  bmi  hyp  chl\n  10   3  bmi  hyp  chl\n  10   4  bmi  hyp  chl\n  10   5  bmi  hyp  chl\n\nimp_pmm\n\nClass: mids\nNumber of multiple imputations:  5 \nImputation methods:\n  age   bmi   hyp   chl \n   \"\" \"pmm\" \"pmm\" \"pmm\" \nPredictorMatrix:\n    age bmi hyp chl\nage   0   1   1   1\nbmi   1   0   1   1\nhyp   1   1   0   1\nchl   1   1   1   0\n\nimp_pmms$imp$bmi\n\n      1    2    3    4    5\n1  29.6 20.4 30.1 30.1 20.4\n3  29.6 22.0 30.1 30.1 29.6\n4  24.9 21.7 27.2 21.7 21.7\n6  24.9 21.7 27.2 21.7 21.7\n10 26.3 27.4 30.1 27.4 20.4\n11 29.6 20.4 33.2 33.2 29.6\n12 26.3 21.7 26.3 26.3 20.4\n16 27.4 33.2 30.1 33.2 29.6\n21 29.6 20.4 33.2 30.1 35.3"
    +    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#example-data",
    +    "href": "Comp/r-sas-wilcoxonsr_HL.html#example-data",
    +    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
    +    "section": "",
    +    "text": "Analysis will be conducted on the example of anonymized data from 2-period, cross-over study comparing treatments A and B in patients with asthma and acute airway obstruction induced by repeated mannitol challenges.\nFor the purpose of the results comparison we will consider a specific case where the dataset has no ties and N (number of observations) = 240.\nWilcoxon signed rank test was applied to analyse the time to return to baseline FEV1 post-mannitol challenge 2. Median difference, p value and 95% CI were provided using the Hodges-Lehmann estimator.\n\nblood_p <- read.csv(\"../data/WilcoxonSignedRank_TTR.csv\", dec = \".\")\n\n\nhead(blood_p)\n\n  SUBJID   TRT_A   TRT_B\n1      1 143.670 153.316\n2      2 163.082 170.576\n3      3 153.393 168.599\n4      4 153.082 142.358\n5      5 146.720 141.193\n6      6 150.668 147.204"
       },
       {
    -    "objectID": "R/mcnemar.html",
    -    "href": "R/mcnemar.html",
    -    "title": "McNemar’s test in R",
    +    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#summary-and-recommendation",
    +    "href": "Comp/r-sas-wilcoxonsr_HL.html#summary-and-recommendation",
    +    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
         "section": "",
    -    "text": "Performing McNemar’s test in R\nTo demonstrate McNemar’s test, data was used concerning the presence or absence of cold symptoms reported by the same children at age 12 and age 14. A total of 2638 participants were involved.\n\nUsing the epibasix::mcnemar function\nTesting for a significant difference in cold symptoms between the two ages using the mcNemar function from the epibasix package can be performed as below. The symptoms for participants at age 12 and age 14 are tabulated and stored as an object, then passed to the mcNemar function. A more complete view of the output is achieved by calling the summary function.\n\nlibrary(epibasix)\n\nX <- table(colds$age12, colds$age14)\nepi_mcn <- mcNemar(X)\nsummary(epi_mcn)\n\n\nMatched Pairs Analysis: McNemar's Statistic and Odds Ratio (Detailed Summary):\n \n     \n       No Yes\n  No  707 256\n  Yes 144 212\n\nEntries in above matrix correspond to number of pairs. \n \nMcNemar's Chi^2 Statistic (corrected for continuity) = 30.802 which has a p-value of: 0\nNote: The p.value for McNemar's Test corresponds to the hypothesis test: H0: OR = 1 vs. HA: OR != 1\nMcNemar's Odds Ratio (b/c): 1.778\n95% Confidence Limits for the OR are: [1.449, 2.208]\nThe risk difference is: 0.085\n95% Confidence Limits for the rd are: [0.055, 0.115]\n\n\n\n\nUsing the stats::mcnemar.test function\nMcNemar’s test can also be performed using stats::mcnemar.test as shown below, using the same table X as in the previous section.\n\nmcnemar.test(X)\n\n\n    McNemar's Chi-squared test with continuity correction\n\ndata:  X\nMcNemar's chi-squared = 30.802, df = 1, p-value = 2.857e-08\n\n\nThe result is shown without continuity correction by specifying correct=FALSE.\n\nmcnemar.test(X, correct=FALSE)\n\n\n    McNemar's Chi-squared test\n\ndata:  X\nMcNemar's chi-squared = 31.36, df = 1, p-value = 2.144e-08\n\n\n\n\nResults\nAs default, using summary with epibasix::mcNemar gives additional information to the McNemar’s chi-square statistic. This includes a table to view proportions, and odds ratio and risk difference with 95% confidence limits. The result uses Edward’s continuity correction without the option to remove this, which is consistent with other functions within the package.\nstats::mcnemar.test uses a continuity correction as default but does allow for this to be removed. This function does not output any other coefficients for agreement or proportions but (if required) these can be achieved within other functions or packages in R."
    +    "text": "If you need a flexibility of choosing between methods (exact, non-exact etc) in one software, go for R or StatXact.\nIf you need a detailed documentation explaining applied methods, go for StatXact.\nIf you only need p value and don’t mind a default exact or t-Student distribution depending on N, you can choose SAS.\nIf you need 0s to contribute to the analysis, go for Coin package in R or StatXact.\nIf your dataset has ties, go for Coin package in R or StatXact."
       },
       {
    -    "objectID": "R/cmh.html",
    -    "href": "R/cmh.html",
    -    "title": "CMH Test",
    +    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#additional-references",
    +    "href": "Comp/r-sas-wilcoxonsr_HL.html#additional-references",
    +    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
         "section": "",
    -    "text": "The CMH procedure tests for conditional independence in partial contingency tables for a 2 x 2 x K design. However, it can be generalized to tables of X x Y x K dimensions.\n\n\nWe did not find any R package that delivers all the same measures as SAS at once. Therefore, we tried out multiple packages:\n\n\n\n\n\n\n\n\nPackage\nGeneral Association\nRow Means Differ\nNonzero Correlation\nM-H Odds Ratio\nHomogeneity Test\nNote\n\n\n\n\nstats::mantelhaen.test()\n✅\n❌\n❌\n✅\n❌\nWorks well for 2x2xK\n\n\nvcdExtra::CMHtest()\n✅\n✅\n✅\n❌\n❌\nProblems with sparsity, potential bug\n\n\nepiDisplay::mhor()\n❌\n❌\n❌\n✅\n✅\nOR are limited to 2x2xK design\n\n\n\n\n\n\n\n\n\n\nWe will use the CDISC Pilot data set, which is publicly available on the PHUSE Test Data Factory repository. We applied very basic filtering conditions upfront (see below) and this data set served as the basis of the examples to follow.\n\n\n# A tibble: 231 × 36\n   STUDYID SITEID SITEGR1 USUBJID TRTSDT     TRTEDT     TRTP  TRTPN   AGE AGEGR1\n   <chr>   <chr>  <chr>   <chr>   <date>     <date>     <chr> <dbl> <dbl> <chr> \n 1 CDISCP… 701    701     01-701… 2014-01-02 2014-07-02 Plac…     0    63 <65   \n 2 CDISCP… 701    701     01-701… 2012-08-05 2012-09-01 Plac…     0    64 <65   \n 3 CDISCP… 701    701     01-701… 2013-07-19 2014-01-14 Xano…    81    71 65-80 \n 4 CDISCP… 701    701     01-701… 2014-03-18 2014-03-31 Xano…    54    74 65-80 \n 5 CDISCP… 701    701     01-701… 2014-07-01 2014-12-30 Xano…    81    77 65-80 \n 6 CDISCP… 701    701     01-701… 2013-02-12 2013-03-09 Plac…     0    85 >80   \n 7 CDISCP… 701    701     01-701… 2014-01-01 2014-07-09 Xano…    54    68 65-80 \n 8 CDISCP… 701    701     01-701… 2012-09-07 2012-09-16 Xano…    54    81 >80   \n 9 CDISCP… 701    701     01-701… 2012-11-30 2013-01-23 Xano…    54    84 >80   \n10 CDISCP… 701    701     01-701… 2014-03-12 2014-09-09 Plac…     0    52 <65   \n# ℹ 221 more rows\n# ℹ 26 more variables: AGEGR1N <dbl>, RACE <chr>, RACEN <dbl>, SEX <chr>,\n#   ITTFL <chr>, EFFFL <chr>, COMP24FL <chr>, AVISIT <chr>, AVISITN <dbl>,\n#   VISIT <chr>, VISITNUM <dbl>, ADY <dbl>, ADT <date>, PARAMCD <chr>,\n#   PARAM <chr>, PARAMN <dbl>, AVAL <dbl>, ANL01FL <chr>, DTYPE <chr>,\n#   AWRANGE <chr>, AWTARGET <dbl>, AWTDIFF <dbl>, AWLO <dbl>, AWHI <dbl>,\n#   AWU <chr>, QSSEQ <dbl>\n\n\n\n\n\n\n\nThis is included in a base installation of R, as part of the stats package. Requires inputting data as a table or as vectors.\n\nmantelhaen.test(x = data$TRTP, y = data$SEX, z = data$AGEGR1)\n\n\n    Cochran-Mantel-Haenszel test\n\ndata:  data$TRTP and data$SEX and data$AGEGR1\nCochran-Mantel-Haenszel M^2 = 2.482, df = 2, p-value = 0.2891\n\n\n\n\n\nThe vcdExtra package provides results for the generalized CMH test, for each of the three model it outputs the Chi-square value and the respective p-values. Flexible data input methods available: table or formula (aggregated level data in a data frame).\n\nlibrary(vcdExtra)\n\nLoading required package: vcd\n\n\nLoading required package: grid\n\n\nLoading required package: gnm\n\n\n\nAttaching package: 'vcdExtra'\n\n\nThe following object is masked from 'package:dplyr':\n\n    summarise\n\n# Formula: Freq ~ X + Y | K\nCMHtest(Freq ~ TRTP + SEX | AGEGR1 , data=data, overall=TRUE) \n\n$`AGEGR1:<65`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:<65 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.33168  1 0.56467\nrmeans  Row mean scores differ 1.52821  2 0.46575\ncmeans  Col mean scores differ 0.33168  1 0.56467\ngeneral    General association 1.52821  2 0.46575\n\n\n$`AGEGR1:>80`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:>80 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.39433  1 0.53003\nrmeans  Row mean scores differ 3.80104  2 0.14949\ncmeans  Col mean scores differ 0.39433  1 0.53003\ngeneral    General association 3.80104  2 0.14949\n\n\n$`AGEGR1:65-80`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:65-80 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.52744  1 0.46768\nrmeans  Row mean scores differ 0.62921  2 0.73008\ncmeans  Col mean scores differ 0.52744  1 0.46768\ngeneral    General association 0.62921  2 0.73008\n\n\n$ALL\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    Overall tests, controlling for all strata \n\n                 AltHypothesis      Chisq Df    Prob\ncor        Nonzero correlation 0.00086897  1 0.97648\nrmeans  Row mean scores differ      2.482  2 0.28909\ncmeans  Col mean scores differ 0.00086897  1 0.97648\ngeneral    General association      2.482  2 0.28909\n\n\n\n\n\nTo get the M-H common odds ratio and the homogeneity test, the epiDisplay package can be used.\n\nlibrary(epiDisplay) \nmhor(x,y,k, graph = FALSE)\n\n\n\nTo tackle the issue with sparse data it is recommended that a use of solve() is replaced with MASS::ginv. This was implemented in the forked version of vcdExtra which can be installed from here:\n\ndevtools::install_github(\"mstackhouse/vcdExtra\")\n\nHowever, also the forked version for the vcdExtra package works only until a certain level of sparsity. In case of our data, it still works if the data are stratified by the pooled Site ID (SITEGR1 - 11 unique values) whereas using the unpooled Site ID (SITEID - 17 unique values) also throws an error. Note: this version is not up to date and sometimes calculates degrees of freedom incorrectly."
    +    "text": "Details of how to implement the methods in the discussed software are available below:\nR:\n\nCheck how to perform this analysis in R here\n\nSAS & StatXact:\n\nCheck how to perform this analysis in SAS & StatXact here"
       },
       {
    -    "objectID": "R/cmh.html#available-r-packages",
    -    "href": "R/cmh.html#available-r-packages",
    -    "title": "CMH Test",
    +    "objectID": "Comp/r-sas_negbin.html",
    +    "href": "Comp/r-sas_negbin.html",
    +    "title": "R vs SAS: Negative Binomial Regression",
         "section": "",
    -    "text": "We did not find any R package that delivers all the same measures as SAS at once. Therefore, we tried out multiple packages:\n\n\n\n\n\n\n\n\nPackage\nGeneral Association\nRow Means Differ\nNonzero Correlation\nM-H Odds Ratio\nHomogeneity Test\nNote\n\n\n\n\nstats::mantelhaen.test()\n✅\n❌\n❌\n✅\n❌\nWorks well for 2x2xK\n\n\nvcdExtra::CMHtest()\n✅\n✅\n✅\n❌\n❌\nProblems with sparsity, potential bug\n\n\nepiDisplay::mhor()\n❌\n❌\n❌\n✅\n✅\nOR are limited to 2x2xK design"
    +    "text": "Comparison of implementations and results between SAS vs R for negative binomial regression for count data.\n\n\n\n\n\n\n\n\n\n\n\nMethodologies\n\n\n\n\n\n\nNegative binomial regression\n\n\n\n\n\n\n\n\n\n\n\n\nTechnical implementations\n\n\n\n\n\n\nSAS: PROC GENMOD with option: DIST = NB or DIST = NEGBIN\nR: MASS::glm.nb\n\n\n\n\n\n\n\n\n\n\nBelow are summary of findings from a numerical comparison using dummy data, where possible we specify the same algorithm in R and SAS (see section Numerical Comparisons for details).\n\n\n\n\n\n\nNegative binomial regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm.nb in R vs PROC GENMOD procedure in SAS, for parameter and lsmeans estimates, confidence intervals and p-values after manually adjusting the estimated variance-covariance matrix in R. For the dispersion parameter the MLEs also match, however discrepancies in the confidence intervals are observed.\n\n\n\nIn the following sections the implementations will be compared in tabular fashion followed by a numerical comparison using dummy data."
       },
       {
    -    "objectID": "R/cmh.html#data-used",
    -    "href": "R/cmh.html#data-used",
    -    "title": "CMH Test",
    +    "objectID": "Comp/r-sas_negbin.html#goal",
    +    "href": "Comp/r-sas_negbin.html#goal",
    +    "title": "R vs SAS: Negative Binomial Regression",
         "section": "",
    -    "text": "We will use the CDISC Pilot data set, which is publicly available on the PHUSE Test Data Factory repository. We applied very basic filtering conditions upfront (see below) and this data set served as the basis of the examples to follow.\n\n\n# A tibble: 231 × 36\n   STUDYID SITEID SITEGR1 USUBJID TRTSDT     TRTEDT     TRTP  TRTPN   AGE AGEGR1\n   <chr>   <chr>  <chr>   <chr>   <date>     <date>     <chr> <dbl> <dbl> <chr> \n 1 CDISCP… 701    701     01-701… 2014-01-02 2014-07-02 Plac…     0    63 <65   \n 2 CDISCP… 701    701     01-701… 2012-08-05 2012-09-01 Plac…     0    64 <65   \n 3 CDISCP… 701    701     01-701… 2013-07-19 2014-01-14 Xano…    81    71 65-80 \n 4 CDISCP… 701    701     01-701… 2014-03-18 2014-03-31 Xano…    54    74 65-80 \n 5 CDISCP… 701    701     01-701… 2014-07-01 2014-12-30 Xano…    81    77 65-80 \n 6 CDISCP… 701    701     01-701… 2013-02-12 2013-03-09 Plac…     0    85 >80   \n 7 CDISCP… 701    701     01-701… 2014-01-01 2014-07-09 Xano…    54    68 65-80 \n 8 CDISCP… 701    701     01-701… 2012-09-07 2012-09-16 Xano…    54    81 >80   \n 9 CDISCP… 701    701     01-701… 2012-11-30 2013-01-23 Xano…    54    84 >80   \n10 CDISCP… 701    701     01-701… 2014-03-12 2014-09-09 Plac…     0    52 <65   \n# ℹ 221 more rows\n# ℹ 26 more variables: AGEGR1N <dbl>, RACE <chr>, RACEN <dbl>, SEX <chr>,\n#   ITTFL <chr>, EFFFL <chr>, COMP24FL <chr>, AVISIT <chr>, AVISITN <dbl>,\n#   VISIT <chr>, VISITNUM <dbl>, ADY <dbl>, ADT <date>, PARAMCD <chr>,\n#   PARAM <chr>, PARAMN <dbl>, AVAL <dbl>, ANL01FL <chr>, DTYPE <chr>,\n#   AWRANGE <chr>, AWTARGET <dbl>, AWTDIFF <dbl>, AWLO <dbl>, AWHI <dbl>,\n#   AWU <chr>, QSSEQ <dbl>"
    +    "text": "Comparison of implementations and results between SAS vs R for negative binomial regression for count data."
       },
       {
    -    "objectID": "R/cmh.html#example-code",
    -    "href": "R/cmh.html#example-code",
    -    "title": "CMH Test",
    +    "objectID": "Comp/r-sas_negbin.html#scope",
    +    "href": "Comp/r-sas_negbin.html#scope",
    +    "title": "R vs SAS: Negative Binomial Regression",
         "section": "",
    -    "text": "This is included in a base installation of R, as part of the stats package. Requires inputting data as a table or as vectors.\n\nmantelhaen.test(x = data$TRTP, y = data$SEX, z = data$AGEGR1)\n\n\n    Cochran-Mantel-Haenszel test\n\ndata:  data$TRTP and data$SEX and data$AGEGR1\nCochran-Mantel-Haenszel M^2 = 2.482, df = 2, p-value = 0.2891\n\n\n\n\n\nThe vcdExtra package provides results for the generalized CMH test, for each of the three model it outputs the Chi-square value and the respective p-values. Flexible data input methods available: table or formula (aggregated level data in a data frame).\n\nlibrary(vcdExtra)\n\nLoading required package: vcd\n\n\nLoading required package: grid\n\n\nLoading required package: gnm\n\n\n\nAttaching package: 'vcdExtra'\n\n\nThe following object is masked from 'package:dplyr':\n\n    summarise\n\n# Formula: Freq ~ X + Y | K\nCMHtest(Freq ~ TRTP + SEX | AGEGR1 , data=data, overall=TRUE) \n\n$`AGEGR1:<65`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:<65 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.33168  1 0.56467\nrmeans  Row mean scores differ 1.52821  2 0.46575\ncmeans  Col mean scores differ 0.33168  1 0.56467\ngeneral    General association 1.52821  2 0.46575\n\n\n$`AGEGR1:>80`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:>80 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.39433  1 0.53003\nrmeans  Row mean scores differ 3.80104  2 0.14949\ncmeans  Col mean scores differ 0.39433  1 0.53003\ngeneral    General association 3.80104  2 0.14949\n\n\n$`AGEGR1:65-80`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:65-80 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.52744  1 0.46768\nrmeans  Row mean scores differ 0.62921  2 0.73008\ncmeans  Col mean scores differ 0.52744  1 0.46768\ngeneral    General association 0.62921  2 0.73008\n\n\n$ALL\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    Overall tests, controlling for all strata \n\n                 AltHypothesis      Chisq Df    Prob\ncor        Nonzero correlation 0.00086897  1 0.97648\nrmeans  Row mean scores differ      2.482  2 0.28909\ncmeans  Col mean scores differ 0.00086897  1 0.97648\ngeneral    General association      2.482  2 0.28909\n\n\n\n\n\nTo get the M-H common odds ratio and the homogeneity test, the epiDisplay package can be used.\n\nlibrary(epiDisplay) \nmhor(x,y,k, graph = FALSE)\n\n\n\nTo tackle the issue with sparse data it is recommended that a use of solve() is replaced with MASS::ginv. This was implemented in the forked version of vcdExtra which can be installed from here:\n\ndevtools::install_github(\"mstackhouse/vcdExtra\")\n\nHowever, also the forked version for the vcdExtra package works only until a certain level of sparsity. In case of our data, it still works if the data are stratified by the pooled Site ID (SITEGR1 - 11 unique values) whereas using the unpooled Site ID (SITEID - 17 unique values) also throws an error. Note: this version is not up to date and sometimes calculates degrees of freedom incorrectly."
    +    "text": "Methodologies\n\n\n\n\n\n\nNegative binomial regression\n\n\n\n\n\n\n\n\n\n\n\n\nTechnical implementations\n\n\n\n\n\n\nSAS: PROC GENMOD with option: DIST = NB or DIST = NEGBIN\nR: MASS::glm.nb"
       },
       {
    -    "objectID": "R/ci_for_prop.html",
    -    "href": "R/ci_for_prop.html",
    -    "title": "Confidence Intervals for Proportions in R",
    +    "objectID": "Comp/r-sas_negbin.html#findings",
    +    "href": "Comp/r-sas_negbin.html#findings",
    +    "title": "R vs SAS: Negative Binomial Regression",
         "section": "",
    -    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (different subjects in each of the 2 groups), or can be matched (the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more information about these methods, including which performs better in different scenarios see Five Confidence Intervals for Proportions That You Should Know about1."
    +    "text": "Below are summary of findings from a numerical comparison using dummy data, where possible we specify the same algorithm in R and SAS (see section Numerical Comparisons for details).\n\n\n\n\n\n\nNegative binomial regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm.nb in R vs PROC GENMOD procedure in SAS, for parameter and lsmeans estimates, confidence intervals and p-values after manually adjusting the estimated variance-covariance matrix in R. For the dispersion parameter the MLEs also match, however discrepancies in the confidence intervals are observed.\n\n\n\nIn the following sections the implementations will be compared in tabular fashion followed by a numerical comparison using dummy data."
       },
       {
    -    "objectID": "R/ci_for_prop.html#introduction",
    -    "href": "R/ci_for_prop.html#introduction",
    -    "title": "Confidence Intervals for Proportions in R",
    -    "section": "",
    -    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (different subjects in each of the 2 groups), or can be matched (the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more information about these methods, including which performs better in different scenarios see Five Confidence Intervals for Proportions That You Should Know about1."
    +    "objectID": "Comp/r-sas_negbin.html#how-to-read-the-tables",
    +    "href": "Comp/r-sas_negbin.html#how-to-read-the-tables",
    +    "title": "R vs SAS: Negative Binomial Regression",
    +    "section": "How to read the tables:",
    +    "text": "How to read the tables:\nLet’s walk through the conclusions for Table 1:\n\nSAS and R use different parameterizations of the negative binomial\nSAS and R use different likelihood optimization algorithms\nThere are differences in the estimation of the variance-covariance matrix, in particular the covariance between dispersion/scale parameter and model coefficients. It is however possible to obtain the SAS variance-covariance matrix in R.\nConvergence criteria are not generally identical in SAS and R.\nCI estimation methods are by default not identical but by using alternative confint function in R SAS method can be reproduced\n\nMethods for hypothesis testing for model coefficients are equivalent in SAS and R.\nLeast-square or marginal means are not directly available in R but equivalent estimation as in SAS is possible with additional packages\n\n\n\n\nTable 1: Negative binomial regression in SAS vs R\n\n\n\n\n\n\n\n\n\n\n\nAttribute\nSAS  PROC GENMOD\nR MASS::glm.nb\nNote\n\n\n\n\nNegative binomial parameterization\nVariance of the negative binomial is given by \\(\\mu + k\\mu^2\\) and the dispersion parameter k is estimated. Overdispersion increases as k goes to infinity.\nVariance of the negative binomial is given by \\(\\mu + \\frac{\\mu^2}{\\theta}\\) and the scale parameter theta is estimated. Overdispersion increases as theta goes to zero.\n\\(k=\\frac{1}{\\theta}\\)\n\n\nLikelihood optimization algorithm\nRidge-stabilized Newton-Raphson algorithm\nIteratively reweighted least squares (IWLS)\nIt seems SAS performs simultaneous optimization on all parameters (i.e. including dispersion). R uses an alternating process, where glm coefficients are fitted given a fixed theta and then theta is estimated given fixed coefficients until convergence.\n\n\nEstimation of variance-covariance matrix\nObserved (rather than expected) fisher information is used for calculation of standard errors of coefficients, which allows for non-zero covariance between coefficients and dispersion parameter.\nExpected fisher information is used for calculation of standard errors of coefficients, so covariance between coefficients and dispersion parameter is zero (which is asymptotically correct). However identical vcov matrix as in SAS can be obtained “post-hoc”.\nAs shown in the numerical example below in R the variance-covariance matrix corresponding to the PROC GENMOD estimation can be obtained based on the outputs from MASS::glm.nb with the glm.nb.cov function. The “correct” standard errors, confidence intervals and p-values can then be manually calculated based on the new covariance matrix.\n\n\nConvergence criteria\nThe iterations are considered to have converged when the maximum change in the parameter estimates between iteration steps is less than the value specified in CONVERGE option (default: CONVERGENCE = 1E-4)\nBased on relative difference between deviance, specified through epsilon argument in glm.control (default: epsilon = 1e-8).\nPROC GENMOD also checks for relative Hessian convergence and throws a warning if this is larger than the value provided in the CONVH option (default: CONVH = 1E-4 ).\n\n\nConfidence interval (CI) estimation method\nBy default asymptotic Wald CIs are estimated. Profile likelihood CI is estimated if option LRCI is provided.\nconfint function will estimate profile likelihood CIs, Wald CIs can be obtained by using confint.default\nNote that by default confidence intervals can differ even if same method is used if vcov matrix in R is not adjusted as explained above.\n\n\nHypothesis tests for regression coefficients\nAsymptotic Wald test\nAsymptotic Wald test\nPROC GENMOD reports Wald Chi-square statistic, while MASS::glm.nb reports the Z statistic, however the p-values are equivalent. Note that by default test results will differ if vcov matrix in R is not adjusted as explained above.\n\n\nEstimation of least-square/marginal means\nCalculation through lsmeans statement assumes that for classification effects the groups are balanced. OM option can be provided to obtain lsmeans that are using the observed proportions in the data\nNot implemented as part of MASS::glm.nb but can be obtained using emmeans package.\nIn R marginal means can be obtained using the emmeans::emmeans function, setting argument weights = \"equal\" corresponds to the default option in SAS, while weights = \"proportional\" gives the means proportional to observed data"
       },
       {
    -    "objectID": "R/ci_for_prop.html#data-used",
    -    "href": "R/ci_for_prop.html#data-used",
    -    "title": "Confidence Intervals for Proportions in R",
    -    "section": "Data used",
    -    "text": "Data used\nThe adcibc data stored here was used in this example, creating a binary treatment variable trt taking the values of ACT or PBO and a binary response variable resp taking the values of Yes or No. For this example, a response is defined as a score greater than 4.\nThe below shows that for the Actual Treatment, there are 36 responders out of 154 subjects = 0.234 (23.4% responders).\n\n\n# A tibble: 4 × 3\n# Groups:   trt [2]\n  trt   resp      n\n  <chr> <chr> <int>\n1 ACT   No      118\n2 ACT   Yes      36\n3 PBO   No       65\n4 PBO   Yes      12"
    +    "objectID": "Comp/r-sas_negbin.html#prerequisites-r-packages",
    +    "href": "Comp/r-sas_negbin.html#prerequisites-r-packages",
    +    "title": "R vs SAS: Negative Binomial Regression",
    +    "section": "Prerequisites: R packages",
    +    "text": "Prerequisites: R packages\nIn order to run these analyses we need to load a few packages.\n\nlibrary(MASS)\nlibrary(dplyr)\n\n\nAttaching package: 'dplyr'\n\n\nThe following object is masked from 'package:MASS':\n\n    select\n\n\nThe following objects are masked from 'package:stats':\n\n    filter, lag\n\n\nThe following objects are masked from 'package:base':\n\n    intersect, setdiff, setequal, union\n\nlibrary(emmeans)\n\nWelcome to emmeans.\nCaution: You lose important information if you filter this package's results.\nSee '? untidy'\n\n\nWe also define the glm_nb_cov function to obtain the SAS variance-covariance matrix in R from here.\n\n## Helper function to compute the variance from negative binomial regression\n## This matches with variance estimated from SAS\nglm_nb_cov <- function(mod) {\n  # given a model fitted by glm.nb in MASS, this function returns a variance covariance matrix for the\n  # regression coefficients and dispersion parameter, without assuming independence between these\n  # note that the model must have been fitted with x=TRUE argument so that design matrix is available\n  \n  # formulae based on p23-p24 of\n  # http://pointer.esalq.usp.br/departamentos/lce/arquivos/aulas/2011/LCE5868/OverdispersionBook.pdf\n  # and http://www.math.mcgill.ca/~dstephens/523/Papers/Lawless-1987-CJS.pdf\n  \n  # lintr: off\n  # please rm -- variable not used!\n  # k <- mod$theta\n  # lintr: on\n  # p is number of regression coefficients\n  p <- dim(vcov(mod))[1]\n  \n  # construct observed information matrix\n  obsInfo <- array(0, dim = c(p + 1, p + 1))\n  \n  # first calculate top left part for regression coefficients\n  for (i in 1:p) {\n    for (j in 1:p) {\n      obsInfo[i, j] <- sum((1 + mod$y / mod$theta) * mod$fitted.values * mod$x[, i] * mod$x[, j] /\n                             (1 + mod$fitted.values / mod$theta)^2)\n    }\n  }\n  \n  # information for dispersion parameter\n  obsInfo[(p + 1), (p + 1)] <- -sum(trigamma(mod$theta + mod$y) - trigamma(mod$theta) -\n                                      1 / (mod$fitted.values + mod$theta) + (mod$theta + mod$y) / (mod$theta + mod$fitted.values)^2 -\n                                      1 / (mod$fitted.values + mod$theta) + 1 / mod$theta)\n  \n  # covariance between regression coefficients and dispersion\n  for (i in 1:p) {\n    obsInfo[(p + 1), i] <- -sum(((mod$y - mod$fitted.values) * mod$fitted.values /\n                                   ((mod$theta + mod$fitted.values)^2)) * mod$x[, i])\n    obsInfo[i, (p + 1)] <- obsInfo[(p + 1), i]\n  }\n  \n  # return variance covariance matrix\n  solve(obsInfo, tol = 1e-20)\n}"
       },
       {
    -    "objectID": "R/ci_for_prop.html#packages",
    -    "href": "R/ci_for_prop.html#packages",
    -    "title": "Confidence Intervals for Proportions in R",
    -    "section": "Packages",
    -    "text": "Packages\nThe {cardx} package is an extension of the {cards} package, providing additional functions to create Analysis Results Data Objects (ARDs)1. It was developed as part of {NEST} and pharmaverse. This package requires the binary endpoint to be a logical (TRUE/FALSE) vector or a numeric/integer coded as (0, 1) with 1 (TRUE) being the success you want to calculate the confidence interval for.\nIf calculating the CI for a difference in proportions, the package requires both the response and the treatment variable to be numeric/integer coded as (0, 1) (or logical vector).\nInstead of the code presented below, you can use ard_categorical_ci(data, variables=resp, method ='wilson') for example. This invokes the code below but returns an analysis results dataset format as the output. Methods included are waldcc, wald, clopper-pearson, wilson, wilsoncc, strat_wilson, strat_wilsoncc, agresti-coull and jeffreys.\nCode example: proportion_ci_clopper_pearson(<resp_var>,conf.level=0.95) %>%    as_tibble()\nExample data format needed for {cardx} for a single proportion CI\n\n\n [1] 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0\n\n\nThe {PropCIs} package produces CIs for methods such as Blaker’s exact method and Midp which aren’t available in {cardx} but are available in SAS. We found results agreed with SAS to the 5th decimal place. The package also calculates CIs for Clopper-Pearson, Wald, Wilson, Agresti-coull and these align to results obtained in cardx to at least the 7th decimal place. The {PropsCIs} package requires just the number of events (numerator number of successes) & total number of subjects (denominator) as an input dataset. Given Blaker and Midp are rarely used in practice, and {PropsCIs} isn’t a package commonly downloaded from CRAN, further detail is not provided here.\nCode example for Clopper-pearson:\nexactci(x=<count of successes> , n=<Total>, conf.level=0.95)\nCode example for Mid P method:\nmidPci(x=<count of successes> , n=<Total>, conf.level=0.95)\nCode example for Blaker’s exact method:\nblakerci(x=<count of successes> , n=<Total>, conf.level=0.95, tolerance=1e-05)"
    +    "objectID": "Comp/r-sas_negbin.html#dummy-data",
    +    "href": "Comp/r-sas_negbin.html#dummy-data",
    +    "title": "R vs SAS: Negative Binomial Regression",
    +    "section": "Dummy data",
    +    "text": "Dummy data\nA dummy dataset is simulated, including\n\n100 subjects;\n\\(grp\\): a dummy variable with 1:1 subject assignment to treatment (\\(grp = 1\\)) vs placebo (\\(grp = 0\\)); note, variable \\(grpc\\) is a character version of \\(grp\\), which takes the value of “Trt” or “Plb”.\n\\(x1\\): a continuous variable which follows a normal distribution of mean of 0 and sd of 1;\n\\(x2\\): a categorical variable which take the value of “A” or “B” or “C” with a probability of 0.3, 0.2, 0.5, respectively.\n\\(logtime\\): An offset for the calculation of rates (e.g time in years) on the log-scale\n\\(y\\): a negative binomial outcome giving the event counts;\n\nThe dummy dataset is saved as a csv file, and then the csv file is read into SAS.\n\nN = 100\n\n# set seed for replication\nset.seed(123)\n\n# Treatment Group; 1:1 ratio\ngrp <- rep(c(0,1),each= N/2)\n\n# Covariates (one continuous; one categorical)\nx1 <- rnorm(N)\nx2 <- factor(sample(LETTERS[1:3], N, replace = TRUE, \n                    prob=c(0.3, 0.2, 0.5)))\n\n# Offset\nlogtime <- log(runif(N, 1, 2))\n\n# Model parameter assumption\nbeta0 = 0.6\nbetaTrt = -0.5\nbeta1 = 0.25\nbeta2 = c(-0.1, 0.2)\ntheta = 1/2\n\n\n# Dummy dataset\ndf <- data.frame(grp,x1, x2, logtime) %>% \n   mutate(log_rate = \n            case_when(x2 == \"A\" ~ beta0 + betaTrt*grp + beta1*x1 + logtime,\n                      x2 == \"B\" ~ beta0 + betaTrt*grp + beta1*x1 + beta2[1] + logtime, \n                      x2 == \"C\" ~ beta0 + betaTrt*grp + beta1*x1 + beta2[2] + logtime),\n          y = rnegbin(N, mu = exp(log_rate), theta = theta),\n          grpc = factor(case_when(grp==0 ~\"Plb\",\n                                 grp==1 ~\"Trt\")))\n\n# save the dummy dataset to be imported in SAS\n# write.csv(df, file = \"df_dummy_negbin.csv\")"
       },
       {
    -    "objectID": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-single-proportion-using-cardx",
    -    "href": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-single-proportion-using-cardx",
    -    "title": "Confidence Intervals for Proportions in R",
    -    "section": "Methods for Calculating Confidence Intervals for a single proportion using cardx",
    -    "text": "Methods for Calculating Confidence Intervals for a single proportion using cardx\nFor more technical derivation and reasons for use of each of the methods listed below, see the corresponding SAS page.\nLet’s start by calculating a Confidence interval for the proportion of successes observed in the Active Treatment group (a single sample).\n\nClopper-Pearson (Exact or binomial CI) Method\nClopper-Pearson Exact CI is one of the most popular methods, it is often good for small sample sizes when the proportion is not close to the tails (0,1), but it can be too conservative (too wide an interval compared to the interval containing the true population proportion 95% of the time).\nThe cardx package calculates the Clopper-Pearson score by calling stats::binom.test() function.\n\nproportion_ci_clopper_pearson(act2,conf.level=0.95) %>% \n  as_tibble()\n\n# A tibble: 1 × 10\n      N conf.level estimate statistic  p.value parameter conf.low conf.high\n  <int>      <dbl>    <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl>\n1   154       0.95    0.234        36 2.21e-11       154    0.169     0.309\n# ℹ 2 more variables: method <chr>, alternative <chr>\n\n\n\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nIn large random samples from independent trials, the sampling distribution of proportions approximately follows the normal distribution. The expectation of a sample proportion is the corresponding population proportion. Therefore, based on a sample of size \\(n\\), a \\((1-\\alpha)\\%\\) confidence interval for population proportion can be calculated using normal approximation as follows:\n\\(p\\approx \\hat p \\pm z_\\alpha \\sqrt{\\hat p(1-\\hat p)}/{n}\\), where \\(\\hat p\\) is the sample proportion, \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\), and \\(\\sqrt{\\hat p(1-\\hat p)}/{n}\\) is the standard error.\nFor more technical information see the corresponding SAS page.\n\nExample code\nThe following code calculates a confidence interval for a binomial proportion using normal approximation equation manually. This is replicated exactly using the cardx::proportion_ci_wald function which also allows the continuity correction to be applied.\n\n    # sample proportion by trt\nsummary <- adcibc %>% \n           filter(trt==\"ACT\") %>% \n           group_by(resp) %>% \n           tally()  %>% \n           ungroup() %>% \n           mutate(total=sum(n)) %>% \n           mutate(p=n/total)\n\n    # Calculate standard error and 95% wald confidence intervals for population proportion\nwaldci <-summary %>% \n         filter(resp==\"Yes\") %>% \n         mutate(se=sqrt(p*(1-p)/total)) %>% \n         mutate(lower_ci=(p-qnorm(1-0.05/2)*se)) %>% \n         mutate(upper_ci=(p+qnorm(1-0.05/2)*se)) \nwaldci  \n\n# A tibble: 1 × 7\n  resp      n total     p     se lower_ci upper_ci\n  <chr> <int> <int> <dbl>  <dbl>    <dbl>    <dbl>\n1 Yes      36   154 0.234 0.0341    0.167    0.301\n\n#cardx package Wald method without continuity correction\nproportion_ci_wald(act2,conf.level=0.95,correct=FALSE) %>% \n  as_tibble()\n\n# A tibble: 1 × 6\n      N estimate conf.low conf.high conf.level method                           \n  <int>    <dbl>    <dbl>     <dbl>      <dbl> <glue>                           \n1   154    0.234    0.167     0.301       0.95 Wald Confidence Interval without…\n\n#cardx package Wald method with continuity correction\nproportion_ci_wald(act2,conf.level=0.95,correct=TRUE) %>% \n  as_tibble()\n\n# A tibble: 1 × 6\n      N estimate conf.low conf.high conf.level method                           \n  <int>    <dbl>    <dbl>     <dbl>      <dbl> <glue>                           \n1   154    0.234    0.164     0.304       0.95 Wald Confidence Interval with co…\n\n\n\n\n\nWilson Method (Also known as the Score method or the Altman, Newcombe method3 )\nThe cardx package calculates the Wilson (score) method by calling stats::prop.test() function. This method is often used as a compromise between the Clopper-Pearson and the Wald given it was found to be accurate for most parameter values (even those close to 0 and 1), and it does not suffer from being over-conservative. For more technical information see the corresponding SAS page.\nThe package also contains a function for proportion_ci_strat_wilson() which calculates the stratified Wilson CIs for unequal proportions as described on page 47 here.\n\n#cardx package Wilson method without continuity correction\nproportion_ci_wilson(act2,conf.level=0.95,correct=FALSE) %>% \n  as_tibble()\n\n# A tibble: 1 × 10\n      N conf.level estimate statistic  p.value parameter conf.low conf.high\n  <int>      <dbl>    <dbl>     <dbl>    <dbl>     <int>    <dbl>     <dbl>\n1   154       0.95    0.234      43.7 3.90e-11         1    0.174     0.307\n# ℹ 2 more variables: method <glue>, alternative <chr>\n\n#cardx package Wilson method with continuity correction\nproportion_ci_wilson(act2,conf.level=0.95,correct=TRUE) %>% \n  as_tibble()\n\n# A tibble: 1 × 10\n      N conf.level estimate statistic  p.value parameter conf.low conf.high\n  <int>      <dbl>    <dbl>     <dbl>    <dbl>     <int>    <dbl>     <dbl>\n1   154       0.95    0.234      42.6 6.70e-11         1    0.171     0.310\n# ℹ 2 more variables: method <glue>, alternative <chr>\n\n\n\n\nAgresti-Coull Method\nThe cardx package calculates the Agresti-Coull method using the equation from the published method by Alan Agresti & Brent Coull based on adding 2 successes and 2 failures before computing the wald CI. The CI is truncated, when it overshoots the boundary (<0 or >1).\n\n#cardx package agresti_coull method \nproportion_ci_agresti_coull(act2,conf.level=0.95) %>% \n  as_tibble()\n\n# A tibble: 1 × 6\n      N estimate conf.low conf.high conf.level method                           \n  <int>    <dbl>    <dbl>     <dbl>      <dbl> <chr>                            \n1   154    0.234    0.174     0.307       0.95 Agresti-Coull Confidence Interval\n\n\n\n\nJeffreys Method\nJeffreys method is a particular type of Bayesian Highest Probability Density (HPD) Method. For proportions, the beta distribution is generally used for the prior, which consists of two parameters alpha and beta. Setting alpha=beta=0.5 is called Jeffrey’s prior. NOTE: if you want to use any other priors, you can use binom.bayes which estimates a credible interval for proportions.\n\n#cardx package jeffreys method \nproportion_ci_jeffreys(act2,conf.level=0.95) %>% \n  as_tibble()\n\n# A tibble: 1 × 6\n      N estimate conf.low conf.high conf.level method           \n  <int>    <dbl>    <dbl>     <dbl>      <dbl> <glue>           \n1   154    0.234    0.172     0.305       0.95 Jeffreys Interval"
    +    "objectID": "Comp/r-sas_negbin.html#negative-binomial-regression-1",
    +    "href": "Comp/r-sas_negbin.html#negative-binomial-regression-1",
    +    "title": "R vs SAS: Negative Binomial Regression",
    +    "section": "Negative binomial regression",
    +    "text": "Negative binomial regression\n\n\n\n\n\n\nConclusion for negative binomial regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm.nb in R vs PROC GENMOD procedure in SAS, for parameters and lsmeans estimates, confidence intervals and p-values after manually adjusting the estimated variance-covariance matrix in R. For the dispersion parameter the MLEs also match, however discrepancies in the confidence intervals are observed.\n\n\n\n\nNegative binomial regression in SAS\nAfter importing the dummy dataset we can run the negative binomial regression in SAS using `PROC GENMOD. We estimate the model parameters and lsmeans for the treatment arms using both the default and OM weights.\n\nproc genmod data=df;\n    class GRPC (ref='Plb') X2 (ref='A');\n    model y = GRPC x1 x2 / dist=negbin link=log offset=logtime;\n    lsmeans GRPC /cl;\n    lsmeans GRPC /cl OM;\nrun;\n\nBelow is a screenshot of output tables summarizing coefficient estimates and lsmeans."
       },
       {
    -    "objectID": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-matched-pair-proportion",
    -    "href": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-matched-pair-proportion",
    -    "title": "Confidence Intervals for Proportions in R",
    -    "section": "Methods for Calculating Confidence Intervals for a matched pair proportion",
    -    "text": "Methods for Calculating Confidence Intervals for a matched pair proportion\nWhen you have 2 measurements on the same subject, the 2 sets of measures are not independent and you have matched pair of responses.\nIt is not usual to calculate the proportions separately for these responses, and then take a difference, instead other statistical methods such as odds ratios, risk ratios and confidence intervals for those statistics are used."
    +    "objectID": "Comp/r-sas_negbin.html#negative-binomial-regression-in-r",
    +    "href": "Comp/r-sas_negbin.html#negative-binomial-regression-in-r",
    +    "title": "R vs SAS: Negative Binomial Regression",
    +    "section": "Negative binomial regression in R",
    +    "text": "Negative binomial regression in R\nLets now try to reproduce the results in R using MASS::glm.nb.\n\nfit <- glm.nb(y ~ grpc + x1 + x2 + offset(logtime), data = df, x = TRUE)\n\n# model coefficients summary\nsummary(fit)$coefficients\n\n               Estimate Std. Error    z value   Pr(>|z|)\n(Intercept)  0.72652157  0.3507054  2.0716007 0.03830269\ngrpcTrt     -0.61401736  0.3414815 -1.7980982 0.07216145\nx1           0.25663164  0.1890455  1.3575129 0.17461831\nx2B         -0.37406342  0.5069487 -0.7378723 0.46059203\nx2C         -0.04999267  0.3916689 -0.1276401 0.89843376\n\n\nWe can see that while the estimates are exactly matching those in SAS, the standard errors are slightly smaller. This is a result of the difference in covariance estimation mentioned above. To obtain exactly the same results as in SAS we need to re-estimate the covariance matrix using the glm_nb_cov function we defined earlier. Note that to use this function with the fitted results we needed to specify x = TRUE in the glm.nb function so that the design matrix is available.\n\nsigma_hat <- glm_nb_cov(fit)\n\n## recalculate confidence intervals, and p-values\ncoef_est <- coef(fit)\ncoef_se <- sqrt(diag(sigma_hat)[1:5])\ncoef_lower <- coef_est - qnorm(0.975) * coef_se\ncoef_upper <- coef_est + qnorm(0.975) * coef_se\nzstat <- coef_est/coef_se\npval <- 2 * (1-pnorm(abs(zstat)))\nnew_summary <- cbind(coef_est, coef_se, coef_lower, coef_upper, zstat, pval)\ncolnames(new_summary) <- c(\"Estimate\", \"Std. Error\", \"CI_lower\", \"CI_upper\", \"z value\", \"Pr(>|z|)\")\nrownames(new_summary) <- rownames(summary(fit)$coefficients)\nnew_summary\n\n               Estimate Std. Error    CI_lower   CI_upper    z value   Pr(>|z|)\n(Intercept)  0.72652157  0.3517882  0.03702942 1.41601371  2.0652246 0.03890176\ngrpcTrt     -0.61401736  0.3479606 -1.29600763 0.06797291 -1.7646174 0.07762809\nx1           0.25663164  0.2066499 -0.14839474 0.66165803  1.2418667 0.21428575\nx2B         -0.37406342  0.5073695 -1.36848936 0.62036253 -0.7372604 0.46096404\nx2C         -0.04999267  0.4013463 -0.83661692 0.73663158 -0.1245624 0.90086997\n\n\nNow the estimates, standard errors, 95% confidence interval limits and p-values are exactly matching those in SAS up to the 4th digit. We can also provide an estimate and CI for the dispersion parameter:\n\n# estimate and 95%-CI for k = 1/theta\ntheta_est <- fit$theta\ntheta_se <- sqrt(sigma_hat[6, 6])\ntheta_est_ci <- c(theta_est, theta_est - qnorm(0.975) * theta_se, theta_est + qnorm(0.975) * theta_se)\n1/theta_est_ci[c(1, 3, 2)]\n\n[1] 2.370525 1.672211 4.070264\n\n\nWe see that while the point estimate is the same as in SAS, the CI for the dispersion does not match, most likely due to the different parameterizations used by SAS and R.\nFinally we can replicate the estimation of lsmeans in SAS via the emmeans package. Note that we need to supply the re-estimated covariance matrix, but only provide the rows and columns for the model coefficients without the dispersion parameter as emmeans does not need the latter.\n\n# lsmeans with weights = equal, equivalent to SAS default\nlsmean1 <- emmeans(fit, ~ grpc, data=df, vcov. = sigma_hat[1:5, 1:5], weights = \"equal\", offset = 0)\nlsmean1\n\n grpc   emmean    SE  df asymp.LCL asymp.UCL\n Plb   0.60837 0.245 Inf     0.128     1.088\n Trt  -0.00565 0.268 Inf    -0.531     0.519\n\nResults are averaged over the levels of: x2 \nResults are given on the log (not the response) scale. \nConfidence level used: 0.95 \n\n# lsmeans with weights = proportional, equivalent to SAS OM option\nlsmean2 <- emmeans(fit, ~ grpc, data=df, vcov. = sigma_hat[1:5, 1:5], weights = \"proportional\", offset = 0)\nlsmean2\n\n grpc emmean    SE  df asymp.LCL asymp.UCL\n Plb  0.6527 0.237 Inf     0.188     1.117\n Trt  0.0386 0.250 Inf    -0.451     0.528\n\nResults are averaged over the levels of: x2 \nResults are given on the log (not the response) scale. \nConfidence level used: 0.95 \n\n\nEstimates and CIs are exactly matching those in SAS for both of the options. Finally we can also obtain the z statistic and corresponding p-values:\n\ntest(lsmean1)\n\n grpc   emmean    SE  df z.ratio p.value\n Plb   0.60837 0.245 Inf   2.484  0.0130\n Trt  -0.00565 0.268 Inf  -0.021  0.9832\n\nResults are averaged over the levels of: x2 \nResults are given on the log (not the response) scale. \n\ntest(lsmean2)\n\n grpc emmean    SE  df z.ratio p.value\n Plb  0.6527 0.237 Inf   2.753  0.0059\n Trt  0.0386 0.250 Inf   0.155  0.8770\n\nResults are averaged over the levels of: x2 \nResults are given on the log (not the response) scale. \n\n\nAnd we see that these are also identical to the SAS results."
       },
       {
    -    "objectID": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-2-independent-samples-proportion-using-cardx",
    -    "href": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-2-independent-samples-proportion-using-cardx",
    -    "title": "Confidence Intervals for Proportions in R",
    -    "section": "Methods for Calculating Confidence Intervals for 2 independent samples proportion using {cardx}",
    -    "text": "Methods for Calculating Confidence Intervals for 2 independent samples proportion using {cardx}\nThis paper4 describes many methods for the calculation of confidence intervals for 2 independent proportions. The most commonly used are: Wald with continuity correction and the Wilson with continuity correction.\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nFor more technical information see the corresponding SAS page.\n\nExample code\ncardx::ard_stats_prop_test function uses stats::prop.test which also allows a continuity correction to be applied. More research is needed into this method.\nAlthough this website here and this one here both reference Newcombe for the CI that this function uses, replication of the results by hand and compared to SAS show that the results below match the Normal Approximation (Wald method) not the Newcome method? Further research is needed into this topic.\nBoth the Treatment variable (ACT,PBO) and the Response variable (Yes,No) have to be numeric (0,1) or Logit (TRUE,FALSE) variables.\n\nadcibc2<-select(adcibc,trtn,respn)\ncardx::ard_stats_prop_test(data=adcibc2, by=trtn, variables=respn, conf.level = 0.95, correct=FALSE) \n\n{cards} data frame: 13 x 9\n\n\n   group1 variable   context   stat_name stat_label      stat\n1    trtn    respn stats_pr…    estimate  Rate Dif…    -0.078\n2    trtn    respn stats_pr…   estimate1  Group 1 …     0.156\n3    trtn    respn stats_pr…   estimate2  Group 2 …     0.234\n4    trtn    respn stats_pr…   statistic  X-square…     1.893\n5    trtn    respn stats_pr…     p.value    p-value     0.169\n6    trtn    respn stats_pr…   parameter  Degrees …         1\n7    trtn    respn stats_pr…    conf.low  CI Lower…    -0.183\n8    trtn    respn stats_pr…   conf.high  CI Upper…     0.027\n9    trtn    respn stats_pr…      method     method 2-sample…\n10   trtn    respn stats_pr… alternative  alternat… two.sided\n11   trtn    respn stats_pr…           p          p          \n12   trtn    respn stats_pr…  conf.level  CI Confi…      0.95\n13   trtn    respn stats_pr…     correct  Yates' c…     FALSE\n\n\nℹ 3 more variables: fmt_fn, warning, error\n\ncardx::ard_stats_prop_test(data=adcibc2, by=trtn, variables=respn, conf.level = 0.95, correct=TRUE) \n\n{cards} data frame: 13 x 9\n\n\n   group1 variable   context   stat_name stat_label      stat\n1    trtn    respn stats_pr…    estimate  Rate Dif…    -0.078\n2    trtn    respn stats_pr…   estimate1  Group 1 …     0.156\n3    trtn    respn stats_pr…   estimate2  Group 2 …     0.234\n4    trtn    respn stats_pr…   statistic  X-square…      1.45\n5    trtn    respn stats_pr…     p.value    p-value     0.229\n6    trtn    respn stats_pr…   parameter  Degrees …         1\n7    trtn    respn stats_pr…    conf.low  CI Lower…    -0.193\n8    trtn    respn stats_pr…   conf.high  CI Upper…     0.037\n9    trtn    respn stats_pr…      method     method 2-sample…\n10   trtn    respn stats_pr… alternative  alternat… two.sided\n11   trtn    respn stats_pr…           p          p          \n12   trtn    respn stats_pr…  conf.level  CI Confi…      0.95\n13   trtn    respn stats_pr…     correct  Yates' c…      TRUE\n\n\nℹ 3 more variables: fmt_fn, warning, error\n\n\n\n\n\nWilson Method (Also known as the Score method or the Altman, Newcombe method3 )\nFor more technical information see the corresponding SAS page.\nFurther research is needed into this topic."
    +    "objectID": "Comp/r-sas_negbin.html#discussion",
    +    "href": "Comp/r-sas_negbin.html#discussion",
    +    "title": "R vs SAS: Negative Binomial Regression",
    +    "section": "Discussion",
    +    "text": "Discussion\nAs shown above it is generally possible to obtain exactly matching results in SAS and R for negative binomial regression. Most important to ensure matching is the manual estimation of the covariance matrix in R, as otherwise standard errors will only asymptotically match those in SAS.\nAs shown above lsmeans-type estimates can also be exactly reproduced using the emmeans package in R if options are correctly specified.\nFor the dispersion parameter an exact match in the MLE is possible, however CIs were not matching in our example. Most likely this is due to the different parameterizations used in SAS and R, since the variance for the dispersion parameters can not be transformed exactly between the two parameterizations. As generally the dispersion parameter should be of lesser interest and the other parameter estimates are not affected by this, this may however not be an issue in most applications.\nEven though results matched in the numerical example we have also highlighted that there are differences in the implementations, in particular when it comes to maximum likelihood optimization methods and convergence criteria. It is possible that this may lead to different estimates for data where the MLE is not easy to find and the methods may disagree on convergence or the optima of the likelihood. In addition, the different parameterizations may lead to different results in scenarios, where there is only very little overdispersion, since in those cases the dispersion parameter will go towards zero in SAS and towards infinity in R.\nAs a final point it should be kept in mind when comparing SAS and R results, that the two apply different rules for rounding. R rounds to the even digit (i.e. both 1.5 and 2.5 round to 2), while SAS uses “conventional” rounding rules (i.e 1.5 is rounded to 2 and 2.5 to 3). This can also occasionally lead to differences in results and may need to be addressed by using a custom rounding function in R, that uses SAS rounding rules. An example of such a function is provided in one of the references given below."
       },
       {
    -    "objectID": "R/ci_for_prop.html#references",
    -    "href": "R/ci_for_prop.html#references",
    -    "title": "Confidence Intervals for Proportions in R",
    +    "objectID": "Comp/r-sas_negbin.html#references",
    +    "href": "Comp/r-sas_negbin.html#references",
    +    "title": "R vs SAS: Negative Binomial Regression",
         "section": "References",
    -    "text": "References\n\npharmaverse cardx package\nPropCIs package\nD. Altman, D. Machin, T. Bryant, M. Gardner (eds). Statistics with Confidence: Confidence Intervals and Statistical Guidelines, 2nd edition. John Wiley and Sons 2000.\nhttps://www.lexjansen.com/wuss/2016/127_Final_Paper_PDF.pdf"
    +    "text": "References\n\nSAS PROC GENMOD documentation.\nR glm.nb documentation.\nCrossValidated discussion on covariance estimation (glm.nb.cov function is provided in the answer by Jonathan Bartlett).\nDiscussion of general differences in SAS and R including rounding"
       },
       {
    -    "objectID": "R/nonpara_wilcoxon_ranksum.html",
    -    "href": "R/nonpara_wilcoxon_ranksum.html",
    -    "title": "Wilcoxon Rank Sum (Mann Whitney-U) in R",
    +    "objectID": "Comp/r-sas_jonckheere.html",
    +    "href": "Comp/r-sas_jonckheere.html",
    +    "title": "R vs SAS on the Jonckheere-Terpstra test",
         "section": "",
    -    "text": "Wilcoxon rank sum test, or equivalently, Mann-Whitney U-test is a rank based non-parametric method. The aim is to compare two independent groups of observations. Under certain scenarios, it can be thought of as a test for median differences, however this is only valid when: 1) both samples are independent and identically distributed (same dispersion, same shape, not necessarily normal) and 2) are symmetric around their medians.\nGenerally, with two samples of observations (A and B), the test uses the mean of each possible pair of observations in each group (including the pair of each value with itself) to test if the probability that (A>B) > probability (B>A).\nThe Wilcoxon rank sum test is often presented alongside a Hodges-Lehmann estimate of the pseudo-median (the median of the Walsh averages), and an associated confidence interval for the pseudo-median.\nA tie in the data exists when an observation in group A, has the same result as an observation in group B.\n\n\n\nMethods and Formulae\nMann Whitney is not about medians in general\nRelationship between walsh averages and WRS\nHodges Lehmann Problems\n\n\n\n\nThere are three main implementations of the Wilcoxon rank sum test in R.\n\nstats::wilcox.test\nasht::wmwTest()\ncoin::wilcox_test()\n\nThe stats package implements various classic statistical tests, including Wilcoxon rank sum test. Although this is arguably the most commonly applied package, this one does not account for any ties in the data.\n\n# x, y are two unpaired vectors. Do not necessary need to be of the same length.\nstats::wilcox.test(x, y, paired = F)\n\n\n\n\nData source: Table 30.4, Kirkwood BR. and Sterne JAC. Essentials of medical statistics. Second Edition. ISBN 978-0-86542-871-3\nComparison of birth weights (kg) of children born to 15 non-smokers with those of children born to 14 heavy smokers.\n\n# bw_ns: non smokers\n# bw_s: smokers\nbw_ns <- c(3.99, 3.89, 3.6, 3.73, 3.31, \n            3.7, 4.08, 3.61, 3.83, 3.41, \n            4.13, 3.36, 3.54, 3.51, 2.71)\nbw_s <- c(3.18, 2.74, 2.9, 3.27, 3.65, \n           3.42, 3.23, 2.86, 3.6, 3.65, \n           3.69, 3.53, 2.38, 2.34)\n\nCan visualize the data on two histograms. Red lines indicate the location of medians.\n\npar(mfrow =c(1,2))\nhist(bw_ns, main = 'Birthweight: non-smokers')\nabline(v = median(bw_ns), col = 'red', lwd = 2)\nhist(bw_s, main = 'Birthweight: smokers')\nabline(v = median(bw_s), col = 'red', lwd = 2)\n\n\n\n\n\n\n\n\nIt is possible to see that for non-smokers, the median birthweight is higher than those of smokers. Now we can formally test it with wilcoxon rank sum test.\nThe default test is two-sided with confidence level of 0.95, and does continuity correction.\n\n# default is two sided\nstats::wilcox.test(bw_ns, bw_s, paired = F)\n\nWarning in wilcox.test.default(bw_ns, bw_s, paired = F): cannot compute exact\np-value with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  bw_ns and bw_s\nW = 164.5, p-value = 0.01001\nalternative hypothesis: true location shift is not equal to 0\n\n\nWe can also carry out a one-sided test, by specifying alternative = greater (if the first item is greater than the second).\n\n# default is two sided\nstats::wilcox.test(bw_ns, bw_s, paired = F, alternative = 'greater')\n\nWarning in wilcox.test.default(bw_ns, bw_s, paired = F, alternative =\n\"greater\"): cannot compute exact p-value with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  bw_ns and bw_s\nW = 164.5, p-value = 0.005003\nalternative hypothesis: true location shift is greater than 0"
    +    "text": "Analysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nJonckheere-Terpstra test using normal approximation\nYes\nYes\nPartial match\nThe test statistics was 184.5 from both languages.\nRegarding the p-value, R yields 0.002655, and SAS 0.002649\n\n\nJonckheere-Terpstra test using Monte Carlo approximation for an exact test\nYes\nYes\nPartially matching\nThe resampling number is 10000.\nThe test statistics was 184.5 from both languages.\nRegarding the p-value, R yields 0.0023, and SAS 0.0016"
       },
       {
    -    "objectID": "R/nonpara_wilcoxon_ranksum.html#useful-references",
    -    "href": "R/nonpara_wilcoxon_ranksum.html#useful-references",
    -    "title": "Wilcoxon Rank Sum (Mann Whitney-U) in R",
    +    "objectID": "Comp/r-sas_jonckheere.html#comparison",
    +    "href": "Comp/r-sas_jonckheere.html#comparison",
    +    "title": "R vs SAS on the Jonckheere-Terpstra test",
         "section": "",
    -    "text": "Methods and Formulae\nMann Whitney is not about medians in general\nRelationship between walsh averages and WRS\nHodges Lehmann Problems"
    +    "text": "Analysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nJonckheere-Terpstra test using normal approximation\nYes\nYes\nPartial match\nThe test statistics was 184.5 from both languages.\nRegarding the p-value, R yields 0.002655, and SAS 0.002649\n\n\nJonckheere-Terpstra test using Monte Carlo approximation for an exact test\nYes\nYes\nPartially matching\nThe resampling number is 10000.\nThe test statistics was 184.5 from both languages.\nRegarding the p-value, R yields 0.0023, and SAS 0.0016"
       },
       {
    -    "objectID": "R/nonpara_wilcoxon_ranksum.html#available-r-packages",
    -    "href": "R/nonpara_wilcoxon_ranksum.html#available-r-packages",
    -    "title": "Wilcoxon Rank Sum (Mann Whitney-U) in R",
    -    "section": "",
    -    "text": "There are three main implementations of the Wilcoxon rank sum test in R.\n\nstats::wilcox.test\nasht::wmwTest()\ncoin::wilcox_test()\n\nThe stats package implements various classic statistical tests, including Wilcoxon rank sum test. Although this is arguably the most commonly applied package, this one does not account for any ties in the data.\n\n# x, y are two unpaired vectors. Do not necessary need to be of the same length.\nstats::wilcox.test(x, y, paired = F)"
    +    "objectID": "Comp/r-sas_jonckheere.html#conclusion",
    +    "href": "Comp/r-sas_jonckheere.html#conclusion",
    +    "title": "R vs SAS on the Jonckheere-Terpstra test",
    +    "section": "Conclusion",
    +    "text": "Conclusion\n\nResults from normal approximation\nFor the test using normal approximation, the results look slightly different. The reason for this gap may be either of the following.\n\nContinuity correction\nHandling of ties in calculating the variance of the test statistics\nNumerical integration for normal distribution\n\nRegarding continuity correction, the SAS manual mentions that PROC FREQ does not apply it. The DescTools manual does not mention anything about this point.\nRegarding variance of the test statistics, it depends only on the “cell counts” in the context of cross tabulation analysis. From the viewpoint of rank tests, it depends on the frequencies of each tie values. However, since the same test statistics value was given by both R and SAS, it is less likely that a gap exists in calculation variance between languages.\nBased on consideration above, the gap looks acceptable. However, it should kept in mind that R and SAS may take different approaches in continuity correction.\n\n\nResults from Monte Carlo approximation of an exact test\nFor the test using simulation, the results also look slightly different.\nAs mentioned above, R and SAS may take different approaches in continuity correction and calculation of variance for the test statistics. In addition, simulation-based results generally differ between different environments.\nThe \\(95 \\%\\) CI for the approximate p-value given by SAS was \\([0.0008, 0.0024]\\). Since the p-value from R, 0.0023, locates within the CI, this result looks comparable.\n\n\nOverall conclusion\nOverall, the gap between R and SAS is accaptable regarding the Jonckheere-Terpstra test. However, users should know that R and SAS may take different approaches for the following aspects:\n\nContinuity correction\nHandling of ties in calculating the variance of the test statistics"
       },
       {
    -    "objectID": "R/nonpara_wilcoxon_ranksum.html#example-birth-weight",
    -    "href": "R/nonpara_wilcoxon_ranksum.html#example-birth-weight",
    -    "title": "Wilcoxon Rank Sum (Mann Whitney-U) in R",
    +    "objectID": "Comp/r-sas-summary-stats.html",
    +    "href": "Comp/r-sas-summary-stats.html",
    +    "title": "Deriving Quantiles or Percentiles in R vs SAS",
         "section": "",
    -    "text": "Data source: Table 30.4, Kirkwood BR. and Sterne JAC. Essentials of medical statistics. Second Edition. ISBN 978-0-86542-871-3\nComparison of birth weights (kg) of children born to 15 non-smokers with those of children born to 14 heavy smokers.\n\n# bw_ns: non smokers\n# bw_s: smokers\nbw_ns <- c(3.99, 3.89, 3.6, 3.73, 3.31, \n            3.7, 4.08, 3.61, 3.83, 3.41, \n            4.13, 3.36, 3.54, 3.51, 2.71)\nbw_s <- c(3.18, 2.74, 2.9, 3.27, 3.65, \n           3.42, 3.23, 2.86, 3.6, 3.65, \n           3.69, 3.53, 2.38, 2.34)\n\nCan visualize the data on two histograms. Red lines indicate the location of medians.\n\npar(mfrow =c(1,2))\nhist(bw_ns, main = 'Birthweight: non-smokers')\nabline(v = median(bw_ns), col = 'red', lwd = 2)\nhist(bw_s, main = 'Birthweight: smokers')\nabline(v = median(bw_s), col = 'red', lwd = 2)\n\n\n\n\n\n\n\n\nIt is possible to see that for non-smokers, the median birthweight is higher than those of smokers. Now we can formally test it with wilcoxon rank sum test.\nThe default test is two-sided with confidence level of 0.95, and does continuity correction.\n\n# default is two sided\nstats::wilcox.test(bw_ns, bw_s, paired = F)\n\nWarning in wilcox.test.default(bw_ns, bw_s, paired = F): cannot compute exact\np-value with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  bw_ns and bw_s\nW = 164.5, p-value = 0.01001\nalternative hypothesis: true location shift is not equal to 0\n\n\nWe can also carry out a one-sided test, by specifying alternative = greater (if the first item is greater than the second).\n\n# default is two sided\nstats::wilcox.test(bw_ns, bw_s, paired = F, alternative = 'greater')\n\nWarning in wilcox.test.default(bw_ns, bw_s, paired = F, alternative =\n\"greater\"): cannot compute exact p-value with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  bw_ns and bw_s\nW = 164.5, p-value = 0.005003\nalternative hypothesis: true location shift is greater than 0"
    +    "text": "Data\nThe following data will be used show the differences between the default percentile definitions used by SAS and R:\n\n10, 20, 30, 40, 150, 160, 170, 180, 190, 200\n\n\n\nSAS Code\nAssuming the data above is stored in the variable aval within the dataset adlb, the 25th and 40th percentiles could be calculated using the following code.\n\nproc univariate data=adlb;\n  var aval;\n  output out=stats pctlpts=25 40 pctlpre=p;\nrun;\n\nThis procedure creates the dataset stats containing the variables p25 and p40.\n\n\n\n\n\n\n\n\n\nThe procedure has the option PCTLDEF which allows for five different percentile definitions to be used. The default is PCTLDEF=5.\n\n\nR code\nThe 25th and 40th percentiles of aval can be calculated using the quantile function.\n\nquantile(adlb$aval, probs = c(0.25, 0.4))\n\nThis gives the following output.\n\n\n  25%   40% \n 32.5 106.0 \n\n\nThe function has the argument type which allows for nine different percentile definitions to be used. The default is type = 7.\n\n\nComparison\nThe default percentile definition used by the UNIVARIATE procedure in SAS finds the 25th and 40th percentiles to be 30 and 95. The default definition used by R finds these percentiles to be 32.5 and 106.\nIt is possible to get the quantile function in R to use the same definition as the default used in SAS, by specifying type=2.\n\nquantile(adlb$aval, probs = c(0.25, 0.4), type=2)\n\nThis gives the following output.\n\n\n25% 40% \n 30  95 \n\n\nIt is not possible to get the UNIVARIATE procedure in SAS to use the same definition as the default used in R.\nRick Wicklin provided a blog post showing how SAS has built in support for calculations using 5 of the 9 percentile definitions available in R, and also demonstrated how you can use a SAS/IML function to calculate percentiles using the other 4 definitions.\nMore information about quantile derivation can be found in the SAS blog.\n\n\nKey references:\nCompare the default definitions for sample quantiles in SAS, R, and Python\nSample quantiles: A comparison of 9 definitions\nHyndman, R. J., & Fan, Y. (1996). Sample quantiles in statistical packages. The American Statistician, 50(4), 361-365."
       },
       {
    -    "objectID": "R/association.html",
    -    "href": "R/association.html",
    -    "title": "Association Analysis for Count Data Using R",
    +    "objectID": "Comp/r-sas_survival.html",
    +    "href": "Comp/r-sas_survival.html",
    +    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
         "section": "",
    -    "text": "The most commonly used association analysis methods for count data/contingency tables compare observed frequencies with those expected under the assumption of independence:\n\\[\nX^2 = \\sum_{i=1}^k \\frac{(x_i-e_i)^2}{e_i},\n\\] where \\(k\\) is the number of contingency table cells.\nOther measures for the correlation of two continuous variables are:"
    +    "text": "The following table shows the options available in SAS and R for Kaplan Meier and Cox Proportional Hazards modelling, the capabilities of each language, and whether or not the results from each language match.\n\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nKaplan Meier with confidence intervals using log-log method\nYes (using the option conf.type = “log-log”)\nYes (Default)\nMostly\n1) Survival estimates can disagree when last event is censored and survival estimate does not cross the percentile being estimated.\n2) Survival estimates at time X can disagree when the time X is after the last observed censored time\n\n\nKaplan Meier with confidence intervals using log method\nYes (Default)\nYes (using the option conftype=log)\nMostly\nAs above.\n\n\nCox Proportional Hazards Model using breslow method for ties\nYes (using the option ties=“breslow”)\nYes (Default)\nYes\n\n\n\nCox Proportional Hazards Model using efron method for ties\nYes (Default)\nYes (using the option ties=efron)\nYes\n\n\n\n\nResults from the examples shown for R here and SAS here were compared below.\nComparing the non-stratified model results side-by-side, the CIs for the quartile estimates and landmark estimates are different between R and SAS. HR and CI also have slight differences.\n\n\n\n\n\n\n\n\n\n\n\nThe default methods for handling ties in a Cox regression model are different which can lead to a different result for the Hazard ratio and associated confidence interval.\nR uses “efron” by default. SAS uses “breslow” by default. Both R and SAS are able to change these default options. By making the changes to the code below, we can force R to use “breslow” to match SAS, or SAS to use “efron” to match R. When the software use the same methods, then we obtain an identical HR and CI.\n\nR: change method for ties to use “breslow”\n\n\nfit.cox <- coxph(Surv(LENFOLY, FSTAT) ~ AFB, ties = \"breslow\", data = dat)\n\n\nSAS: change method for ties to use “efron”\n\n\nproc phreg data=dat;\nclass afb;\nmodel lenfol*fstat(0) = afb/rl ties = efron;\nrun;\n\nIf there are no tied event times, then the methods are equivalent.\nThe Breslow approximation is the easiest to program and hence it historically became the first option coded for almost all software. It then ended up as the default option when other options were added in order to maintain “backwards compatibility”. The Efron option is more accurate if there are a large number of ties, and it was therefore selected as the default option in R. In practice the number of ties is usually small, in which case all the methods are statistically indistinguishable.\nFrom the arguments of coxph in R, there are three possible choices for handling tied event times ‘ties=breslow’, ‘ties=efron’, or ‘ties=’clogit’. This last option is an exact partial likelihood approach. See here for more detail.\n\n\n\nThe default methods for calculation of the confidence interval of a KM estimator are different in the two languages (for example, for calculation of the CI associated with the Median Survival estimate, the 25th percentile and the 75th percentile).\nR uses “log” by default, and SAS uses “log-log” by default. As shown below, using ‘conf.type’ option, R can be forced to use the “log-log” method to match SAS. Alternatively, using the ‘conftype=’ option, SAS can be forced to use the “log” method to match R.\n\nR: change to “log-log”\n\n\nfit.km <- survfit(Surv(LENFOLY, FSTAT) ~ AFB, conf.type = \"log-log\", data = dat)\n\n\nSAS: change to “log”\n\n\nproc lifetest data=dat conftype=log;\ntime lenfoly*fstat(0);\nstrata afb;\nrun;\n\n“log-log” prevents the problem of having confidence intervals of >1 or <0, which might happen if using “log” transformation. However, both R and SAS will clip the interval at [0, 1] and report a bound >1 as 1 and <0 as 0.\nFrom a reference: The appeal of the log-log interval is clear, but the log-scale interval has the advantage of variance stabilization. As a result, simulation studies have generally found it to have better (closer to nominal) coverage; for this reason, it is the default in the survival package.\nNow if we change the confidence interval type in SAS to “log” and tie handling to “efron”, the results will be identical to the results in R.\n\n\n\n\n\n\n\n\n\nBelow is the side-by-side comparison for stratified analysis with default methods in SAS matched to R’s, the results are also identical."
       },
       {
    -    "objectID": "R/association.html#chi-squared-test",
    -    "href": "R/association.html#chi-squared-test",
    -    "title": "Association Analysis for Count Data Using R",
    -    "section": "Chi-Squared test",
    -    "text": "Chi-Squared test\n\nchisq.test(tab)\n\n\n    Pearson's Chi-squared test with Yates' continuity correction\n\ndata:  tab\nX-squared = 1.8261, df = 1, p-value = 0.1766"
    +    "objectID": "Comp/r-sas_survival.html#reason-1-cox-regression-handling-of-tied-survival-times",
    +    "href": "Comp/r-sas_survival.html#reason-1-cox-regression-handling-of-tied-survival-times",
    +    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
    +    "section": "",
    +    "text": "The default methods for handling ties in a Cox regression model are different which can lead to a different result for the Hazard ratio and associated confidence interval.\nR uses “efron” by default. SAS uses “breslow” by default. Both R and SAS are able to change these default options. By making the changes to the code below, we can force R to use “breslow” to match SAS, or SAS to use “efron” to match R. When the software use the same methods, then we obtain an identical HR and CI.\n\nR: change method for ties to use “breslow”\n\n\nfit.cox <- coxph(Surv(LENFOLY, FSTAT) ~ AFB, ties = \"breslow\", data = dat)\n\n\nSAS: change method for ties to use “efron”\n\n\nproc phreg data=dat;\nclass afb;\nmodel lenfol*fstat(0) = afb/rl ties = efron;\nrun;\n\nIf there are no tied event times, then the methods are equivalent.\nThe Breslow approximation is the easiest to program and hence it historically became the first option coded for almost all software. It then ended up as the default option when other options were added in order to maintain “backwards compatibility”. The Efron option is more accurate if there are a large number of ties, and it was therefore selected as the default option in R. In practice the number of ties is usually small, in which case all the methods are statistically indistinguishable.\nFrom the arguments of coxph in R, there are three possible choices for handling tied event times ‘ties=breslow’, ‘ties=efron’, or ‘ties=’clogit’. This last option is an exact partial likelihood approach. See here for more detail."
       },
       {
    -    "objectID": "R/association.html#fisher-exact-test",
    -    "href": "R/association.html#fisher-exact-test",
    -    "title": "Association Analysis for Count Data Using R",
    -    "section": "Fisher Exact Test",
    -    "text": "Fisher Exact Test\nFor \\(2 \\times 2\\) contingency tables, p-values are obtained directly using the hypergeometric distribution.\n\nfisher.test(tab)\n\n\n    Fisher's Exact Test for Count Data\n\ndata:  tab\np-value = 0.135\nalternative hypothesis: true odds ratio is not equal to 1\n95 percent confidence interval:\n 0.8158882 3.2251299\nsample estimates:\nodds ratio \n  1.630576"
    +    "objectID": "Comp/r-sas_survival.html#reason-2-kaplan-meier-median-survival-confidence-intervals",
    +    "href": "Comp/r-sas_survival.html#reason-2-kaplan-meier-median-survival-confidence-intervals",
    +    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
    +    "section": "",
    +    "text": "The default methods for calculation of the confidence interval of a KM estimator are different in the two languages (for example, for calculation of the CI associated with the Median Survival estimate, the 25th percentile and the 75th percentile).\nR uses “log” by default, and SAS uses “log-log” by default. As shown below, using ‘conf.type’ option, R can be forced to use the “log-log” method to match SAS. Alternatively, using the ‘conftype=’ option, SAS can be forced to use the “log” method to match R.\n\nR: change to “log-log”\n\n\nfit.km <- survfit(Surv(LENFOLY, FSTAT) ~ AFB, conf.type = \"log-log\", data = dat)\n\n\nSAS: change to “log”\n\n\nproc lifetest data=dat conftype=log;\ntime lenfoly*fstat(0);\nstrata afb;\nrun;\n\n“log-log” prevents the problem of having confidence intervals of >1 or <0, which might happen if using “log” transformation. However, both R and SAS will clip the interval at [0, 1] and report a bound >1 as 1 and <0 as 0.\nFrom a reference: The appeal of the log-log interval is clear, but the log-scale interval has the advantage of variance stabilization. As a result, simulation studies have generally found it to have better (closer to nominal) coverage; for this reason, it is the default in the survival package.\nNow if we change the confidence interval type in SAS to “log” and tie handling to “efron”, the results will be identical to the results in R.\n\n\n\n\n\n\n\n\n\nBelow is the side-by-side comparison for stratified analysis with default methods in SAS matched to R’s, the results are also identical."
       },
       {
    -    "objectID": "R/association.html#chi-squared-test-1",
    -    "href": "R/association.html#chi-squared-test-1",
    -    "title": "Association Analysis for Count Data Using R",
    -    "section": "Chi-Squared Test",
    -    "text": "Chi-Squared Test\n\nchisq.test(tab2)\n\nWarning in chisq.test(tab2): Chi-squared approximation may be incorrect\n\n\n\n    Pearson's Chi-squared test\n\ndata:  tab2\nX-squared = 260.76, df = 15, p-value < 2.2e-16\n\n\nThe warning means that the smallest expected frequencies is lower than 5. It is recommended to use the Fisher’s exact test in this case."
    +    "objectID": "Comp/r-sas_survival.html#differences-observed-in-the-km-estimators",
    +    "href": "Comp/r-sas_survival.html#differences-observed-in-the-km-estimators",
    +    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
    +    "section": "Differences Observed in the KM Estimators",
    +    "text": "Differences Observed in the KM Estimators\nSuppose we are interested to know the 25%, 50% and 75% quartile estimates, and the day 80, 100, and 120 estimates.\nBelow is the R code:\n\nfit.km <- survfit(Surv(time, status) ~ 1, conf.type = \"log-log\", data = test)\n## quantile estimates\nquantile(fit.km, probs = c(0.25, 0.5, 0.75))\n## landmark estimates at 80, 100, 120-day\nsummary(fit.km, times = c(80, 100, 120), extend = T)\n\nBelow is the SAS code:\n\nproc lifetest data=dat outsurv=_SurvEst timelist= 80 100 120 reduceout stderr; \ntime lenfoly*fstat(0);\nrun;\n\nBelow is the side-by-side comparison:"
       },
       {
    -    "objectID": "R/association.html#fisher-exact-test-1",
    -    "href": "R/association.html#fisher-exact-test-1",
    -    "title": "Association Analysis for Count Data Using R",
    -    "section": "Fisher Exact Test",
    -    "text": "Fisher Exact Test\nFor contingency tables larger than \\(2 \\times 2\\), p-values are based on simulations, which might require a lot of time (see ?fisher.test for details).\n\nfisher.test(tab2, simulate.p.value=TRUE)\n\n\n    Fisher's Exact Test for Count Data with simulated p-value (based on\n    2000 replicates)\n\ndata:  tab2\np-value = 0.0004998\nalternative hypothesis: two.sided"
    +    "objectID": "Comp/r-sas_survival.html#reasons",
    +    "href": "Comp/r-sas_survival.html#reasons",
    +    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
    +    "section": "Reasons",
    +    "text": "Reasons\nThe reasons for the differences are because:\nReason 1: Survival estimate does not cross the 50% percentile.\nThe kth quantile for a survival curve S(t) is the location at which a horizontal line at height p= 1-k intersects the plot of S(t) as shown in the KM curve below. Since S(t) is a step function, it is possible for the curve to have a horizontal segment at exactly 1-k, in which case the midpoint of the horizontal segment is returned.\nFor example, using the data above, the survival probability is exactly 0.5 at time=87 and remains at 0.5 until the last censored observation at 118.\n\n\n\n\n\n\n\n\n\nWhen using R, the median is the smallest time which survival estimate is <= 0.5 –> (87+118) / 2 = 102.5. However, SAS searches the smallest time which survival estimate is < 0.5, which does not exist in this dataset, so it gives “NE” (Not evaluable).\n\npl <- survminer::ggsurvplot(fit.km, \n                            conf.int = TRUE,\n                            ggtheme = theme_light()) \npl$plot +  geom_hline(yintercept = 0.5, color = \"black\", linetype = \"solid\")  \n\nsummary(fit.km)\n\nReason 2: Last event censored and prior to the required landmark estimate.\nFor the 120-day event-free estimate, SAS considers that 120 days is beyond the maximum observed day in the data (which was a censored event at time =118). Therefore, SAS considers this as Unknown and returns a result of “NE” (Not-evaluable). However, R uses the rate at last observed censored date to estimate the 120-day event free rate. As the event-free estimate at time of the last censored event at 118 was 0.5 (0.184, 0.753), R makes the assumption that this is the best estimate for the event-free rate at Time =120.\nIf we change the last observation in the dataset to be an event (instead of censored), R and SAS will both give 0 for the event-free survival estimate, because it is for sure that all subjects did not survive beyond 120 days.\n\ntest <- tibble(time = c(54, 75, 77, 84, 87, 92, 103, 105, 112, 118), \n                   status = c(1, 1, 1, 1, 1, 0, 0, 0, 0, 1))\n\ntest\n\n# A tibble: 10 × 2\n    time status\n   <dbl>  <dbl>\n 1    54      1\n 2    75      1\n 3    77      1\n 4    84      1\n 5    87      1\n 6    92      0\n 7   103      0\n 8   105      0\n 9   112      0\n10   118      1"
       },
       {
    -    "objectID": "R/kruskal_wallis.html",
    -    "href": "R/kruskal_wallis.html",
    -    "title": "Kruskal Wallis R",
    -    "section": "",
    -    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of datasets::iris, testing for difference in sepal width between species of flower.\n\n\n      Species Sepal_Width\n1      setosa         3.4\n2      setosa         3.0\n3      setosa         3.4\n4      setosa         3.2\n5      setosa         3.5\n6      setosa         3.1\n7  versicolor         2.7\n8  versicolor         2.9\n9  versicolor         2.7\n10 versicolor         2.6\n11 versicolor         2.5\n12 versicolor         2.5\n13  virginica         3.0\n14  virginica         3.0\n15  virginica         3.1\n16  virginica         3.8\n17  virginica         2.7\n18  virginica         3.3"
    +    "objectID": "Comp/r-sas_correlation.html#codes",
    +    "href": "Comp/r-sas_correlation.html#codes",
    +    "title": "",
    +    "section": "Codes",
    +    "text": "Codes\nThe following table shows the three different types of correlations considered, their functions in each language and whether the results match\n\n\n\n\n\n\n\n\n\nCorrelation coefficient\nR code\nSAS code\nResults match\n\n\n\n\nPearson\ncor.test(x,y,method=\"pearson\")\nproc corr data pearson;\nvar x y;\nrun;\nYes\n\n\nSpearman\ncor.test(x,y,method=\"spearman\")\nproc corr data spearman;\nvar x y;\nrun;\nYes\n\n\nKendall\ncor.test(x,y,method=\"kendall\")\nproc corr data kendall;\nvar x y;\nrun;\nYes\n\n\n\n‘x’ and ‘y’ are variables in the dataset “data” for which we determine the correlation."
       },
       {
    -    "objectID": "R/kruskal_wallis.html#introduction",
    -    "href": "R/kruskal_wallis.html#introduction",
    -    "title": "Kruskal Wallis R",
    -    "section": "",
    -    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of datasets::iris, testing for difference in sepal width between species of flower.\n\n\n      Species Sepal_Width\n1      setosa         3.4\n2      setosa         3.0\n3      setosa         3.4\n4      setosa         3.2\n5      setosa         3.5\n6      setosa         3.1\n7  versicolor         2.7\n8  versicolor         2.9\n9  versicolor         2.7\n10 versicolor         2.6\n11 versicolor         2.5\n12 versicolor         2.5\n13  virginica         3.0\n14  virginica         3.0\n15  virginica         3.1\n16  virginica         3.8\n17  virginica         2.7\n18  virginica         3.3"
    +    "objectID": "Comp/r-sas_correlation.html#comparison-results",
    +    "href": "Comp/r-sas_correlation.html#comparison-results",
    +    "title": "",
    +    "section": "Comparison Results",
    +    "text": "Comparison Results\nExample: Lung Cancer Data\nData source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601-7, 1994.\nSurvival in patients with advanced lung cancer from the North Central Cancer Treatment Group. Performance scores rate how well the patient can perform usual daily activities. Correlation was observed between age and meal.cal variables in the dataset.\n\n\n\n\n\n\n\n\n\n\nCorrelation coefficient\nSample estimates in R\np-value in R\nSample estimate in SAS\np-value in SAS\n\n\n\n\nPearson\n-0.2314107\n0.001722\n-0.23141\n0.0017\n\n\nSpearman\n-0.2073639\n0.005095\n-0.20736\n0.0051\n\n\nKendall\n-0.1443877\n0.00524\n-0.14439\n0.0052\n\n\n\nPlease note that the results in SAS are rounded at 5 decimals for sample estimates and 4 decimals for p-values."
       },
       {
    -    "objectID": "R/kruskal_wallis.html#implementing-kruskal-wallis-in-r",
    -    "href": "R/kruskal_wallis.html#implementing-kruskal-wallis-in-r",
    -    "title": "Kruskal Wallis R",
    -    "section": "Implementing Kruskal-Wallis in R",
    -    "text": "Implementing Kruskal-Wallis in R\nThe Kruskal-Wallis test can be implemented in R using stats::kruskal.test. Below, the test is defined using R’s formula interface (dependent ~ independent variable) and specifying the data set. The null hypothesis is that the samples are from identical populations.\n\nkruskal.test(Sepal_Width~Species, data=iris_sub)\n\n\n    Kruskal-Wallis rank sum test\n\ndata:  Sepal_Width by Species\nKruskal-Wallis chi-squared = 10.922, df = 2, p-value = 0.004249"
    +    "objectID": "Comp/r-sas_correlation.html#summary",
    +    "href": "Comp/r-sas_correlation.html#summary",
    +    "title": "",
    +    "section": "Summary",
    +    "text": "Summary\nComparisons between SAS and R yield identical results for the tested dataset. R outputs test statistic values and p-values, whereas SAS offers descriptive statistics (N, mean, standard deviation, sum, minimum, maximum) for each variable, but does not display the test statistic values."
       },
       {
    -    "objectID": "R/kruskal_wallis.html#results",
    -    "href": "R/kruskal_wallis.html#results",
    -    "title": "Kruskal Wallis R",
    -    "section": "Results",
    -    "text": "Results\nAs seen above, R outputs the Kruskal-Wallis rank sum statistic (10.922), the degrees of freedom (2), and the p-value of the test (0.004249). Therefore, the difference in population medians is statistically significant at the 5% level."
    +    "objectID": "Comp/r-sas_correlation.html#references",
    +    "href": "Comp/r-sas_correlation.html#references",
    +    "title": "",
    +    "section": "References",
    +    "text": "References\nPROC CORR: The CORR Procedure (sas.com)\ncor.test function - RDocumentation"
       },
       {
    -    "objectID": "R/ttest_Paired.html",
    -    "href": "R/ttest_Paired.html",
    -    "title": "Paired t-test",
    +    "objectID": "Comp/r-sas_anova.html",
    +    "href": "Comp/r-sas_anova.html",
    +    "title": "R vs SAS Linear Models",
         "section": "",
    -    "text": "The Paired t-test is used when two samples are naturally correlated. In the Paired t-test, the difference of the means between the two samples is compared to a given number that represents the null hypothesis. For a Paired t-test, the number of observations in each sample must be equal.\nIn R, a Paired t-test can be performed using the Base R t.test() from the stats package or the proc_ttest() function from the procs package.\n\n\nBy default, the R paired t-test functions assume normality in the data and use a classic Student’s t-test.\n\n\nThe following data was used in this example.\n\n# Create sample data\npressure <- tibble::tribble(\n  ~SBPbefore, ~SBPafter,\n  120, 128,   \n  124, 131,   \n  130, 131,   \n  118, 127,\n  140, 132,   \n  128, 125,   \n  140, 141,   \n  135, 137,\n  126, 118,   \n  130, 132,   \n  126, 129,   \n  127, 135\n)\n\n\n\n\n\n\nThe following code was used to test the comparison in Base R.\n\n  # Perform t-test\n  t.test(pressure$SBPbefore, pressure$SBPafter, paired = TRUE)\n\n\n    Paired t-test\n\ndata:  pressure$SBPbefore and pressure$SBPafter\nt = -1.0896, df = 11, p-value = 0.2992\nalternative hypothesis: true mean difference is not equal to 0\n95 percent confidence interval:\n -5.536492  1.869825\nsample estimates:\nmean difference \n      -1.833333 \n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a paired t-test.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(pressure,\n     paired = \"SBPbefore*SBPafter\")\n\n$Statistics\n       VAR1     VAR2               DIFF  N      MEAN      STD   STDERR MIN MAX\n1 SBPbefore SBPafter SBPbefore-SBPafter 12 -1.833333 5.828353 1.682501  -9   8\n\n$ConfLimits\n       VAR1     VAR2               DIFF      MEAN      LCLM     UCLM      STD\n1 SBPbefore SBPafter SBPbefore-SBPafter -1.833333 -5.536492 1.869825 5.828353\n   LCLMSTD  UCLMSTD\n1 4.128777 9.895832\n\n$TTests\n       VAR1     VAR2               DIFF DF         T     PROBT\n1 SBPbefore SBPafter SBPbefore-SBPafter 11 -1.089648 0.2991635\n\n\nViewer Output:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe Base R t.test() function does not have an option for lognormal data. Likewise, the procs proc_ttest() function also does not have an option for lognormal data.\nOne possibility may be the tTestLnormAltPower() function from the EnvStats package. This package has not been evaluated yet."
    +    "text": "Matching Contrasts: R and SAS\nIt is recommended to use the emmeans package when attempting to match contrasts between R and SAS. In SAS, all contrasts must be manually defined, whereas in R, we have many ways to use pre-existing contrast definitions. The emmeans package makes simplifies this process, and provides syntax that is similar to the syntax of SAS.\nThis is how we would define a contrast in SAS.\n\n# In SAS\nproc glm data=work.mycsv;\n   class drug;\n   model post = drug pre / solution;\n   estimate 'C vs A'  drug -1  1 0;\n   estimate 'E vs CA' drug -1 -1 2;\nrun;\n\nAnd this is how we would define the same contrast in R, using the emmeans package.\n\nlm(formula = post ~ pre + drug, data = df_trial) %>% \n  emmeans(\"drug\") %>% \n  contrast(method = list(\n    \"C vs A\"  = c(-1,  1, 0),\n    \"E vs CA\" = c(-1, -1, 2)\n  ))\n\nNote, however, that there are some cases where the scale of the parameter estimates between SAS and R is off, though the test statistics and p-values are identical. In these cases, we can adjust the SAS code to include a divisor. As far as we can tell, this difference only occurs when using the predefined Base R contrast methods like contr.helmert.\n\nproc glm data=work.mycsv;\n   class drug;\n   model post = drug pre / solution;\n   estimate 'C vs A'  drug -1  1 0 / divisor = 2;\n   estimate 'E vs CA' drug -1 -1 2 / divisor = 6;\nrun;"
       },
       {
    -    "objectID": "R/ttest_Paired.html#normal",
    -    "href": "R/ttest_Paired.html#normal",
    -    "title": "Paired t-test",
    +    "objectID": "Comp/r-sas_summary_skew_kurt.html",
    +    "href": "Comp/r-sas_summary_skew_kurt.html",
    +    "title": "R vs SAS Skewness/Kurtosis",
         "section": "",
    -    "text": "By default, the R paired t-test functions assume normality in the data and use a classic Student’s t-test.\n\n\nThe following data was used in this example.\n\n# Create sample data\npressure <- tibble::tribble(\n  ~SBPbefore, ~SBPafter,\n  120, 128,   \n  124, 131,   \n  130, 131,   \n  118, 127,\n  140, 132,   \n  128, 125,   \n  140, 141,   \n  135, 137,\n  126, 118,   \n  130, 132,   \n  126, 129,   \n  127, 135\n)\n\n\n\n\n\n\nThe following code was used to test the comparison in Base R.\n\n  # Perform t-test\n  t.test(pressure$SBPbefore, pressure$SBPafter, paired = TRUE)\n\n\n    Paired t-test\n\ndata:  pressure$SBPbefore and pressure$SBPafter\nt = -1.0896, df = 11, p-value = 0.2992\nalternative hypothesis: true mean difference is not equal to 0\n95 percent confidence interval:\n -5.536492  1.869825\nsample estimates:\nmean difference \n      -1.833333 \n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a paired t-test.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(pressure,\n     paired = \"SBPbefore*SBPafter\")\n\n$Statistics\n       VAR1     VAR2               DIFF  N      MEAN      STD   STDERR MIN MAX\n1 SBPbefore SBPafter SBPbefore-SBPafter 12 -1.833333 5.828353 1.682501  -9   8\n\n$ConfLimits\n       VAR1     VAR2               DIFF      MEAN      LCLM     UCLM      STD\n1 SBPbefore SBPafter SBPbefore-SBPafter -1.833333 -5.536492 1.869825 5.828353\n   LCLMSTD  UCLMSTD\n1 4.128777 9.895832\n\n$TTests\n       VAR1     VAR2               DIFF DF         T     PROBT\n1 SBPbefore SBPafter SBPbefore-SBPafter 11 -1.089648 0.2991635\n\n\nViewer Output:"
    +    "text": "The following table shows the types of Skewness, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nSkewness, Type 1\nYes\nYes\nYes\nIn e1071, use type = 1.In SAS use vardef = N.\n\n\nSkewness, Type 2\nYes\nYes\nYes\nIn e1071, use type = 2.In SAS use vardef = DF.procs and sasLM use defaults.\n\n\nSkewness, Type 3\nYes\nNo\nNA\nIn e1071, use type = 3.Not supported in SAS.\n\n\n\nNote that the SAS default is Type 2."
       },
       {
    -    "objectID": "R/ttest_Paired.html#lognormal",
    -    "href": "R/ttest_Paired.html#lognormal",
    -    "title": "Paired t-test",
    -    "section": "",
    -    "text": "The Base R t.test() function does not have an option for lognormal data. Likewise, the procs proc_ttest() function also does not have an option for lognormal data.\nOne possibility may be the tTestLnormAltPower() function from the EnvStats package. This package has not been evaluated yet."
    +    "objectID": "Comp/r-sas_summary_skew_kurt.html#comparison-results",
    +    "href": "Comp/r-sas_summary_skew_kurt.html#comparison-results",
    +    "title": "R vs SAS Skewness/Kurtosis",
    +    "section": "Comparison Results",
    +    "text": "Comparison Results\n\nSkewness\nHere is a table of Skewness comparison values between the four R packages examined and SAS:\n\n\n\n\n\n\n\n\n\n\n\n\n\nStatistic\ne1071\nmoments\nprocs\nsasLM\nSAS\nMatch\nNotes\n\n\n\n\nSkewness, Type 1\n0.9054442\n0.9054442\nNA\nNA\n0.9054442\nYes\n\n\n\nSkewness, Type 2\n1.009318\nNA\n1.009318\n1.009318\n1.0093179\nYes\n\n\n\nSkewness, Type 3\n0.8164261\nNA\nNA\nNA\nNA\nNA\nType 3 not supported in SAS\n\n\n\n\n\nKurtosis\nHere is a table of Kurtosis comparison values between the four R packages examined and SAS:\n\n\n\n\n\n\n\n\n\n\n\n\n\nStatistic\ne1071\nmoments\nprocs\nsasLM\nSAS\nMatch\nNotes\n\n\n\n\nKurtosis, Type 1\n-0.5833411\nNA\nNA\nNA\n-0.5833411\nYes\n\n\n\nKurtosis, Type 2\n-0.2991564\nNA\n-0.2991564\n-0.2991564\n-0.2991564\nYes\n\n\n\nKurtosis, Type 3\n-0.8948216\nNA\nNA\nNA\nNA\nNA\nType 3 not supported in SAS\n\n\nKurtosis, Pearson’s\nNA\n2.416659\nNA\nNA\nNA\nNA\nPearson’s not supported in SAS"
       },
       {
    -    "objectID": "R/PCA_analysis.html",
    -    "href": "R/PCA_analysis.html",
    -    "title": "Principle Component Analysis",
    +    "objectID": "publication/dissertation.html",
    +    "href": "publication/dissertation.html",
    +    "title": "Dissertation projects",
         "section": "",
    -    "text": "Principal Component Analysis (PCA) is a dimensionality reduction technique used to reduce the number of features in a dataset while retaining most of the information.\n\n\n\nWe will load the iris data.\nStandardize the data and then compute PCA.\n\n\nlibrary(factoextra)\n\nLoading required package: ggplot2\n\n\nWelcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa\n\nlibrary(plotly)\n\n\nAttaching package: 'plotly'\n\n\nThe following object is masked from 'package:ggplot2':\n\n    last_plot\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\nThe following object is masked from 'package:graphics':\n\n    layout\n\ndata <- iris\npca_result <- prcomp(data[, 1:4], scale = T)\npca_result\n\nStandard deviations (1, .., p=4):\n[1] 1.7083611 0.9560494 0.3830886 0.1439265\n\nRotation (n x k) = (4 x 4):\n                    PC1         PC2        PC3        PC4\nSepal.Length  0.5210659 -0.37741762  0.7195664  0.2612863\nSepal.Width  -0.2693474 -0.92329566 -0.2443818 -0.1235096\nPetal.Length  0.5804131 -0.02449161 -0.1421264 -0.8014492\nPetal.Width   0.5648565 -0.06694199 -0.6342727  0.5235971\n\n\nWe print the summary of the PCA result, which includes the standard deviation of each principal component and the proportion of variance explained.\n\nsummary(pca_result)\n\nImportance of components:\n                          PC1    PC2     PC3     PC4\nStandard deviation     1.7084 0.9560 0.38309 0.14393\nProportion of Variance 0.7296 0.2285 0.03669 0.00518\nCumulative Proportion  0.7296 0.9581 0.99482 1.00000"
    +    "text": "CAMIS have a number of dissertation projects which are likely to be suitable for MSc or BSc dissertation projects that are part of a Statistical degree.\nThis content will be useful for you, if you are:\n\na student looking for a dissertation project?\nan academic looking for projects for your students?\na researcher (academic or industry) who wants to partner with a university and student to help progress your research?\n\n\nAvailable proposals\nIf you are interested in working on one of these projects, please reach out for more information.\nAvailable dissertation projects proposals (further information pending)\n\nMax-Combo\nMultivariate methods\n\n\n\nOngoing and Previously Completed projects\nMMRM - Ongoing\nConversion of MSc Statistics Course notes from R to SAS to be used for English Medical Statistician Apprenticeship scheme - Completed 2022\n\n\nNew proposals\nIf you have an idea for a future proposal, please feel free to tell us what you are interested in!\n\nContact\nLyn @DrLynTaylor"
       },
       {
    -    "objectID": "R/PCA_analysis.html#introduction",
    -    "href": "R/PCA_analysis.html#introduction",
    -    "title": "Principle Component Analysis",
    +    "objectID": "publication/white_paper.html",
    +    "href": "publication/white_paper.html",
    +    "title": "Whitepaper",
         "section": "",
    -    "text": "Principal Component Analysis (PCA) is a dimensionality reduction technique used to reduce the number of features in a dataset while retaining most of the information.\n\n\n\nWe will load the iris data.\nStandardize the data and then compute PCA.\n\n\nlibrary(factoextra)\n\nLoading required package: ggplot2\n\n\nWelcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa\n\nlibrary(plotly)\n\n\nAttaching package: 'plotly'\n\n\nThe following object is masked from 'package:ggplot2':\n\n    last_plot\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\nThe following object is masked from 'package:graphics':\n\n    layout\n\ndata <- iris\npca_result <- prcomp(data[, 1:4], scale = T)\npca_result\n\nStandard deviations (1, .., p=4):\n[1] 1.7083611 0.9560494 0.3830886 0.1439265\n\nRotation (n x k) = (4 x 4):\n                    PC1         PC2        PC3        PC4\nSepal.Length  0.5210659 -0.37741762  0.7195664  0.2612863\nSepal.Width  -0.2693474 -0.92329566 -0.2443818 -0.1235096\nPetal.Length  0.5804131 -0.02449161 -0.1421264 -0.8014492\nPetal.Width   0.5648565 -0.06694199 -0.6342727  0.5235971\n\n\nWe print the summary of the PCA result, which includes the standard deviation of each principal component and the proportion of variance explained.\n\nsummary(pca_result)\n\nImportance of components:\n                          PC1    PC2     PC3     PC4\nStandard deviation     1.7084 0.9560 0.38309 0.14393\nProportion of Variance 0.7296 0.2285 0.03669 0.00518\nCumulative Proportion  0.7296 0.9581 0.99482 1.00000"
    -  },
    -  {
    -    "objectID": "R/PCA_analysis.html#visualize-pca-results",
    -    "href": "R/PCA_analysis.html#visualize-pca-results",
    -    "title": "Principle Component Analysis",
    -    "section": "Visualize PCA Results",
    -    "text": "Visualize PCA Results\n\nScree Plot\nA scree plot shows the proportion of variance explained by each principal component.\n\nfviz_eig(pca_result)\n\n\n\n\n\n\n\n\n\n\nBiplot\nA biplot shows the scores of the samples and the loadings of the variables on the first two principal components.\n\nplt <- fviz_pca_biplot(pca_result, geom.ind = \"point\", pointshape = 21, \n                pointsize = 2, fill.ind = iris$Species, \n                col.var = \"black\", repel = TRUE)\nplt"
    +    "text": "Key Considerations When Understanding Differences in Statistical Methodology Implementations Across Programming Languages - An Introduction to the CAMIS Project\nThis white paper aims to empower clinical data scientists to make informed choices on the implementation of statistical analyses when multiple languages yield different results. Our objective is not to prescribe what that choice should be, but rather provide guidance on the types of questions clinical data scientists should ask, to identify the fundamental sources of discrepant results. Our objective is also to invite the wider community to contribute to an open-source repository designed for Comparing Analysis Method Implementations in Software (CAMIS: https://github.com/PSIAIMS/CAMIS).\nRead the whitepaper"
       },
       {
    -    "objectID": "R/PCA_analysis.html#interpretation",
    -    "href": "R/PCA_analysis.html#interpretation",
    -    "title": "Principle Component Analysis",
    -    "section": "Interpretation",
    -    "text": "Interpretation\n\nThe Scree Plot suggests to decide the number of principle components to retain by looking an elbow point where the explained variance starts to level off.\nThe biplot visualizes both the samples (points) and the variables (arrows). Points that are close to each other represent samples with similar characteristics, while the direction and length of the arrows indicate the contribution of each variable to the principal components."
    +    "objectID": "East/gsd-tte.html",
    +    "href": "East/gsd-tte.html",
    +    "title": "Group sequential design in East",
    +    "section": "",
    +    "text": "“Two Samples”, “Logrank Test Given Accrual Duration and Study Duration” in the Survival library will be used for sample size calculations.\nAfter selecting the design option, you will initially see tabs: “Test Parameters” and “Accrual/Dropouts”. Once the “Number of Looks” is updated to greater than 1, a “Boundary” tab will appear.\nBelow are screenshots of each of the tabs for a group sequential design (GSD) for a progression-free survival (PFS) endpoint, which has one interim analysis for both efficacy and non-binding futility:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe results are as follows:\n\n\n\n\n\n\n\n\n\nThe results are generated with East version 6.5.4.6."
       },
       {
    -    "objectID": "R/PCA_analysis.html#visualization-of-pca-in-3d-scatter-plot",
    -    "href": "R/PCA_analysis.html#visualization-of-pca-in-3d-scatter-plot",
    -    "title": "Principle Component Analysis",
    -    "section": "Visualization of PCA in 3d Scatter Plot",
    -    "text": "Visualization of PCA in 3d Scatter Plot\nA 3d scatter plot allows us to see the relationships between three principle components simultaneously and also gives us a better understanding of how much variance is explained by these components.\nIt also allows for interactive exploration where we can rotate the plot and view it from a different angles.\nWe will plot this using plotly package.\n\npca_result2 <- prcomp(data[, 1:4], scale = T, rank. = 3)\npca_result2\n\nStandard deviations (1, .., p=4):\n[1] 1.7083611 0.9560494 0.3830886 0.1439265\n\nRotation (n x k) = (4 x 3):\n                    PC1         PC2        PC3\nSepal.Length  0.5210659 -0.37741762  0.7195664\nSepal.Width  -0.2693474 -0.92329566 -0.2443818\nPetal.Length  0.5804131 -0.02449161 -0.1421264\nPetal.Width   0.5648565 -0.06694199 -0.6342727\n\n\nNext, we will create a dataframe of the 3 principle components and negate PC2 and PC3 for visual preference to make the plot look more organised and symmetric in 3d space.\n\ncomponents <- as.data.frame(pca_result2$x)\ncomponents$PC2 <- -components$PC2\ncomponents$PC3 <- -components$PC3\n\n\nfig <- plot_ly(components, \n               x = ~PC1, \n               y = ~PC2, \n               z = ~PC3, \n               color = ~data$Species, \n               colors = c('darkgreen','darkblue','darkred')) %>%\n  add_markers(size = 12)\n\nfig <- fig %>%\n  layout(title = \"3d Visualization of PCA\",\n         scene = list(bgcolor = \"lightgray\"))\nfig"
    +    "objectID": "blogs/posts/202312_highlights_blog.html",
    +    "href": "blogs/posts/202312_highlights_blog.html",
    +    "title": "2023: A Year of Progress for the PHUSE CAMIS Working Group Project",
    +    "section": "",
    +    "text": "As we draw towards the end of 2023, the PHUSE DVOST CAMIS Working Group Project reflect on their key progress and successes this year.\nThe CAMIS repository went live in January 2023, drawing on the content from the CSRMLW Working Group. This searchable repository compares analysis method implementations in software (CAMIS) such as SAS, R and python.\nThe white paper, Key Considerations When Understanding Differences in Statistical Methodology Implementations Across Programming Languages – An Introduction to the CAMIS Project was published in June, which highlighted the importance of clearly specifying your analysis, such that it can be replicated in different software and doesn’t rely on default options, which can be different.\nFor more complex analyses, it can still be hard to understand what defaults and algorithms your software is using, so the team focused 2023 on expanding our github repo content, comparing SAS vs R methods. By August, we had covered the following topics in the repo: quartiles, rounding, ANOVA, MMRM, the CMH test, log-rank, Cox PH, the McNemar test, the Kruskal-Wallis test and logistic. October saw the launch of the CAMIS-Oncology sub-group, led by Somasekhar Sriadibhatla (AstraZeneca). This team will focus specifically on oncology endpoints and analysing them in SAS, R and Python.\nThe CAMIS team have expanded in membership this year and presented at conferences around the world. In November, we welcomed Harshal Khanolkar (Novo Nordisk) to join the leadership team alongside Christina Fillmore (GSK) and Lyn Taylor (Parexel). Our focus for 2024 will be on creating additional content for the repo and sharing awareness of the project across the medical research and wider community.\nWe would like to take this opportunity to thank all of our team members and contributors, and encourage everyone to check out the repository and help us grow our content. If you would like to join the team, please get in touch through the github repo."
       },
       {
    -    "objectID": "R/count_data_regression.html",
    -    "href": "R/count_data_regression.html",
    -    "title": "Regression for Count Data",
    +    "objectID": "blogs/posts/202403_phuseUS2024.html",
    +    "href": "blogs/posts/202403_phuseUS2024.html",
    +    "title": "PHUSE US connect 2024 Poster Presentation by Soma & Vikash",
         "section": "",
    -    "text": "The most commonly used models for count data in clinical trials include:\n\nPoisson regression: assumes the response variable \\(Y\\) has a Poisson distribution, which is linked using the logarithm with explanatory variables \\(\\bf{x}\\).\n\n\\[\n\\text{log}(E(Y|x))= \\beta_0 + \\beta' x, \\; i = 1,\\ldots,n\n\\]\n\nQuasi-Poisson regression: Poisson model that allows overdispersion, i.e. dispersion parameter is not fixed at one.\nNegative-Binomial regression: popular generalization which loosens the assumption that the variance is equal to the mean made by the Poisson model.\n\nOther models include hurdle or zero-inflated models, if data have more zero observations than expected.\n\nExample: Familial Andenomatous Polyposis Data\nData source: F. M. Giardiello, S. R. Hamilton, A. J. Krush, S. Piantadosi, L. M. Hylind, P. Celano, S. V. Booker, C. R. Robinson and G. J. A. Offerhaus (1993), Treatment of colonic and rectal adenomas with sulindac in familial adenomatous polyposis. New England Journal of Medicine, 328(18), 1313–1316.\nData from a placebo-controlled trial of a non-steroidal anti-inflammatory drug in the treatment of familial andenomatous polyposis (FAP). (see ?polyps for details).\n\npolyps <- HSAUR2::polyps\nglimpse(polyps)\n\nRows: 20\nColumns: 3\n$ number <dbl> 63, 2, 28, 17, 61, 1, 7, 15, 44, 25, 3, 28, 10, 40, 33, 46, 50,…\n$ treat  <fct> placebo, drug, placebo, drug, placebo, drug, placebo, placebo, …\n$ age    <dbl> 20, 16, 18, 22, 13, 23, 34, 50, 19, 17, 23, 22, 30, 27, 23, 22,…\n\n\nWe analyze the number of colonic polyps at 12 months in dependency of treatment and age of the patient.\n\npolyps %>% \n  ggplot(aes(y = number, x = age, color = treat)) + \n  geom_point() + theme_minimal()\n\n\n\n\n\n\n\n\n\n\nModel Fit\nWe fit a generalized linear model for number using the Poisson distribution with default log link.\n\n# Poisson\nm1 <- glm(number ~ treat + age, data = polyps, family = poisson)\nsummary(m1)\n\n\nCall:\nglm(formula = number ~ treat + age, family = poisson, data = polyps)\n\nCoefficients:\n             Estimate Std. Error z value Pr(>|z|)    \n(Intercept)  4.529024   0.146872   30.84  < 2e-16 ***\ntreatdrug   -1.359083   0.117643  -11.55  < 2e-16 ***\nage         -0.038830   0.005955   -6.52 7.02e-11 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for poisson family taken to be 1)\n\n    Null deviance: 378.66  on 19  degrees of freedom\nResidual deviance: 179.54  on 17  degrees of freedom\nAIC: 273.88\n\nNumber of Fisher Scoring iterations: 5\n\n\nThe parameter estimates are on log-scale. For better interpretation, we can exponentiate these estimates, to obtain estimates and provide \\(95\\)% confidence intervals:\n\n# OR and CI\nexp(coef(m1))\n\n(Intercept)   treatdrug         age \n 92.6681047   0.2568961   0.9619140 \n\nexp(confint(m1))\n\nWaiting for profiling to be done...\n\n\n                 2.5 %      97.5 %\n(Intercept) 69.5361752 123.6802476\ntreatdrug    0.2028078   0.3218208\nage          0.9505226   0.9729788\n\n\nPredictions for number of colonic polyps given a new 25-year-old patient on either treatment using predict():\n\n# new 25 year old patient\nnew_pt <- data.frame(treat = c(\"drug\",\"placebo\"), age=25)\npredict(m1, new_pt, type = \"response\")\n\n        1         2 \n 9.017654 35.102332 \n\n\n\n\nModelling Overdispersion\nPoisson model assumes that mean and variance are equal, which can be a very restrictive assumption. One option to relax the assumption is adding a overdispersion constant to the relationship, i.e. \\(\\text{Var}(\\text{response}) = \\phi\\cdot \\mu\\), which results in a quasipoisson model:\n\n# Quasi poisson\nm2 <- glm(number ~ treat + age, data = polyps, family = quasipoisson)\nsummary(m2)\n\n\nCall:\nglm(formula = number ~ treat + age, family = quasipoisson, data = polyps)\n\nCoefficients:\n            Estimate Std. Error t value Pr(>|t|)    \n(Intercept)  4.52902    0.48106   9.415 3.72e-08 ***\ntreatdrug   -1.35908    0.38533  -3.527  0.00259 ** \nage         -0.03883    0.01951  -1.991  0.06284 .  \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for quasipoisson family taken to be 10.72805)\n\n    Null deviance: 378.66  on 19  degrees of freedom\nResidual deviance: 179.54  on 17  degrees of freedom\nAIC: NA\n\nNumber of Fisher Scoring iterations: 5\n\n\nAlternatively, we can explicitly model the count data with overdispersion using the negative Binomial model. In this case, the overdispersion is a function of both \\(\\mu\\) and \\(\\mu^2\\):\n\\[\n\\text{Var}(\\text{response}) = \\mu + \\kappa\\,\\mu^2.\n\\]\n\n# Negative Binomial\nm3 <- MASS::glm.nb(number ~ treat + age, data = polyps)\nsummary(m3)\n\n\nCall:\nMASS::glm.nb(formula = number ~ treat + age, data = polyps, init.theta = 1.719491, \n    link = log)\n\nCoefficients:\n            Estimate Std. Error z value Pr(>|z|)    \n(Intercept)  4.52603    0.59466   7.611 2.72e-14 ***\ntreatdrug   -1.36812    0.36903  -3.707 0.000209 ***\nage         -0.03856    0.02095  -1.840 0.065751 .  \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for Negative Binomial(1.7195) family taken to be 1)\n\n    Null deviance: 36.734  on 19  degrees of freedom\nResidual deviance: 22.002  on 17  degrees of freedom\nAIC: 164.88\n\nNumber of Fisher Scoring iterations: 1\n\n              Theta:  1.719 \n          Std. Err.:  0.607 \n\n 2 x log-likelihood:  -156.880 \n\n\nBoth model result very similar parameter estimates, but vary in estimates for their respective standard deviation."
    +    "text": "Congratulations, Soma Sekhar Sriadibhatla, on your poster presentation “CAMIS-An open source repository to document differences in statistical methodology software” at PHUSE US Connect 2024.\n\nA poster was presented on PHUSE DVOST-CAMIS effort to document discrepancies between programming languages such as SAS, R, and Python (due to software default choices) in order to conduct the same end-point analysis, a cheat sheet across multilingual languages, and the CAMIS-ONCO subgroup.\n\nWe are pleased to inform you that we have received positive feedback from the industry on our CAMIS repository, which helps them to eliminate the risk of doing end point analysis in a multilingual world."
       },
       {
    -    "objectID": "R/jonckheere.html",
    -    "href": "R/jonckheere.html",
    -    "title": "Jonckheere-Terpstra test",
    +    "objectID": "minutes/posts/13May2024.html",
    +    "href": "minutes/posts/13May2024.html",
    +    "title": "2024 Goals",
         "section": "",
    -    "text": "As far as I know, the following packages are available:\n\nDescTools\nclinfun\nPMCMRplus\nfastJT\n\nDue to availability in the company, DescTools version 0.99.55 is used to compare the results with SAS. Of these packages DescTools is the most common."
    +    "text": "attendees\n13_May_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nNo\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nYes\n\n\nSarah Rathwell\nNo\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nYes\n\n\nVikash Jain\nNo\n\n\nMia Qi\nYes\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nYes\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nYes\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nYes\n\n\nTodd Coffey\nYes\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\nSunil\nNo"
       },
       {
    -    "objectID": "R/jonckheere.html#available-r-packages",
    -    "href": "R/jonckheere.html#available-r-packages",
    -    "title": "Jonckheere-Terpstra test",
    -    "section": "",
    -    "text": "As far as I know, the following packages are available:\n\nDescTools\nclinfun\nPMCMRplus\nfastJT\n\nDue to availability in the company, DescTools version 0.99.55 is used to compare the results with SAS. Of these packages DescTools is the most common."
    +    "objectID": "minutes/posts/13May2024.html#goals",
    +    "href": "minutes/posts/13May2024.html#goals",
    +    "title": "2024 Goals",
    +    "section": "2024 Goals",
    +    "text": "2024 Goals\n\nOur open issues are here\nCurrently 32 are closed and we would like to increase this to 45 closed by the end of the year\nIn addition, we’d like to improve some of the incomplete content such as MMRM\nCreate a webpage for listings dissertation projects\nHave Soma & Vikash represent us at the CSS workshop."
       },
       {
    -    "objectID": "R/jonckheere.html#data-used",
    -    "href": "R/jonckheere.html#data-used",
    -    "title": "Jonckheere-Terpstra test",
    -    "section": "Data used",
    -    "text": "Data used\nThe data for testing is a sample dataset on a dose-response study.\n\nThe Group indicates a dose of a drug. The scores for Group represent ordering of dose arms. Then the boxplot implies a declining dose-response relationship."
    -  },
    -  {
    -    "objectID": "R/jonckheere.html#example-code",
    -    "href": "R/jonckheere.html#example-code",
    -    "title": "Jonckheere-Terpstra test",
    -    "section": "Example Code",
    -    "text": "Example Code\n\nlibrary(DescTools)\nlibrary(ggplot2)\nlibrary(readr)\n\n#\n# Constants\nk_n_samp <- 10000\n\nset.seed(4989)\n#\n# The input dataset is imported.\n#\ninds <- read_csv(\"../data/jonck.csv\", col_select = c(DOSE, value)) \n\nNew names:\nRows: 40 Columns: 2\n── Column specification\n──────────────────────────────────────────────────────── Delimiter: \",\" dbl\n(2): DOSE, value\nℹ Use `spec()` to retrieve the full column specification for this data. ℹ\nSpecify the column types or set `show_col_types = FALSE` to quiet this message.\n• `` -> `...1`\n\n#\n# Analysis\n#\njt_norm <- DescTools::JonckheereTerpstraTest(\n  value ~ DOSE,\n  alternative = \"decreasing\",\n  data = inds\n)\n\nWarning in JonckheereTerpstraTest.default(alternative = alternative, c(153, : Sample size > 100 or data with ties \n p-value based on normal approximation. Specify nperm for permutation p-value\n\njt_resamp <- DescTools::JonckheereTerpstraTest(\n  value ~ DOSE,\n  alternative = \"decreasing\",\n  data = inds,\n  nperm = k_n_samp\n)\n\nWarning in JonckheereTerpstraTest.default(alternative = alternative, nperm = nperm, : Sample size > 100 or data with ties \n p-value based on normal approximation. Specify nperm for permutation p-value\n\njt_norm\n\n\n    Jonckheere-Terpstra test\n\ndata:  value by DOSE\nJT = 184.5, p-value = 0.002655\nalternative hypothesis: decreasing\n\njt_resamp\n\n\n    Jonckheere-Terpstra test\n\ndata:  value by DOSE\nJT = 184.5, p-value = 0.0023\nalternative hypothesis: decreasing"
    -  },
    -  {
    -    "objectID": "R/jonckheere.html#reference",
    -    "href": "R/jonckheere.html#reference",
    -    "title": "Jonckheere-Terpstra test",
    -    "section": "Reference",
    -    "text": "Reference\nSignorell A (2024). DescTools: Tools for Descriptive Statistics. R package version 0.99.55, https://github.com/AndriSignorell/DescTools/, https://andrisignorell.github.io/DescTools/."
    -  },
    -  {
    -    "objectID": "R/mi_mar_regression.html",
    -    "href": "R/mi_mar_regression.html",
    -    "title": "Multiple Imputaton: Linear Regression",
    -    "section": "",
    -    "text": "Multiple imputation with regression is one step further from mean imputation (i.e. by a single value: the average of observed). In the case for continuous, normally distributed variable, linear regression can use information from other variables hence could be closer to the true missing values."
    -  },
    -  {
    -    "objectID": "R/mi_mar_regression.html#overview",
    -    "href": "R/mi_mar_regression.html#overview",
    -    "title": "Multiple Imputaton: Linear Regression",
    -    "section": "",
    -    "text": "Multiple imputation with regression is one step further from mean imputation (i.e. by a single value: the average of observed). In the case for continuous, normally distributed variable, linear regression can use information from other variables hence could be closer to the true missing values."
    -  },
    -  {
    -    "objectID": "R/mi_mar_regression.html#imputation-with-mice",
    -    "href": "R/mi_mar_regression.html#imputation-with-mice",
    -    "title": "Multiple Imputaton: Linear Regression",
    -    "section": "Imputation with mice",
    -    "text": "Imputation with mice\nmice is a powerful R package developed by Stef van Buuren, Karin Groothuis-Oudshoorn and other contributors. Regression methods (continuous, normal outcome) are implemented in mice with methods starting with norm.\n\nLinear regression without parameter uncertainty, mice.impute.norm.nob\nLinear regression through prediction, mice.impute.norm.predict\nBayesian linear regression, mice.impute.norm\nLinear regression bootstrap, mice.impute.norm.boot"
    +    "objectID": "minutes/posts/13May2024.html#camis---onco",
    +    "href": "minutes/posts/13May2024.html#camis---onco",
    +    "title": "2024 Goals",
    +    "section": "CAMIS - Onco",
    +    "text": "CAMIS - Onco\nTo date there has not been much progress. Given the enthusiasm in the meeting to get things kicked off and starting to increase our survival content on the repository, Christina will set up a kick off meeting for those interested. To look at: weighted logrank, MaxCombo, RMST\nThis SAS link may also be useful"
       },
       {
    -    "objectID": "R/mi_mar_regression.html#example",
    -    "href": "R/mi_mar_regression.html#example",
    -    "title": "Multiple Imputaton: Linear Regression",
    -    "section": "Example",
    -    "text": "Example\nHere I use the small dataset nhanes included in mice package. It has 25 rows, and three out of four variables have missings.\nThe original NHANES data is a large national level survey, some are publicly available via R package nhanes.\n\nlibrary(mice)\n\n\nAttaching package: 'mice'\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\nThe following objects are masked from 'package:base':\n\n    cbind, rbind\n\n# load example dataset from mice\nhead(nhanes)\n\n  age  bmi hyp chl\n1   1   NA  NA  NA\n2   2 22.7   1 187\n3   1   NA   1 187\n4   3   NA  NA  NA\n5   1 20.4   1 113\n6   3   NA  NA 184\n\nsummary(nhanes)\n\n      age            bmi             hyp             chl       \n Min.   :1.00   Min.   :20.40   Min.   :1.000   Min.   :113.0  \n 1st Qu.:1.00   1st Qu.:22.65   1st Qu.:1.000   1st Qu.:185.0  \n Median :2.00   Median :26.75   Median :1.000   Median :187.0  \n Mean   :1.76   Mean   :26.56   Mean   :1.235   Mean   :191.4  \n 3rd Qu.:2.00   3rd Qu.:28.93   3rd Qu.:1.000   3rd Qu.:212.0  \n Max.   :3.00   Max.   :35.30   Max.   :2.000   Max.   :284.0  \n                NA's   :9       NA's   :8       NA's   :10     \n\n\nExamine missing pattern with md.pattern(data).\n\n# 27 missing in total\n# by col: 8 for hyp, 9 for bmi, 10 for chl\n# by row: n missing numbers\n\nmd.pattern(nhanes)\n\n\n\n\n\n\n\n\n   age hyp bmi chl   \n13   1   1   1   1  0\n3    1   1   1   0  1\n1    1   1   0   1  1\n1    1   0   0   1  2\n7    1   0   0   0  3\n     0   8   9  10 27\n\n\n\nRegression without parameter uncertainty\nWe can generate two imputed datasets by setting m=2.\nThere is a certain level of randomness, so would be a good idea to set seed.\n\nset.seed(1)\nimpr0 <- mice(nhanes, method = 'norm.nob', m=2, maxit = 1)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n  1   2  bmi  hyp  chl\n\nimpr0\n\nClass: mids\nNumber of multiple imputations:  2 \nImputation methods:\n       age        bmi        hyp        chl \n        \"\" \"norm.nob\" \"norm.nob\" \"norm.nob\" \nPredictorMatrix:\n    age bmi hyp chl\nage   0   1   1   1\nbmi   1   0   1   1\nhyp   1   1   0   1\nchl   1   1   1   0\n\nnhanes_impr0 <- complete(impr0) # by default, returns the first imputation\nnhanes_impr0\n\n   age      bmi       hyp      chl\n1    1 35.53430 1.2503841 256.6153\n2    2 22.70000 1.0000000 187.0000\n3    1 27.31412 1.0000000 187.0000\n4    3 25.31243 2.3880837 267.1435\n5    1 20.40000 1.0000000 113.0000\n6    3 17.94547 1.5855064 184.0000\n7    1 22.50000 1.0000000 118.0000\n8    1 30.10000 1.0000000 187.0000\n9    2 22.00000 1.0000000 238.0000\n10   2 26.99782 1.0810473 206.9927\n11   1 32.71511 0.7819353 213.7222\n12   2 27.65399 0.7904680 209.6716\n13   3 21.70000 1.0000000 206.0000\n14   2 28.70000 2.0000000 204.0000\n15   1 29.60000 1.0000000 252.1596\n16   1 27.47980 0.6071353 145.9557\n17   3 27.20000 2.0000000 284.0000\n18   2 26.30000 2.0000000 199.0000\n19   1 35.30000 1.0000000 218.0000\n20   3 25.50000 2.0000000 245.7884\n21   1 35.12809 0.5807116 232.4652\n22   1 33.20000 1.0000000 229.0000\n23   1 27.50000 1.0000000 131.0000\n24   3 24.90000 1.0000000 268.3929\n25   2 27.40000 1.0000000 186.0000\n\n\nWhen we have two imputed datasets, we can check the values for each of the variables. For example, extract bmi variable from the imputed data imp,\n\n# two imputed datasets (m=2)\nimpr0$imp$bmi\n\n          1        2\n1  35.53430 32.26078\n3  27.31412 22.55473\n4  25.31243 14.90410\n6  17.94547 22.59196\n10 26.99782 25.08534\n11 32.71511 27.71485\n12 27.65399 25.76286\n16 27.47980 30.34985\n21 35.12809 29.89142\n\n\nWe can also specify which imputed dataset to use as our complete data. Set index to 0 (action = 0) returns the original dataset with missing values.\nHere we check which of the imputed data is being used as the completed dataset. First take a note of the row IDs (based on bmi, for example). Then we generate completed dataset.\n\nif no action argument is set, then it returns the first imputation by default\naction=0 corresponds to the original data with missing values\n\n\n# check which imputed data is used for the final result, take note of row id\nid_missing <- which(is.na(nhanes$bmi))\nid_missing\n\n[1]  1  3  4  6 10 11 12 16 21\n\nnhanes_impr0_action0 <- complete(impr0, action = 0) \nnhanes_impr0_action0[id_missing, ] # original data with missing bmi\n\n   age bmi hyp chl\n1    1  NA  NA  NA\n3    1  NA   1 187\n4    3  NA  NA  NA\n6    3  NA  NA 184\n10   2  NA  NA  NA\n11   1  NA  NA  NA\n12   2  NA  NA  NA\n16   1  NA  NA  NA\n21   1  NA  NA  NA\n\nnhanes_impr0_action1 <- complete(impr0, action = 1) \nnhanes_impr0_action1[id_missing, ] # using first imputation\n\n   age      bmi       hyp      chl\n1    1 35.53430 1.2503841 256.6153\n3    1 27.31412 1.0000000 187.0000\n4    3 25.31243 2.3880837 267.1435\n6    3 17.94547 1.5855064 184.0000\n10   2 26.99782 1.0810473 206.9927\n11   1 32.71511 0.7819353 213.7222\n12   2 27.65399 0.7904680 209.6716\n16   1 27.47980 0.6071353 145.9557\n21   1 35.12809 0.5807116 232.4652\n\nnhanes_impr0_action2 <- complete(impr0, action = 2) \nnhanes_impr0_action2[id_missing, ] # using second imputation\n\n   age      bmi       hyp      chl\n1    1 32.26078 0.4616324 228.0022\n3    1 22.55473 1.0000000 187.0000\n4    3 14.90410 1.4558818 212.7958\n6    3 22.59196 1.7664882 184.0000\n10   2 25.08534 1.2940549 201.5872\n11   1 27.71485 0.9410698 169.2427\n12   2 25.76286 1.3570093 168.5961\n16   1 30.34985 0.6878971 163.7262\n21   1 29.89142 1.0452062 212.9144\n\n\n\n\nOther imputation by linear regression\nOther various of imputaton via linear regression can be implemented simply by changing the method argument.\n\nLinear regression through prediction, mice.impute.norm.predict\nBayesian linear regression, mice.impute.norm\nLinear regression bootstrap, mice.impute.norm.boot\n\n\nimpr <- mice(nhanes, method = 'norm.predict', m=1, maxit=1)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n\nimpr$imp$bmi\n\n          1\n1  28.33396\n3  28.33396\n4  22.75613\n6  21.17519\n10 27.19573\n11 29.12443\n12 26.26576\n16 30.28688\n21 28.33396\n\n\nBayesian linear regression\n\nimpb <- mice(nhanes, method = 'norm', m=1, maxit=1)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n\nimpb$imp$bmi\n\n          1\n1  33.82959\n3  28.98754\n4  20.88810\n6  19.11391\n10 27.32990\n11 29.44117\n12 22.68062\n16 32.13267\n21 22.03164\n\n# nhanes_impb <- complete(impb)\n\nBootstrap\n\nimpbt <- mice(nhanes, method = 'norm.boot', m=1, maxit=1)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n\nimpbt$imp$bmi\n\n          1\n1  24.19248\n3  28.77464\n4  22.42321\n6  23.47542\n10 21.95529\n11 23.12703\n12 25.84230\n16 27.68216\n21 26.43770"
    +    "objectID": "minutes/posts/13May2024.html#other-content-updates",
    +    "href": "minutes/posts/13May2024.html#other-content-updates",
    +    "title": "2024 Goals",
    +    "section": "Other content updates",
    +    "text": "Other content updates\nWe now have a new table of assignments saved in the following readme Welcome to edit to update anything you would like to work on, so we keep track of whose working on what. Special shout out to David who has now completed chi-square for SAS and to Lukas for all the python content. Awesome work !\nAs SAS Viya is becoming more used now, we agreed OK to add Viya specific code such as proc freqtab as long as it’s clear that this isn’t a SAS Base procedure."
       },
       {
    -    "objectID": "R/ttest_2Sample.html",
    -    "href": "R/ttest_2Sample.html",
    -    "title": "Two Sample t-test",
    -    "section": "",
    -    "text": "The Two Sample t-test is used to compare two independent samples against each other. In the Two Sample t-test, the mean of the first sample is compared against the mean of the second sample. In R, a Two Sample t-test can be performed using the Base R t.test() function from the stats package or the proc_ttest() function from the procs package.\n\n\nThe following data was used in this example.\n\n# Create sample data\nd1 <- tibble::tribble(\n  ~trt_grp, ~WtGain,\n  \"placebo\",    94, \"placebo\",  12, \"placebo\",  26, \"placebo\",  89,\n  \"placebo\",    88, \"placebo\",  96, \"placebo\",  85, \"placebo\",  130,\n  \"placebo\",    75, \"placebo\",  54, \"placebo\",  112, \"placebo\", 69,\n  \"placebo\",    104, \"placebo\", 95, \"placebo\",  53, \"placebo\",  21,\n  \"treatment\",  45, \"treatment\",    62, \"treatment\",    96, \"treatment\",    128,\n  \"treatment\",  120, \"treatment\",   99, \"treatment\",    28, \"treatment\",    50,\n  \"treatment\",  109, \"treatment\",   115, \"treatment\",   39, \"treatment\",    96,\n  \"treatment\",  87, \"treatment\",    100, \"treatment\",   76, \"treatment\",    80\n)\n\n\n\n\nIf we have normalized data, we can use the classic Student’s t-test. For a Two sample test where the variances are not equal, we should use the Welch’s t-test. Both of those options are available with the Base R t.test() function.\n\n\n\n\nThe following code was used to test the comparison in Base R. By default, the R two sample t-test function assumes the variances in the data are unequal, and uses a Welch’s t-test. Therefore, to use a classic Student’s t-test with normalized data, we must specify var.equal = TRUE. Also note that we must separate the single variable into two variables to satisfy the t.test() syntax and set paired = FALSE.\n\n  d1p <- dplyr::filter(d1, trt_grp == 'placebo')\n  d1t <- dplyr::filter(d1, trt_grp == 'treatment')\n\n  # Perform t-test\n  t.test(d1p$WtGain, d1t$WtGain, \n       var.equal = TRUE, paired = FALSE)\n\n\n    Two Sample t-test\n\ndata:  d1p$WtGain and d1t$WtGain\nt = -0.6969, df = 30, p-value = 0.4912\nalternative hypothesis: true difference in means is not equal to 0\n95 percent confidence interval:\n -31.19842  15.32342\nsample estimates:\nmean of x mean of y \n  75.1875   83.1250 \n\n\n\n\n\n\n\n\nThe following code was used to test the comparison in Base R using Welch’s t-test. Observe that in this case, the var.equal parameter is set to FALSE.\n\n  d1p <- dplyr::filter(d1, trt_grp == 'placebo')\n  d1t <- dplyr::filter(d1, trt_grp == 'treatment')\n\n  # Perform t-test\n  t.test(d1p$WtGain, d1t$WtGain, \n       var.equal = FALSE, paired = FALSE)\n\n\n    Welch Two Sample t-test\n\ndata:  d1p$WtGain and d1t$WtGain\nt = -0.6969, df = 29.694, p-value = 0.4913\nalternative hypothesis: true difference in means is not equal to 0\n95 percent confidence interval:\n -31.20849  15.33349\nsample estimates:\nmean of x mean of y \n  75.1875   83.1250 \n\n\n\n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a two sample t-test. Note that the proc_ttest() function performs both the Student’s t-test and Welch’s (Satterthwaite) t-test in the same call. The results are displayed on separate rows. This output is similar to SAS.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(d1, var = WtGain,\n             class = trt_grp)\n\n$Statistics\n     VAR      CLASS        METHOD  N    MEAN      STD    STDERR MIN MAX\n1 WtGain    placebo          <NA> 16 75.1875 33.81167  8.452918  12 130\n2 WtGain  treatment          <NA> 16 83.1250 30.53495  7.633738  28 128\n3 WtGain Diff (1-2)        Pooled NA -7.9375       NA 11.389723  NA  NA\n4 WtGain Diff (1-2) Satterthwaite NA -7.9375       NA 11.389723  NA  NA\n\n$ConfLimits\n     VAR      CLASS        METHOD    MEAN      LCLM     UCLM      STD  LCLMSTD\n1 WtGain    placebo          <NA> 75.1875  57.17053 93.20447 33.81167 24.97685\n2 WtGain  treatment          <NA> 83.1250  66.85407 99.39593 30.53495 22.55632\n3 WtGain Diff (1-2)        Pooled -7.9375 -31.19842 15.32342       NA       NA\n4 WtGain Diff (1-2) Satterthwaite -7.9375 -31.20849 15.33349       NA       NA\n   UCLMSTD\n1 52.33003\n2 47.25868\n3       NA\n4       NA\n\n$TTests\n     VAR        METHOD VARIANCES       DF          T     PROBT\n1 WtGain        Pooled     Equal 30.00000 -0.6969002 0.4912306\n2 WtGain Satterthwaite   Unequal 29.69359 -0.6969002 0.4912856\n\n$Equality\n     VAR   METHOD NDF DDF     FVAL     PROBF\n1 WtGain Folded F  15  15 1.226136 0.6980614\n\n\nViewer Output:"
    +    "objectID": "minutes/posts/13May2024.html#conference-planning",
    +    "href": "minutes/posts/13May2024.html#conference-planning",
    +    "title": "2024 Goals",
    +    "section": "Conference planning",
    +    "text": "Conference planning\nReminder that if you are attending a conference to represent CAMIS to add the detail here. We need to ensure we continue to advertise the project to encourage people to use the repo and add content.\n\nPHUSE CSS update (Soma/Vikash)\nR/Pharma – anyone like to present (openstatsware – collab, python): Waiting to be open.\nUSER! – Chi (Accepted)\nStephen phuse EU.\nEU Connect – Agnieska TBC\nR/Medicine 2024- Agnieska accepted for Thurs 13th/14th 11am-6pm EST (20 min talk)"
       },
       {
    -    "objectID": "R/ttest_2Sample.html#base-r",
    -    "href": "R/ttest_2Sample.html#base-r",
    -    "title": "Two Sample t-test",
    -    "section": "",
    -    "text": "If we have normalized data, we can use the classic Student’s t-test. For a Two sample test where the variances are not equal, we should use the Welch’s t-test. Both of those options are available with the Base R t.test() function.\n\n\n\n\nThe following code was used to test the comparison in Base R. By default, the R two sample t-test function assumes the variances in the data are unequal, and uses a Welch’s t-test. Therefore, to use a classic Student’s t-test with normalized data, we must specify var.equal = TRUE. Also note that we must separate the single variable into two variables to satisfy the t.test() syntax and set paired = FALSE.\n\n  d1p <- dplyr::filter(d1, trt_grp == 'placebo')\n  d1t <- dplyr::filter(d1, trt_grp == 'treatment')\n\n  # Perform t-test\n  t.test(d1p$WtGain, d1t$WtGain, \n       var.equal = TRUE, paired = FALSE)\n\n\n    Two Sample t-test\n\ndata:  d1p$WtGain and d1t$WtGain\nt = -0.6969, df = 30, p-value = 0.4912\nalternative hypothesis: true difference in means is not equal to 0\n95 percent confidence interval:\n -31.19842  15.32342\nsample estimates:\nmean of x mean of y \n  75.1875   83.1250 \n\n\n\n\n\n\n\n\nThe following code was used to test the comparison in Base R using Welch’s t-test. Observe that in this case, the var.equal parameter is set to FALSE.\n\n  d1p <- dplyr::filter(d1, trt_grp == 'placebo')\n  d1t <- dplyr::filter(d1, trt_grp == 'treatment')\n\n  # Perform t-test\n  t.test(d1p$WtGain, d1t$WtGain, \n       var.equal = FALSE, paired = FALSE)\n\n\n    Welch Two Sample t-test\n\ndata:  d1p$WtGain and d1t$WtGain\nt = -0.6969, df = 29.694, p-value = 0.4913\nalternative hypothesis: true difference in means is not equal to 0\n95 percent confidence interval:\n -31.20849  15.33349\nsample estimates:\nmean of x mean of y \n  75.1875   83.1250"
    +    "objectID": "minutes/posts/13May2024.html#aob",
    +    "href": "minutes/posts/13May2024.html#aob",
    +    "title": "2024 Goals",
    +    "section": "AOB",
    +    "text": "AOB\nOur Blog page dosn’t appear in date order or aligned! If anyone can fix let us know ! Saved under News here"
       },
       {
    -    "objectID": "R/ttest_2Sample.html#procs-package",
    -    "href": "R/ttest_2Sample.html#procs-package",
    -    "title": "Two Sample t-test",
    +    "objectID": "minutes/posts/10July2023.html",
    +    "href": "minutes/posts/10July2023.html",
    +    "title": "Plan for Advertising CAMIS progress",
         "section": "",
    -    "text": "The following code from the procs package was used to perform a two sample t-test. Note that the proc_ttest() function performs both the Student’s t-test and Welch’s (Satterthwaite) t-test in the same call. The results are displayed on separate rows. This output is similar to SAS.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(d1, var = WtGain,\n             class = trt_grp)\n\n$Statistics\n     VAR      CLASS        METHOD  N    MEAN      STD    STDERR MIN MAX\n1 WtGain    placebo          <NA> 16 75.1875 33.81167  8.452918  12 130\n2 WtGain  treatment          <NA> 16 83.1250 30.53495  7.633738  28 128\n3 WtGain Diff (1-2)        Pooled NA -7.9375       NA 11.389723  NA  NA\n4 WtGain Diff (1-2) Satterthwaite NA -7.9375       NA 11.389723  NA  NA\n\n$ConfLimits\n     VAR      CLASS        METHOD    MEAN      LCLM     UCLM      STD  LCLMSTD\n1 WtGain    placebo          <NA> 75.1875  57.17053 93.20447 33.81167 24.97685\n2 WtGain  treatment          <NA> 83.1250  66.85407 99.39593 30.53495 22.55632\n3 WtGain Diff (1-2)        Pooled -7.9375 -31.19842 15.32342       NA       NA\n4 WtGain Diff (1-2) Satterthwaite -7.9375 -31.20849 15.33349       NA       NA\n   UCLMSTD\n1 52.33003\n2 47.25868\n3       NA\n4       NA\n\n$TTests\n     VAR        METHOD VARIANCES       DF          T     PROBT\n1 WtGain        Pooled     Equal 30.00000 -0.6969002 0.4912306\n2 WtGain Satterthwaite   Unequal 29.69359 -0.6969002 0.4912856\n\n$Equality\n     VAR   METHOD NDF DDF     FVAL     PROBF\n1 WtGain Folded F  15  15 1.226136 0.6980614\n\n\nViewer Output:"
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n10_july_2023\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nYes\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nYes\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\n\nWelcome new members - Vandana Yadav (Novo Nordisk) and Iris Wu (incyte)\nCAMIS Advertisement Plan - Harshal\n\nWhite paper\nMolly poster prize\nConference plan\n\nWebsite\n\nMMRM/ Other\n\nCAMIS-ONCO / Prep for PHUSE CSS- Soma Sekhar\nAOB\n\nNext meeting 14th Aug. Lyn on vacation, do you want to go ahead or move back 1 week?\n\n\n\n\nMeeting minutes\nCAMIS Advertisement Plan\n\nBlog re: White paper - All to share link with colleagues and like on social media,\nBlog re: Molly poster prize - ACTION: Molly to write\nLinkedIn -\n\nShould we have our own account (CAMIS linkedIN account) or post through the other organizations. Could post through our own personal accounts & have them repost?\nACTION : Harshal to post from own personal account and we will assesss reach if we all like it and ask the organizations to repost it.\n\nAny other social media sites needed to be used? Twitter was popular but not so now so stick with LinkedIn.\nSpread awareness though individual departments working groups\nPHUSE SDE connect - talk / presentation / posters or interactive workshops at connect SDEs.\nPHUSE/ FDA CSS 2024 - Working groups interactive breakout sessions. create a DVOST break out sessions - see CSS Working Groups (phuse-events.org)\n\nMaybe take inspiration from this years event to see what format they take\nACTION Soma to report back after conference and we can plan for next year\n\nSocial media post on CAMIS engagement at conferences\nUtilise #CAMIS on social media.\nPharmaverse - Could we get a link from Pharmaverse\n\nACTION: Christina to see if we can get a link?\n\n\n\nConference plan. The conference plan on the website was reviewed and updated\n\nPHUSE FDA quarterly meeting. CAMIS invited to present. Plan to go through White paper concepts & website. Request a replacement to represent FDA on our group, since Kyle Lee no longer at FDA. Promote use of site to them. Likely to be in attendance someone from the Division of analytics and informatics in CEDER.\nPHUSE CSS: Somar producing poster. Also doing a talk on validation of oncology endpoints and why it’s important to introduce hybrid programming languanges. Will be representatives present from regulatory authorities\n\n\nWebsite progress: Christina\n\nMMRM (Ben Arancibia happy to contribute)\nOthers - Not much new content in last month. Please if anyone time please add content !\nShould we prioritize any areas, or in getting Python/Julia content. Currently we will just see what content people have, rather than priorizing however re-assess based on growth to see if we need to focus more on a single area and get more volunteers on key areas.\nFAQ Doc - still in progress\n\nCAMIS- ONCO: Soma Sekhar\n\nStarted work on poster due July 28th.\nAfter presentation could convert to a white paper. ACTION: send out a draft plan for white paper, & lyn to add to agenda for discussion next meeting. Planning to evaluate endpoints for oncology. Table of endpoints required for approval.\n\nAOB\nNext meeting 14th Aug. Lyn on vacation, will move back 1 week."
       },
       {
    -    "objectID": "R/wilcoxonsr_hodges_lehman.html",
    -    "href": "R/wilcoxonsr_hodges_lehman.html",
    -    "title": "Wilcoxon signed-rank test",
    +    "objectID": "minutes/posts/12Feb2024.html",
    +    "href": "minutes/posts/12Feb2024.html",
    +    "title": "Website structure update, Team list, Conferences",
         "section": "",
    -    "text": "Introduction\nWilcoxon signed-rank test is a non-parametric test which is sometimes used instead of the paired Student’s t-test when assumptions regarding a normal distribution are not valid. It is a rank test, designed for analyzing repeated measures or paired observations by a paired comparison (a type of location test) to assess whether their population means differ. Whilst it does not ‘compare’ means or medians for a set of paired data, it ranks the results on A and ranks the results on B, then compares if Prob(A>B) > Prob(B>A).\nTies are when you have two observations with the same result. For example, in a 2-period cross-over study, you take the difference between result on Treatment A minus result on Treatment B and find that two or more subjects have the same difference.\nAdditionally, “0s” can cause some trouble as well. For example when the difference between result on Treatment A minus result on Treatment B equals 0.\n\n\nData\nAnalysis will be conducted on the example of anonymized data from 2-period, cross-over study comparing treatments A and B in patients with asthma and acute airway obstruction induced by repeated mannitol challenges.\nWilcoxon signed rank test was applied to analyse the time to return to baseline FEV1 post-mannitol challenge 2. Median difference, p value and 95% CI were provided using the Hodges-Lehmann estimate.\n\nhead(blood_p)\n\n  patient  sex agegrp bp_before bp_after\n1       1 Male  30-45   143.670  153.316\n2       2 Male  30-45   163.082  170.576\n3       3 Male  30-45   153.393  168.599\n4       4 Male  30-45   153.082  142.358\n5       5 Male  30-45   146.720  141.193\n6       6 Male  30-45   150.668  147.204\n\n\n\n\nDataset without ties\nLet’s consider a case where the dataset has no ties.\n\n\nAvailable packages\nIn R Wilcoxon signed rank test can be performed using for example DOS (version 0.5.2) or stats (version 3.6.2) package.\n\nstats\nFunction wilcox.test used for Wilcoxon Rank Sum and Signed Rank Tests will be applied. For more information about that function go here\nWe will focus on the below arguments: - alternative - paired - exact - correct - conf.int.\n\n\n\nExamples\n\n# Exact \nstats::wilcox.test(x = blood_p$bp_after, y = blood_p$bp_before, \n                                   paired = TRUE, \n                                   conf.int = TRUE, \n                                   conf.level = 0.9, \n                                   alterative = \"two.sided\", \n                                   exact = TRUE)\n\n\n    Wilcoxon signed rank exact test\n\ndata:  blood_p$bp_after and blood_p$bp_before\nV = 17251, p-value = 0.009379\nalternative hypothesis: true location shift is not equal to 0\n90 percent confidence interval:\n 1.5045 5.9945\nsample estimates:\n(pseudo)median \n       3.68875 \n\n# No exact & continuity correction\nstats::wilcox.test(x = blood_p$bp_after, y = blood_p$bp_before, \n                                   paired = TRUE, \n                                   conf.int = TRUE, \n                                   conf.level = 0.9, \n                                   alterative = \"two.sided\", \n                                   exact = FALSE, \n                                   correct = TRUE)\n\n\n    Wilcoxon signed rank test with continuity correction\n\ndata:  blood_p$bp_after and blood_p$bp_before\nV = 17251, p-value = 0.009548\nalternative hypothesis: true location shift is not equal to 0\n90 percent confidence interval:\n 1.504565 5.994467\nsample estimates:\n(pseudo)median \n      3.688796 \n\n# No exact & No continuity correction\nstats::wilcox.test(x = blood_p$bp_after, y = blood_p$bp_before, \n                                     paired = TRUE, \n                                     conf.int = TRUE, \n                                     conf.level = 0.9, \n                                     alterative = \"two.sided\" , \n                                     exact = FALSE, \n                                     correct = FALSE)\n\n\n    Wilcoxon signed rank test\n\ndata:  blood_p$bp_after and blood_p$bp_before\nV = 17251, p-value = 0.009535\nalternative hypothesis: true location shift is not equal to 0\n90 percent confidence interval:\n 1.504991 5.993011\nsample estimates:\n(pseudo)median \n      3.688796 \n\n\n\n\nImportant notes on stats:wilcox.test\n\nBy default an exact p-value is computed if the samples size is less than 50 and there are no ties. Otherwise, a normal approximation is used.\nIf exact p-values are available, an exact confidence interval is obtained by the algorithm described in Bauer (1972), and the Hodges-Lehmann estimator is employed. Otherwise, the returned confidence interval and point estimate are based on normal approximations.\nIf non-exact p-value is calculated, continuity correction in the normal approximation for the p-value can be applied with correct argument.\nStatistic V is provided, which is a test statistic based on Sprent (1993) algorithm\n\n\nDOS2\nFunction senWilcox used for Sensitivity Analysis for Wilcoxon’s Signed-rank Statistic will be applied. For more information about that function go here\n\n\n\nExamples\n\nDOS2::senWilcox(blood_p$bp_after - blood_p$bp_before, \n                   gamma = 1, \n                   conf.int = TRUE, \n                   alpha = 0.1, \n                   alternative = \"twosided\")\n\n$pval\n[1] 0.009534732\n\n$estimate\n     low     high \n3.688796 3.688796 \n\n$ci\n    low    high \n1.50494 5.99305 \n\n\n\n\nImportant notes on DOS2:senWilcox\n\nGamma >= 1 is the value of the sensitivity parameter. If gamma=1, then you are assuming ignorable treatment assignment or equivalently no unmeasured confounding - that is the considered scenario in our example, sensitivity analysis is not performed.\nOnly p value, estimate and CI are provided\n\n\n\nCoin package - coming soon!"
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n12_Feb_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nYes\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nYes\n\n\nVikash Jain\nYes\n\n\nMia Qi\nYes\n\n\nLeon Shi\nYes\n\n\nVandaya Yadav\nYes\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nYes\n\n\nVidya Gopal\nYes\n\n\nDhvani Patel\nYes\n\n\nKyle Lee\nYes\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nNo\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nNo\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\nSunil\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nUpdated website demo – Chi & Christina\nCAMIS membership form / data collection – Lyn\nhttps://docs.google.com/forms/d/e/1FAIpQLSdDX79P5ByStVS_3n4tK1mAWidazIiF6DMEtDMK8KqmJywjqA/viewform?vc=0&c=0&w=1&flr=0&usp=mail_form_link\nNOTE:  We will only collect: team members name, email address, organization, software used, interested in oncology, key interests and affiliations to stats organizations.  The email address is solely for the CAMIS leadership team, to make sure you are included in CAMIS emails.\nWe ask on the form: “Are you happy for your Name and company and interests to be visible on the CAMIS website. Note that email addresses will not be visible”. \nIf you do not give permission then your name will not appear on the CAMIS repo as a CAMIS team member. If you do give permission, your name and company and interests will appear but your email addresses will be hidden from public view. At any time you can ask to be removed from the website team list by emailing me.\nPhuse css workshop for 2024 / CAMIS ONCO– Soma/Vikash/Harshil\n\nFilip, Lyn & Chrstina met re: Python content\nNext steps for workshop & white paper\n\nOther conferences\n\nKeaven - attending JSM & ISBN - and will mention CAMIS.\nChi attending use R conference, Lyn/Christina/All: please review abstract if you wish.\nRegulatory stats workshop: Leon Shih (poster)\n\nVolunteers requested for:\n\nOpenstatsware Bayesian MMRM  {brms.mmrm} package input :  Christine/Orla\nMMRM - Volunteer please to look at Proc Mixed vs Proc GLIMMIX for the SAS/mmrm.qmd file (Stephen McCawille & Leon Shi may be able to look at this in future ).\n\nAOB\n\nChristina: Create a 1 slide - This is CAMIS.\nLyn: Load up Dec2023 blog post\nChi: Add links to blogs & add blog tab when we have content"
       },
       {
    -    "objectID": "R/xgboost.html",
    -    "href": "R/xgboost.html",
    -    "title": "XGBoost",
    +    "objectID": "minutes/posts/12Aug2024.html",
    +    "href": "minutes/posts/12Aug2024.html",
    +    "title": "Novartis Hackathon & Content growth",
         "section": "",
    -    "text": "XGBoost which stands for eXtreme Gradient Boosting is an efficent implementation of gradient boosting. Gradient boosting is an ensemble technique in machine learning. Unlike traditional models that learn from the data independently, boosting combines the predictions of multiple weak learners to create a single, more accurate strong learner.\nAn XGBoost model is based on trees, so we don’t need to do much preprocessing for our data; we don’t need to worry about the factors or centering or scaling our data.\n\n\nThere are multiple packages that can be used to to implement xgboost in R.\n\n{tidymodels}\n{xgboost}\n{caret}\n\n{tidymodels} and {caret} easy ways to access xgboost easily. This example will use {tidymodels} because of the functionality included in {tidymodels} and is being heavily supported by Posit.\n\n\n\nData used for this example is birthwt which is part of the {MASS} package. This data-set considers a number of risk factors associated with birth weight in infants.\n\nlibrary(tidyverse)\n\n── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──\n✔ dplyr     1.1.4     ✔ readr     2.1.5\n✔ forcats   1.0.0     ✔ stringr   1.5.1\n✔ ggplot2   3.5.1     ✔ tibble    3.2.1\n✔ lubridate 1.9.3     ✔ tidyr     1.3.1\n✔ purrr     1.0.2     \n── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag()    masks stats::lag()\nℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors\n\nlibrary(MASS)\n\n\nAttaching package: 'MASS'\n\nThe following object is masked from 'package:dplyr':\n\n    select\n\nlibrary(tidymodels)\n\n── Attaching packages ────────────────────────────────────── tidymodels 1.2.0 ──\n✔ broom        1.0.7     ✔ rsample      1.2.1\n✔ dials        1.3.0     ✔ tune         1.2.1\n✔ infer        1.0.7     ✔ workflows    1.1.4\n✔ modeldata    1.4.0     ✔ workflowsets 1.1.0\n✔ parsnip      1.2.1     ✔ yardstick    1.3.1\n✔ recipes      1.1.0     \n── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──\n✖ scales::discard() masks purrr::discard()\n✖ dplyr::filter()   masks stats::filter()\n✖ recipes::fixed()  masks stringr::fixed()\n✖ dplyr::lag()      masks stats::lag()\n✖ MASS::select()    masks dplyr::select()\n✖ yardstick::spec() masks readr::spec()\n✖ recipes::step()   masks stats::step()\n• Use tidymodels_prefer() to resolve common conflicts.\n\nlibrary(xgboost)\n\n\nAttaching package: 'xgboost'\n\nThe following object is masked from 'package:dplyr':\n\n    slice\n\nhead(birthwt)\n\n   low age lwt race smoke ptl ht ui ftv  bwt\n85   0  19 182    2     0   0  0  1   0 2523\n86   0  33 155    3     0   0  0  0   3 2551\n87   0  20 105    1     1   0  0  0   1 2557\n88   0  21 108    1     1   0  0  1   2 2594\n89   0  18 107    1     1   0  0  1   0 2600\n91   0  21 124    3     0   0  0  0   0 2622\n\n\nOur modeling goal using the birthwt dataset is to predict whether the birth weight is low or not low based on factors such as mother’s age, smoking status, and history of hypertension.\n\n\n\nUse {tidymodels} metadata package to split the data into training and testing data. For classification, we need to change the Low variable into a factor, since currently coded as an integer (0,1).\n\nbirthwt <- \n  birthwt %>% \n  mutate(\n    low_f = lvls_revalue(factor(low), c(\"Not Low\", \"Low\")),\n    smoke_f = lvls_revalue(factor(smoke), c(\"Non-smoker\", \"Smoker\"))\n  )\n\n\nbrthwt_split <- initial_split(birthwt, strata = low)\nbrthwt_train <- training(brthwt_split)\nbrthwt_test <- testing(brthwt_split)\n\n\n\nAfter creating the data split, we setup the params of the model.\n\nxgboost_spec <- \n  boost_tree(trees = 15) %>% \n  # This model can be used for classification or regression, so set mode\n  set_mode(\"classification\") %>% \n  set_engine(\"xgboost\")\n\nxgboost_spec\n\nBoosted Tree Model Specification (classification)\n\nMain Arguments:\n  trees = 15\n\nComputational engine: xgboost \n\nxgboost_cls_fit <- xgboost_spec %>% fit(low_f ~ ., data = brthwt_train)\nxgboost_cls_fit\n\nparsnip model object\n\n##### xgb.Booster\nraw: 15.2 Kb \ncall:\n  xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, \n    colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, \n    subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, \n    verbose = 0, nthread = 1, objective = \"binary:logistic\")\nparams (as set within xgb.train):\n  eta = \"0.3\", max_depth = \"6\", gamma = \"0\", colsample_bytree = \"1\", colsample_bynode = \"1\", min_child_weight = \"1\", subsample = \"1\", nthread = \"1\", objective = \"binary:logistic\", validate_parameters = \"TRUE\"\nxgb.attributes:\n  niter\ncallbacks:\n  cb.evaluation.log()\n# of features: 12 \nniter: 15\nnfeatures : 12 \nevaluation_log:\n  iter training_logloss\n <num>            <num>\n     1       0.44894346\n     2       0.31033704\n   ---              ---\n    14       0.01571681\n    15       0.01396153\n\nbind_cols(\n  predict(xgboost_cls_fit, brthwt_test),\n  predict(xgboost_cls_fit, brthwt_test, type = \"prob\")\n)\n\n# A tibble: 48 × 3\n   .pred_class `.pred_Not Low` .pred_Low\n   <fct>                 <dbl>     <dbl>\n 1 Not Low               0.979    0.0209\n 2 Not Low               0.985    0.0151\n 3 Not Low               0.985    0.0151\n 4 Not Low               0.985    0.0151\n 5 Not Low               0.985    0.0151\n 6 Not Low               0.988    0.0116\n 7 Not Low               0.988    0.0116\n 8 Not Low               0.988    0.0116\n 9 Not Low               0.988    0.0116\n10 Not Low               0.988    0.0116\n# ℹ 38 more rows\n\n\n\n\n\nTo perform xgboost with regression, when setting up the parameter of the model, set the mode of xgboost to regression. After that switch and then changing the variable of interest back to an integer, the rest of the code is the same.\n\nxgboost_reg_spec <- \n  boost_tree(trees = 15) %>% \n  # This model can be used for classification or regression, so set mode\n  set_mode(\"regression\") %>% \n  set_engine(\"xgboost\")\n\nxgboost_reg_spec\n\nBoosted Tree Model Specification (regression)\n\nMain Arguments:\n  trees = 15\n\nComputational engine: xgboost \n\n# For a regression model, the outcome should be `numeric`, not a `factor`.\nxgboost_reg_fit <- xgboost_reg_spec %>% fit(low~ ., data = brthwt_train)\nxgboost_reg_fit \n\nparsnip model object\n\n##### xgb.Booster\nraw: 15.2 Kb \ncall:\n  xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, \n    colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, \n    subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, \n    verbose = 0, nthread = 1, objective = \"reg:squarederror\")\nparams (as set within xgb.train):\n  eta = \"0.3\", max_depth = \"6\", gamma = \"0\", colsample_bytree = \"1\", colsample_bynode = \"1\", min_child_weight = \"1\", subsample = \"1\", nthread = \"1\", objective = \"reg:squarederror\", validate_parameters = \"TRUE\"\nxgb.attributes:\n  niter\ncallbacks:\n  cb.evaluation.log()\n# of features: 13 \nniter: 15\nnfeatures : 13 \nevaluation_log:\n  iter training_rmse\n <num>         <num>\n     1   0.352094163\n     2   0.247943366\n   ---           ---\n    14   0.003690328\n    15   0.002599106\n\npredict(xgboost_reg_fit , brthwt_test)\n\n# A tibble: 48 × 1\n     .pred\n     <dbl>\n 1 0.00253\n 2 0.00253\n 3 0.00253\n 4 0.00253\n 5 0.00253\n 6 0.00253\n 7 0.00253\n 8 0.00253\n 9 0.00253\n10 0.00253\n# ℹ 38 more rows\n\n\n\n\n\n\n\nXGBoost with tidymodels by Julia Silge\n\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 22.04.5 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-10\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package      * version    date (UTC) lib source\n P backports      1.5.0      2024-05-23 [?] RSPM (R 4.4.0)\n P broom        * 1.0.7      2024-09-26 [?] RSPM (R 4.4.0)\n   class          7.3-22     2023-05-03 [2] CRAN (R 4.4.0)\n P cli            3.6.3      2024-06-21 [?] RSPM (R 4.4.0)\n   codetools      0.2-20     2024-03-31 [2] CRAN (R 4.4.0)\n P colorspace     2.1-1      2024-07-26 [?] RSPM (R 4.4.0)\n P data.table     1.16.0     2024-08-27 [?] RSPM (R 4.4.0)\n P dials        * 1.3.0      2024-07-30 [?] RSPM (R 4.4.0)\n P DiceDesign     1.10       2023-12-07 [?] RSPM (R 4.4.0)\n P digest         0.6.37     2024-08-19 [?] RSPM (R 4.4.0)\n P dplyr        * 1.1.4      2023-11-17 [?] RSPM (R 4.4.0)\n P evaluate       1.0.0      2024-09-17 [?] RSPM (R 4.4.0)\n P fansi          1.0.6      2023-12-08 [?] RSPM (R 4.4.0)\n P fastmap        1.2.0      2024-05-15 [?] RSPM (R 4.4.0)\n P forcats      * 1.0.0      2023-01-29 [?] RSPM (R 4.4.0)\n P foreach        1.5.2      2022-02-02 [?] RSPM (R 4.4.0)\n P furrr          0.3.1      2022-08-15 [?] RSPM (R 4.4.0)\n P future         1.34.0     2024-07-29 [?] RSPM (R 4.4.0)\n P future.apply   1.11.2     2024-03-28 [?] RSPM (R 4.4.0)\n P generics       0.1.3      2022-07-05 [?] RSPM (R 4.4.0)\n P ggplot2      * 3.5.1      2024-04-23 [?] RSPM (R 4.4.0)\n P globals        0.16.3     2024-03-08 [?] RSPM (R 4.4.0)\n P glue           1.8.0      2024-09-30 [?] RSPM (R 4.4.0)\n P gower          1.0.1      2022-12-22 [?] RSPM (R 4.4.0)\n P GPfit          1.0-8      2019-02-08 [?] RSPM (R 4.4.0)\n P gtable         0.3.5      2024-04-22 [?] RSPM (R 4.4.0)\n P hardhat        1.4.0      2024-06-02 [?] RSPM (R 4.4.0)\n P hms            1.1.3      2023-03-21 [?] RSPM (R 4.4.0)\n P htmltools      0.5.8.1    2024-04-04 [?] RSPM (R 4.4.0)\n P htmlwidgets    1.6.4      2023-12-06 [?] RSPM (R 4.4.0)\n P infer        * 1.0.7      2024-03-25 [?] RSPM (R 4.4.0)\n P ipred          0.9-15     2024-07-18 [?] RSPM (R 4.4.0)\n P iterators      1.0.14     2022-02-05 [?] RSPM (R 4.4.0)\n P jsonlite       1.8.9      2024-09-20 [?] RSPM (R 4.4.0)\n P knitr          1.48       2024-07-07 [?] RSPM (R 4.4.0)\n   lattice        0.22-6     2024-03-20 [2] CRAN (R 4.4.0)\n P lava           1.8.0      2024-03-05 [?] RSPM (R 4.4.0)\n P lhs            1.2.0      2024-06-30 [?] RSPM (R 4.4.0)\n P lifecycle      1.0.4      2023-11-07 [?] RSPM (R 4.4.0)\n P listenv        0.9.1      2024-01-29 [?] RSPM (R 4.4.0)\n P lubridate    * 1.9.3      2023-09-27 [?] RSPM (R 4.4.0)\n P magrittr       2.0.3      2022-03-30 [?] RSPM (R 4.4.0)\n   MASS         * 7.3-60.2   2024-08-22 [2] local\n   Matrix         1.7-0      2024-03-22 [2] CRAN (R 4.4.0)\n P modeldata    * 1.4.0      2024-06-19 [?] RSPM (R 4.4.0)\n P munsell        0.5.1      2024-04-01 [?] RSPM (R 4.4.0)\n   nnet           7.3-19     2023-05-03 [2] CRAN (R 4.4.0)\n P parallelly     1.38.0     2024-07-27 [?] RSPM (R 4.4.0)\n P parsnip      * 1.2.1      2024-03-22 [?] RSPM (R 4.4.0)\n P pillar         1.9.0      2023-03-22 [?] RSPM (R 4.4.0)\n P pkgconfig      2.0.3      2019-09-22 [?] RSPM (R 4.4.0)\n P prodlim        2024.06.25 2024-06-24 [?] RSPM (R 4.4.0)\n P purrr        * 1.0.2      2023-08-10 [?] RSPM (R 4.4.0)\n P R6             2.5.1      2021-08-19 [?] RSPM (R 4.4.0)\n P Rcpp           1.0.13     2024-07-17 [?] RSPM (R 4.4.0)\n P readr        * 2.1.5      2024-01-10 [?] RSPM (R 4.4.0)\n P recipes      * 1.1.0      2024-07-04 [?] RSPM (R 4.4.0)\n   renv           1.0.10     2024-10-05 [1] RSPM (R 4.4.0)\n P rlang          1.1.4      2024-06-04 [?] RSPM (R 4.4.0)\n P rmarkdown      2.28       2024-08-17 [?] RSPM (R 4.4.0)\n   rpart          4.1.23     2023-12-05 [2] CRAN (R 4.4.0)\n P rsample      * 1.2.1      2024-03-25 [?] RSPM (R 4.4.0)\n P rstudioapi     0.16.0     2024-03-24 [?] RSPM (R 4.4.0)\n P scales       * 1.3.0      2023-11-28 [?] RSPM (R 4.4.0)\n P sessioninfo    1.2.2      2021-12-06 [?] RSPM (R 4.4.0)\n P stringi        1.8.4      2024-05-06 [?] RSPM (R 4.4.0)\n P stringr      * 1.5.1      2023-11-14 [?] RSPM (R 4.4.0)\n P survival       3.7-0      2024-06-05 [?] RSPM (R 4.4.0)\n P tibble       * 3.2.1      2023-03-20 [?] RSPM (R 4.4.0)\n P tidymodels   * 1.2.0      2024-03-25 [?] RSPM (R 4.4.0)\n P tidyr        * 1.3.1      2024-01-24 [?] RSPM (R 4.4.0)\n P tidyselect     1.2.1      2024-03-11 [?] RSPM (R 4.4.0)\n P tidyverse    * 2.0.0      2023-02-22 [?] RSPM (R 4.4.0)\n P timechange     0.3.0      2024-01-18 [?] RSPM (R 4.4.0)\n P timeDate       4041.110   2024-09-22 [?] RSPM (R 4.4.0)\n P tune         * 1.2.1      2024-04-18 [?] RSPM (R 4.4.0)\n P tzdb           0.4.0      2023-05-12 [?] RSPM (R 4.4.0)\n P utf8           1.2.4      2023-10-22 [?] RSPM (R 4.4.0)\n P vctrs          0.6.5      2023-12-01 [?] RSPM (R 4.4.0)\n P withr          3.0.1      2024-07-31 [?] RSPM (R 4.4.0)\n P workflows    * 1.1.4      2024-02-19 [?] RSPM (R 4.4.0)\n P workflowsets * 1.1.0      2024-03-21 [?] RSPM (R 4.4.0)\n P xfun           0.48       2024-10-03 [?] RSPM (R 4.4.0)\n P xgboost      * 1.7.8.1    2024-07-24 [?] RSPM (R 4.4.0)\n P yaml           2.3.10     2024-07-26 [?] RSPM (R 4.4.0)\n P yardstick    * 1.3.1      2024-03-21 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────"
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n12_Aug_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nNo\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nNo\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nNo\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nNo\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nYes\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nYes\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nAshwath Gadapa\nYes\n\n\nMiriam Amor\nYes\n\n\nAnwesha Roy\nYes\n\n\nSamrit Pramanik\nYes\n\n\nAgnieszka Tomczyk\nYes\n\n\nPrem Kant Shekhar\nNo\n\n\nSunil\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\nWelcome\nWelcome to our new team members on the call.  We have an agenda which is sent prior to the meeting, but please do please ask if you have questions or need clarification regarding what we are talking about.\n\nRepository Content\nNovartis Hackathon\nThe Hackathon was a great success, with CAMIS receiving it’s largest amount of pull requests in any one month to date ! Christina fed back that it was not as much work as you might think, as although they had ‘office hours’ to help people and discuss things, actually not many people used them. Instead, they gave a brief introduction to everyone attending, explaining git / github / pull requests etc, then assigned everyone a topic / mini projects to investigate and let them do the research in their own time.\nOrla & team reviewed each others pull requests prior to submission to CAMIS repo. Christina worked alongside the team approving the content to go live.\nAs it went so well, Christina is planning another hackathon style event in October, but it will be on wider concept, focused on people who haven’t done pull requests to get more involved with open source projects. We can submit CAMIS topics for them to complete.\nIf you or your company interested in hackathon ask christina.\nSurvival\nWill continue to meet and discuss survival needs, some Accelerated failure time content going in as part of hackathon.\nAssignment table / Raising issues\nACTION: Lyn to remove and we will use issues instead, If you have been on a issue for >6 months and have not provided us with any feedback on your progress, then you will be unassigned. Obviously if you need more time and are still working on it, just let Christina or another one of the project leads know.\nIf you want to research a topic, please add an issue or issue comment to tell us what you are working on.\nEnsuring content quality & cross page cohesiveness\nTo date, focus was on population of the pages we were missing, however as we move towards having content available, we will need people to review that content to ensure it is of high quality and makes sense. Ideally, the same dataset would be run through R and SAS showing options, then the comparison would discuss the discrepancies in the results obtained and perhaps the differences in default options / available options.\nWe now have a template for the SAS, and R pages.. and a different one for the comparison pages. This may help us with consistency. Please use the templates if you are starting the work now, it’s Ok to do a PR for anything you are already working on, even if the template wasn’t used.\n\n\nConferences\n\nPHUSE EU Brussels 23rd Sept - Qian Wang (Merck) will attend.\nR/Pharma APAC track – Samrit has submitted an abstract so hopefully will be able to represent us.\nSouthEast SAS User Group (SESUG) – Bethesda: Brian will give us a mention.\nPHUSE EU – Stephen Mccawille, Anwesha Roy, Agniekska Tomczyk & Christina Fillmore are all attending PHUSE EU – if you are attending let Christina know and she will arrange for CAMIS team to meet up for a cuppa & chat at the conference.\nPhuse US Connect November: Maryland. Cuifeng Yin may be able to attend. Lyn asked for volunteers to represent us a US connect and maybe CSS? ACTION : ask PHUSE re: getting a workshop or seminar for CAMIS if we can find volunteers, TBC if at (US CONNECT / or CSS? Or both? )\nChi provided feedback from UseR! We may consider using a better title for abstracts, not just CAMIS. The talk was put into a community stream instead of a multilingual programming stream, so may have got better attendance, but still it was well received. 1 person attended requested that they would like to write an article on CAMIS, so Chi will work with them on that."
       },
       {
    -    "objectID": "R/xgboost.html#available-r-packages",
    -    "href": "R/xgboost.html#available-r-packages",
    -    "title": "XGBoost",
    +    "objectID": "minutes/posts/8Apr2024.html",
    +    "href": "minutes/posts/8Apr2024.html",
    +    "title": "General linear models is complete",
         "section": "",
    -    "text": "There are multiple packages that can be used to to implement xgboost in R.\n\n{tidymodels}\n{xgboost}\n{caret}\n\n{tidymodels} and {caret} easy ways to access xgboost easily. This example will use {tidymodels} because of the functionality included in {tidymodels} and is being heavily supported by Posit."
    +    "text": "attendees\n08_Apr_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nYes\n\n\nMia Qi\nNo\n\n\nLeon Shi\nYes\n\n\nVandaya Yadav\nYes\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nYes\n\n\nLukas Brausch\nYes\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nYes\n\n\nAiming Yang\nYes\n\n\nCuifeng Yin\nYes\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\nSunil\nNo"
       },
       {
    -    "objectID": "R/xgboost.html#data-used",
    -    "href": "R/xgboost.html#data-used",
    -    "title": "XGBoost",
    -    "section": "",
    -    "text": "Data used for this example is birthwt which is part of the {MASS} package. This data-set considers a number of risk factors associated with birth weight in infants.\n\nlibrary(tidyverse)\n\n── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──\n✔ dplyr     1.1.4     ✔ readr     2.1.5\n✔ forcats   1.0.0     ✔ stringr   1.5.1\n✔ ggplot2   3.5.1     ✔ tibble    3.2.1\n✔ lubridate 1.9.3     ✔ tidyr     1.3.1\n✔ purrr     1.0.2     \n── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag()    masks stats::lag()\nℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors\n\nlibrary(MASS)\n\n\nAttaching package: 'MASS'\n\nThe following object is masked from 'package:dplyr':\n\n    select\n\nlibrary(tidymodels)\n\n── Attaching packages ────────────────────────────────────── tidymodels 1.2.0 ──\n✔ broom        1.0.7     ✔ rsample      1.2.1\n✔ dials        1.3.0     ✔ tune         1.2.1\n✔ infer        1.0.7     ✔ workflows    1.1.4\n✔ modeldata    1.4.0     ✔ workflowsets 1.1.0\n✔ parsnip      1.2.1     ✔ yardstick    1.3.1\n✔ recipes      1.1.0     \n── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──\n✖ scales::discard() masks purrr::discard()\n✖ dplyr::filter()   masks stats::filter()\n✖ recipes::fixed()  masks stringr::fixed()\n✖ dplyr::lag()      masks stats::lag()\n✖ MASS::select()    masks dplyr::select()\n✖ yardstick::spec() masks readr::spec()\n✖ recipes::step()   masks stats::step()\n• Use tidymodels_prefer() to resolve common conflicts.\n\nlibrary(xgboost)\n\n\nAttaching package: 'xgboost'\n\nThe following object is masked from 'package:dplyr':\n\n    slice\n\nhead(birthwt)\n\n   low age lwt race smoke ptl ht ui ftv  bwt\n85   0  19 182    2     0   0  0  1   0 2523\n86   0  33 155    3     0   0  0  0   3 2551\n87   0  20 105    1     1   0  0  0   1 2557\n88   0  21 108    1     1   0  0  1   2 2594\n89   0  18 107    1     1   0  0  1   0 2600\n91   0  21 124    3     0   0  0  0   0 2622\n\n\nOur modeling goal using the birthwt dataset is to predict whether the birth weight is low or not low based on factors such as mother’s age, smoking status, and history of hypertension."
    +    "objectID": "minutes/posts/8Apr2024.html#this-months-achievements",
    +    "href": "minutes/posts/8Apr2024.html#this-months-achievements",
    +    "title": "General linear models is complete",
    +    "section": "This months achievements",
    +    "text": "This months achievements\nGeneral Linear Models is Complete !\nThanks David & others for great contributions this month.\nWe are seeing more python examples coming through too."
       },
       {
    -    "objectID": "R/xgboost.html#example-code",
    -    "href": "R/xgboost.html#example-code",
    -    "title": "XGBoost",
    -    "section": "",
    -    "text": "Use {tidymodels} metadata package to split the data into training and testing data. For classification, we need to change the Low variable into a factor, since currently coded as an integer (0,1).\n\nbirthwt <- \n  birthwt %>% \n  mutate(\n    low_f = lvls_revalue(factor(low), c(\"Not Low\", \"Low\")),\n    smoke_f = lvls_revalue(factor(smoke), c(\"Non-smoker\", \"Smoker\"))\n  )\n\n\nbrthwt_split <- initial_split(birthwt, strata = low)\nbrthwt_train <- training(brthwt_split)\nbrthwt_test <- testing(brthwt_split)\n\n\n\nAfter creating the data split, we setup the params of the model.\n\nxgboost_spec <- \n  boost_tree(trees = 15) %>% \n  # This model can be used for classification or regression, so set mode\n  set_mode(\"classification\") %>% \n  set_engine(\"xgboost\")\n\nxgboost_spec\n\nBoosted Tree Model Specification (classification)\n\nMain Arguments:\n  trees = 15\n\nComputational engine: xgboost \n\nxgboost_cls_fit <- xgboost_spec %>% fit(low_f ~ ., data = brthwt_train)\nxgboost_cls_fit\n\nparsnip model object\n\n##### xgb.Booster\nraw: 15.2 Kb \ncall:\n  xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, \n    colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, \n    subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, \n    verbose = 0, nthread = 1, objective = \"binary:logistic\")\nparams (as set within xgb.train):\n  eta = \"0.3\", max_depth = \"6\", gamma = \"0\", colsample_bytree = \"1\", colsample_bynode = \"1\", min_child_weight = \"1\", subsample = \"1\", nthread = \"1\", objective = \"binary:logistic\", validate_parameters = \"TRUE\"\nxgb.attributes:\n  niter\ncallbacks:\n  cb.evaluation.log()\n# of features: 12 \nniter: 15\nnfeatures : 12 \nevaluation_log:\n  iter training_logloss\n <num>            <num>\n     1       0.44894346\n     2       0.31033704\n   ---              ---\n    14       0.01571681\n    15       0.01396153\n\nbind_cols(\n  predict(xgboost_cls_fit, brthwt_test),\n  predict(xgboost_cls_fit, brthwt_test, type = \"prob\")\n)\n\n# A tibble: 48 × 3\n   .pred_class `.pred_Not Low` .pred_Low\n   <fct>                 <dbl>     <dbl>\n 1 Not Low               0.979    0.0209\n 2 Not Low               0.985    0.0151\n 3 Not Low               0.985    0.0151\n 4 Not Low               0.985    0.0151\n 5 Not Low               0.985    0.0151\n 6 Not Low               0.988    0.0116\n 7 Not Low               0.988    0.0116\n 8 Not Low               0.988    0.0116\n 9 Not Low               0.988    0.0116\n10 Not Low               0.988    0.0116\n# ℹ 38 more rows\n\n\n\n\n\nTo perform xgboost with regression, when setting up the parameter of the model, set the mode of xgboost to regression. After that switch and then changing the variable of interest back to an integer, the rest of the code is the same.\n\nxgboost_reg_spec <- \n  boost_tree(trees = 15) %>% \n  # This model can be used for classification or regression, so set mode\n  set_mode(\"regression\") %>% \n  set_engine(\"xgboost\")\n\nxgboost_reg_spec\n\nBoosted Tree Model Specification (regression)\n\nMain Arguments:\n  trees = 15\n\nComputational engine: xgboost \n\n# For a regression model, the outcome should be `numeric`, not a `factor`.\nxgboost_reg_fit <- xgboost_reg_spec %>% fit(low~ ., data = brthwt_train)\nxgboost_reg_fit \n\nparsnip model object\n\n##### xgb.Booster\nraw: 15.2 Kb \ncall:\n  xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, \n    colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, \n    subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, \n    verbose = 0, nthread = 1, objective = \"reg:squarederror\")\nparams (as set within xgb.train):\n  eta = \"0.3\", max_depth = \"6\", gamma = \"0\", colsample_bytree = \"1\", colsample_bynode = \"1\", min_child_weight = \"1\", subsample = \"1\", nthread = \"1\", objective = \"reg:squarederror\", validate_parameters = \"TRUE\"\nxgb.attributes:\n  niter\ncallbacks:\n  cb.evaluation.log()\n# of features: 13 \nniter: 15\nnfeatures : 13 \nevaluation_log:\n  iter training_rmse\n <num>         <num>\n     1   0.352094163\n     2   0.247943366\n   ---           ---\n    14   0.003690328\n    15   0.002599106\n\npredict(xgboost_reg_fit , brthwt_test)\n\n# A tibble: 48 × 1\n     .pred\n     <dbl>\n 1 0.00253\n 2 0.00253\n 3 0.00253\n 4 0.00253\n 5 0.00253\n 6 0.00253\n 7 0.00253\n 8 0.00253\n 9 0.00253\n10 0.00253\n# ℹ 38 more rows"
    +    "objectID": "minutes/posts/8Apr2024.html#checklist-for-pull-requests",
    +    "href": "minutes/posts/8Apr2024.html#checklist-for-pull-requests",
    +    "title": "General linear models is complete",
    +    "section": "Checklist for pull requests",
    +    "text": "Checklist for pull requests\nChristina will add something to help ensure a smooth process"
       },
       {
    -    "objectID": "R/xgboost.html#reference",
    -    "href": "R/xgboost.html#reference",
    -    "title": "XGBoost",
    -    "section": "",
    -    "text": "XGBoost with tidymodels by Julia Silge\n\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 22.04.5 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-10\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package      * version    date (UTC) lib source\n P backports      1.5.0      2024-05-23 [?] RSPM (R 4.4.0)\n P broom        * 1.0.7      2024-09-26 [?] RSPM (R 4.4.0)\n   class          7.3-22     2023-05-03 [2] CRAN (R 4.4.0)\n P cli            3.6.3      2024-06-21 [?] RSPM (R 4.4.0)\n   codetools      0.2-20     2024-03-31 [2] CRAN (R 4.4.0)\n P colorspace     2.1-1      2024-07-26 [?] RSPM (R 4.4.0)\n P data.table     1.16.0     2024-08-27 [?] RSPM (R 4.4.0)\n P dials        * 1.3.0      2024-07-30 [?] RSPM (R 4.4.0)\n P DiceDesign     1.10       2023-12-07 [?] RSPM (R 4.4.0)\n P digest         0.6.37     2024-08-19 [?] RSPM (R 4.4.0)\n P dplyr        * 1.1.4      2023-11-17 [?] RSPM (R 4.4.0)\n P evaluate       1.0.0      2024-09-17 [?] RSPM (R 4.4.0)\n P fansi          1.0.6      2023-12-08 [?] RSPM (R 4.4.0)\n P fastmap        1.2.0      2024-05-15 [?] RSPM (R 4.4.0)\n P forcats      * 1.0.0      2023-01-29 [?] RSPM (R 4.4.0)\n P foreach        1.5.2      2022-02-02 [?] RSPM (R 4.4.0)\n P furrr          0.3.1      2022-08-15 [?] RSPM (R 4.4.0)\n P future         1.34.0     2024-07-29 [?] RSPM (R 4.4.0)\n P future.apply   1.11.2     2024-03-28 [?] RSPM (R 4.4.0)\n P generics       0.1.3      2022-07-05 [?] RSPM (R 4.4.0)\n P ggplot2      * 3.5.1      2024-04-23 [?] RSPM (R 4.4.0)\n P globals        0.16.3     2024-03-08 [?] RSPM (R 4.4.0)\n P glue           1.8.0      2024-09-30 [?] RSPM (R 4.4.0)\n P gower          1.0.1      2022-12-22 [?] RSPM (R 4.4.0)\n P GPfit          1.0-8      2019-02-08 [?] RSPM (R 4.4.0)\n P gtable         0.3.5      2024-04-22 [?] RSPM (R 4.4.0)\n P hardhat        1.4.0      2024-06-02 [?] RSPM (R 4.4.0)\n P hms            1.1.3      2023-03-21 [?] RSPM (R 4.4.0)\n P htmltools      0.5.8.1    2024-04-04 [?] RSPM (R 4.4.0)\n P htmlwidgets    1.6.4      2023-12-06 [?] RSPM (R 4.4.0)\n P infer        * 1.0.7      2024-03-25 [?] RSPM (R 4.4.0)\n P ipred          0.9-15     2024-07-18 [?] RSPM (R 4.4.0)\n P iterators      1.0.14     2022-02-05 [?] RSPM (R 4.4.0)\n P jsonlite       1.8.9      2024-09-20 [?] RSPM (R 4.4.0)\n P knitr          1.48       2024-07-07 [?] RSPM (R 4.4.0)\n   lattice        0.22-6     2024-03-20 [2] CRAN (R 4.4.0)\n P lava           1.8.0      2024-03-05 [?] RSPM (R 4.4.0)\n P lhs            1.2.0      2024-06-30 [?] RSPM (R 4.4.0)\n P lifecycle      1.0.4      2023-11-07 [?] RSPM (R 4.4.0)\n P listenv        0.9.1      2024-01-29 [?] RSPM (R 4.4.0)\n P lubridate    * 1.9.3      2023-09-27 [?] RSPM (R 4.4.0)\n P magrittr       2.0.3      2022-03-30 [?] RSPM (R 4.4.0)\n   MASS         * 7.3-60.2   2024-08-22 [2] local\n   Matrix         1.7-0      2024-03-22 [2] CRAN (R 4.4.0)\n P modeldata    * 1.4.0      2024-06-19 [?] RSPM (R 4.4.0)\n P munsell        0.5.1      2024-04-01 [?] RSPM (R 4.4.0)\n   nnet           7.3-19     2023-05-03 [2] CRAN (R 4.4.0)\n P parallelly     1.38.0     2024-07-27 [?] RSPM (R 4.4.0)\n P parsnip      * 1.2.1      2024-03-22 [?] RSPM (R 4.4.0)\n P pillar         1.9.0      2023-03-22 [?] RSPM (R 4.4.0)\n P pkgconfig      2.0.3      2019-09-22 [?] RSPM (R 4.4.0)\n P prodlim        2024.06.25 2024-06-24 [?] RSPM (R 4.4.0)\n P purrr        * 1.0.2      2023-08-10 [?] RSPM (R 4.4.0)\n P R6             2.5.1      2021-08-19 [?] RSPM (R 4.4.0)\n P Rcpp           1.0.13     2024-07-17 [?] RSPM (R 4.4.0)\n P readr        * 2.1.5      2024-01-10 [?] RSPM (R 4.4.0)\n P recipes      * 1.1.0      2024-07-04 [?] RSPM (R 4.4.0)\n   renv           1.0.10     2024-10-05 [1] RSPM (R 4.4.0)\n P rlang          1.1.4      2024-06-04 [?] RSPM (R 4.4.0)\n P rmarkdown      2.28       2024-08-17 [?] RSPM (R 4.4.0)\n   rpart          4.1.23     2023-12-05 [2] CRAN (R 4.4.0)\n P rsample      * 1.2.1      2024-03-25 [?] RSPM (R 4.4.0)\n P rstudioapi     0.16.0     2024-03-24 [?] RSPM (R 4.4.0)\n P scales       * 1.3.0      2023-11-28 [?] RSPM (R 4.4.0)\n P sessioninfo    1.2.2      2021-12-06 [?] RSPM (R 4.4.0)\n P stringi        1.8.4      2024-05-06 [?] RSPM (R 4.4.0)\n P stringr      * 1.5.1      2023-11-14 [?] RSPM (R 4.4.0)\n P survival       3.7-0      2024-06-05 [?] RSPM (R 4.4.0)\n P tibble       * 3.2.1      2023-03-20 [?] RSPM (R 4.4.0)\n P tidymodels   * 1.2.0      2024-03-25 [?] RSPM (R 4.4.0)\n P tidyr        * 1.3.1      2024-01-24 [?] RSPM (R 4.4.0)\n P tidyselect     1.2.1      2024-03-11 [?] RSPM (R 4.4.0)\n P tidyverse    * 2.0.0      2023-02-22 [?] RSPM (R 4.4.0)\n P timechange     0.3.0      2024-01-18 [?] RSPM (R 4.4.0)\n P timeDate       4041.110   2024-09-22 [?] RSPM (R 4.4.0)\n P tune         * 1.2.1      2024-04-18 [?] RSPM (R 4.4.0)\n P tzdb           0.4.0      2023-05-12 [?] RSPM (R 4.4.0)\n P utf8           1.2.4      2023-10-22 [?] RSPM (R 4.4.0)\n P vctrs          0.6.5      2023-12-01 [?] RSPM (R 4.4.0)\n P withr          3.0.1      2024-07-31 [?] RSPM (R 4.4.0)\n P workflows    * 1.1.4      2024-02-19 [?] RSPM (R 4.4.0)\n P workflowsets * 1.1.0      2024-03-21 [?] RSPM (R 4.4.0)\n P xfun           0.48       2024-10-03 [?] RSPM (R 4.4.0)\n P xgboost      * 1.7.8.1    2024-07-24 [?] RSPM (R 4.4.0)\n P yaml           2.3.10     2024-07-26 [?] RSPM (R 4.4.0)\n P yardstick    * 1.3.1      2024-03-21 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────"
    +    "objectID": "minutes/posts/8Apr2024.html#css-connect-progress-update-soma-vikash",
    +    "href": "minutes/posts/8Apr2024.html#css-connect-progress-update-soma-vikash",
    +    "title": "General linear models is complete",
    +    "section": "CSS Connect progress update – Soma/ Vikash",
    +    "text": "CSS Connect progress update – Soma/ Vikash\nVikash to reach out to Soma. Harshil unlikely to be available in person, so we can look for further support to attend & help you if needed."
       },
       {
    -    "objectID": "R/manova.html",
    -    "href": "R/manova.html",
    -    "title": "Multivariate Analysis of Variance in R",
    -    "section": "",
    -    "text": "For a detailed description of MANOVA including assumptions see Renesh Bedre\nExample 39.6 Multivariate Analysis of Variance from SAS MANOVA User Guide\nThis example employs multivariate analysis of variance (MANOVA) to measure differences in the chemical characteristics of ancient pottery found at four kiln sites in Great Britain. The data are from Tubb, Parker, and Nickless (1980), as reported in Hand et al. (1994).\nFor each of 26 samples of pottery, the percentages of oxides of five metals are measured. The following statements create the data set and perform a one-way MANOVA. Additionally, it is of interest to know whether the pottery from one site in Wales (Llanederyn) differs from the samples from other sites.\n\nlibrary(tidyverse)\n\n── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──\n✔ dplyr     1.1.4     ✔ readr     2.1.5\n✔ forcats   1.0.0     ✔ stringr   1.5.1\n✔ ggplot2   3.5.1     ✔ tibble    3.2.1\n✔ lubridate 1.9.3     ✔ tidyr     1.3.1\n✔ purrr     1.0.2     \n── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag()    masks stats::lag()\nℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors\n\nlibrary(knitr)\nlibrary(emmeans)\n\nWelcome to emmeans.\nCaution: You lose important information if you filter this package's results.\nSee '? untidy'\n\nknitr::opts_chunk$set(echo = TRUE, cache = TRUE)\npottery <- read.csv(\"../data/manova1.csv\")\npottery\n\n           site   al   fe   mg   ca   na\n1    Llanederyn 14.4 7.00 4.30 0.15 0.51\n2    Llanederyn 13.8 7.08 3.43 0.12 0.17\n3    Llanederyn 14.6 7.09 3.88 0.13 0.20\n4    Llanederyn 11.5 6.37 5.64 0.16 0.14\n5    Llanederyn 13.8 7.06 5.34 0.20 0.20\n6    Llanederyn 10.9 6.26 3.47 0.17 0.22\n7    Llanederyn 10.1 4.26 4.26 0.20 0.18\n8    Llanederyn 11.6 5.78 5.91 0.18 0.16\n9    Llanederyn 11.1 5.49 4.52 0.29 0.30\n10   Llanederyn 13.4 6.92 7.23 0.28 0.20\n11   Llanederyn 12.4 6.13 5.69 0.22 0.54\n12   Llanederyn 13.1 6.64 5.51 0.31 0.24\n13   Llanederyn 12.7 6.69 4.45 0.20 0.22\n14   Llanederyn 12.5 6.44 3.94 0.22 0.23\n15     Caldicot 11.8 5.44 3.94 0.30 0.04\n16     Caldicot 11.6 5.39 3.77 0.29 0.06\n17 IslandThorns 18.3 1.28 0.67 0.03 0.03\n18 IslandThorns 15.8 2.39 0.63 0.01 0.04\n19 IslandThorns 18.0 1.50 0.67 0.01 0.06\n20 IslandThorns 18.0 1.88 0.68 0.01 0.04\n21 IslandThorns 20.8 1.51 0.72 0.07 0.10\n22  AshleyRails 17.7 1.12 0.56 0.06 0.06\n23  AshleyRails 18.3 1.14 0.67 0.06 0.05\n24  AshleyRails 16.7 0.92 0.53 0.01 0.05\n25  AshleyRails 14.8 2.74 0.67 0.03 0.05\n26  AshleyRails 19.1 1.64 0.60 0.10 0.03\n\n\n1 Perform one way MANOVA\nResponse ID for ANOVA is order of 1=al, 2=fe, 3=mg, ca, na.\nWe are testing H0: group mean vectors are the same for all groups or they dont differ significantly vs\nH1: At least one of the group mean vectors is different from the rest.\n\ndep_vars <- cbind(pottery$al,pottery$fe,pottery$mg, pottery$ca, pottery$na)\nfit <-manova(dep_vars ~ pottery$site)\nsummary.aov(fit)\n\n Response 1 :\n             Df  Sum Sq Mean Sq F value    Pr(>F)    \npottery$site  3 175.610  58.537  26.669 1.627e-07 ***\nResiduals    22  48.288   2.195                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n Response 2 :\n             Df  Sum Sq Mean Sq F value    Pr(>F)    \npottery$site  3 134.222  44.741  89.883 1.679e-12 ***\nResiduals    22  10.951   0.498                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n Response 3 :\n             Df Sum Sq Mean Sq F value    Pr(>F)    \npottery$site  3 103.35  34.450   49.12 6.452e-10 ***\nResiduals    22  15.43   0.701                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n Response 4 :\n             Df   Sum Sq  Mean Sq F value    Pr(>F)    \npottery$site  3 0.204703 0.068234  29.157 7.546e-08 ***\nResiduals    22 0.051486 0.002340                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n Response 5 :\n             Df  Sum Sq  Mean Sq F value    Pr(>F)    \npottery$site  3 0.25825 0.086082  9.5026 0.0003209 ***\nResiduals    22 0.19929 0.009059                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n\n‘summary(fit)’ outputs the MANOVA testing of an overall site effect.\nP<0.001 suggests there is an overall difference between the chemical composition of samples from different sites.\n\nsummary(fit)\n\n             Df Pillai approx F num Df den Df    Pr(>F)    \npottery$site  3 1.5539   4.2984     15     60 2.413e-05 ***\nResiduals    22                                            \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n\n2 Now we test to see if the Llanaderyn site is different to the other sites\nNOTE: interest may now lie in using pre-planned contrast statements to investigate if one site differs when compared to the average of the others. You would imagine this could be done using the ‘contrast’ function something like the code below, however this result does not match the SAS user guide and so looks to be doing a different analysis. SUGGEST THIS IS NOT USED UNTIL MORE RESEARCH INTO THIS METHOD CAN BE PERFORMED. One alternative suggestion is to perform a linear descriminent analysis (LDA).\n\nmanova(dep_vars ~ pottery$site) %>% \n          emmeans(\"site\") %>% \n     contrast(method=list(\n          \"Llanederyn vs other sites\"= c(\"Llanederyn\"=-3, \"Caldicot\"=1, \"IslandThorns\"=1, \"AshleyRails\"=1)))\n\n contrast                  estimate    SE df t.ratio p.value\n Llanederyn vs other sites     1.51 0.661 22   2.288  0.0321\n\nResults are averaged over the levels of: rep.meas \n\n\nNOTE: if you feel you can help with the above discrepancy please contribute to the CAMIS repo by following the instructions on the contributions page."
    +    "objectID": "minutes/posts/8Apr2024.html#any-other-conferences-that-people-have-applied-for",
    +    "href": "minutes/posts/8Apr2024.html#any-other-conferences-that-people-have-applied-for",
    +    "title": "General linear models is complete",
    +    "section": "Any other Conferences that people have applied for?",
    +    "text": "Any other Conferences that people have applied for?\n\nLukus & Stephen are attending PHUSE EU Connect with other topics, but if others going CAMIS members could meet up in person, TBC nearer the date"
       },
       {
    -    "objectID": "contribution/hackathon/contribution_guide_ssh.html",
    -    "href": "contribution/hackathon/contribution_guide_ssh.html",
    -    "title": "Contribution Guide: connect RStudio with GitHub",
    -    "section": "",
    -    "text": "Do you have RStudio locally? If so, this should be straight forward. If on a remote server it may be more complex!\nHave you connected your RStudio to GitHub? If not, complete Steps 1 to 3 below. \nNOTE: You will need the following to proceed:\n\nR Studio\nGit software and\na GitHub account\n\n\nStep 1: Ensure that your RStudio has a SSH Key\nGo to:  Tools – Global Options – Git/SVN.\n\n\n\n\n\nClick to Create SSH Key - This allows communication between Github & R.\n\n\n\n\n\nWhere is asks if you want to add a password, you do not need any password adding.\nClick to View Public Key & Copy it to the clipboard.\n\n\nStep 2: Add the R Studio SSH key to your github account.\nNOTE: you may need to come off your Company VPN in order for the connection to be accepted\nLog into your GitHub account.\nIf you don’t know your github ID, then you could check to see if you contributed to the CSRMLW project and find it from there, then reset your account. Otherwise, set up a new github account. https://github.com/phuse-org/CSRMLW\nOnce logged in, Within Github - go to settings (the blue widget below)\n\n\n\n\n\nGo to the SSH and GPG keys tab.\n\n\n\n\n\nSelect “New SSH Key”\nGive it a title (Company X account) and “Add SSH Key”.\nPaste in the SSH Code that you copied in step 1 and click “Add SSH Key”.\n\n\nStep 3: Tell R Studio the project you want to work on: the CAMIS github repo\nNavigate to the Git hub repo you want to work in: https://github.com/PSIAIMS/CAMIS\nClick on the Green “Code” button and select the tab: Local – SSH as shown below Copy the SSH key.\n\n\n\n\n\nGo into R Studio. Select: File New Project - Version Control - Git : In the repository URL paste the SSH key from Github. Click Ok.\nThis will set up the link between Github & your R studio.\nThe console will show you where files will be stored locally, before/after doing pull requests to the repo\n\n\n\n\n\nNow you can create new RMD files - edit them locally and save them back to github using the Git tab as shown below (on the right Environment, History, Connections, Git, Tutorial)\n\n\n\n\n\nWhen you save a file, It will appear in the GIT tab.\nCommit - will push it back to the repo.\nMake sure you pull down (Blue down arrow) before starting changes so you are editing the latest version of things from the repo. After you commit, click the Green up arrow to do a pull request back to the repo.\n If you have problems with the new project and what packages it has available. It is a good idea go into: Tools - Project Options - Environments - and select “Use RENV with this project”. This then saves the packages more locally & they should be there when you go back in.\nIf you get the following message, then run “renv::restore()” in the console."
    +    "objectID": "minutes/posts/8Apr2024.html#current-assignments",
    +    "href": "minutes/posts/8Apr2024.html#current-assignments",
    +    "title": "General linear models is complete",
    +    "section": "Current assignments",
    +    "text": "Current assignments\nLyn to put together Table so we can easily see whose doing what.\n\nSarah Rathwell & Christina volunteered to work on Kolmogorov-Smirnov test\nLukas Brausch to pick up Python one sample t-test, paired & 2 sample t-test\nChi to reach out to open stats ware to see if they can improve MMRM & add any bayesian MMRM\nLeon to look at Reference-based MI (using either SAS macro, or procedures directly).\nKeaven/Martin to look at group sequential design\nCAMIS-ONCO no kick off yet, so Stephen McCawille will start to look at SAS Accelerated failure time models, Volunteer needed to run the same in R.\nTodd/Cuifeng will be looking at Non linear models\nALL - if you are looking for an assignment reach out to Christina & Lyn and we can group you together to collaborate."
       },
       {
    -    "objectID": "index.html",
    -    "href": "index.html",
    -    "title": "CAMIS - A PHUSE DVOST Working Group",
    +    "objectID": "minutes/posts/13Feb2023.html",
    +    "href": "minutes/posts/13Feb2023.html",
    +    "title": "White Paper and Demo of connecting Rstudio with Github repo",
         "section": "",
    -    "text": "Introduction\nSeveral discrepancies have been discovered in statistical analysis results between different programming languages, even in fully qualified statistical computing environments. Subtle differences exist between the fundamental approaches implemented by each language, yielding differences in results which are each correct in their own right. The fact that these differences exist causes unease on the behalf of sponsor companies when submitting to a regulatory agency, as it is uncertain if the agency will view these differences as problematic. In its Statistical Software Clarifying Statement, the US Food and Drug Administration (FDA) states that it “FDA does not require use of any specific software for statistical analyses” and that “the computer software used for data management and statistical analysis should be reliable.” Observing differences across languages can reduce the analyst’s confidence in reliability and, by understanding the source of any discrepancies, one can reinstate confidence in reliability.\n\nMotivation\nThe goal of this project is to demystify conflicting results between software and to help ease the transitions to new languages by providing comparison and comprehensive explanations.\n\n\nRepository\nThe repository below provides examples of statistical methodology in different software and languages, along with a comparison of the results obtained and description of any discrepancies.\n\n\n\n\n\n\n\n\nMethods\nR\nSAS\nPython\nComparison\n\n\n\n\nSummary Statistics\nRounding\nR\nSAS\nPython\nR vs SAS\n\n\nSummary statistics\nR\nSAS\nPython\nR vs SAS\n\n\nSkewness/Kurtosis\nR\nSAS\nPython\nR vs SAS\n\n\nGeneral Linear Models\nOne Sample t-test\nR\nSAS\nPython\nR vs SAS\n\n\nPaired t-test\nR\nSAS\nPython\nR vs SAS\n\n\nTwo Sample t-test\nR\nSAS\nPython\nR vs SAS\n\n\nANOVA\nR\nSAS\nPython\nR vs SAS\n\n\nANCOVA\nR\nSAS\nPython\nR vs SAS\n\n\nMANOVA\nR\nSAS\nPython\nR vs SAS\n\n\nLinear Regression\nR\nSAS\nPython\nR vs SAS\n\n\nGeneralized Linear Models\nLogistic Regression\nR\nSAS\nPython\nR vs SAS\n\n\nPoisson/Negative Binomial Regression\nR\n\n\nR vs SAS\n\n\nCategorical Repeated Measures\n\n\n\n\n\n\nCategorical Multiple Imputation\n\n\n\n\n\n\nNon-parametric Analysis\nWilcoxon signed rank\nR\nSAS\n\nR vs SAS\n\n\nMann-Whitney U/Wilcoxon rank sum\nR\nSAS\n\n\n\n\nKolmogorov-Smirnov test\n\n\n\n\n\n\nKruskall-Wallis test\nR\nSAS\nPython\nR vs SAS\n\n\nFriedman test\n\n\n\n\n\n\nJonckheere test\nR\nSAS\n\nR vs SAS\n\n\nHodges-Lehman Estimator\nR\nSAS\n\n\n\n\nCategorical Data Analysis\nBinomial test\nR\n\n\n\n\n\nMcNemar's test\nR\nSAS\n\nR vs SAS\n\n\nChi-Square Association/Fishers exact\nR\nSAS\nPython\nR vs SAS\n\n\nCochran Mantel Haenszel\nR\nSAS\n\nR vs SAS\n\n\nConfidence Intervals for proportions\nR\nSAS\n\nR vs SAS\n\n\nRepeated Measures\nLinear Mixed Model (MMRM)\nR\nSAS\n\nR vs SAS\n\n\nLinear Mixed Model (degrees of freedom)\n\n\n\n\n\n\nGeneralized Linear Mixed Model (MMRM)\n\n\n\n\n\n\nBayesian MMRM\n\n\n\n\n\n\nMultiple Imputation - Continuous Data MAR\nMCMC\n\n\n\n\n\n\nLinear regression\nR\n\n\n\n\n\nPredictive Mean Matching\nR\n\n\n\n\n\nMultiple Imputation - Continuous Data MNAR\nDelta Adjustment/Tipping Point\n\n\n\n\n\n\nReference-Based Imputation/Sequential Methods\n\n\n\n\n\n\nReference-Based Imputation/Joint Modelling\n\n\n\n\n\n\nCorrelation\nPearson's/ Spearman's/ Kendall's Rank\nR\nSAS\nPython\nR vs SAS\n\n\nSurvival Models\nKaplan-Meier Log-rank test and Cox-PH\nR\nSAS\n\nR vs SAS\n\n\nAccelerated Failure Time\nR\n\n\n\n\n\nNon-proportional hazards methods\nR\n\n\n\n\n\nCumulative Incidence Functions\nR\nSAS\n\nR vs SAS\n\n\nSample size /Power calculations\nSingle timepoint analysis\n\n\n\n\n\n\nGroup sequential designs\nR\n\n\nEast\n\n\nMultivariate methods\nClustering\nR\n\n\n\n\n\nFactor analysis\n\n\n\n\n\n\nPCA\nR\n\n\n\n\n\nCanonical correlation\n\n\n\n\n\n\nPLS\n\n\n\n\n\n\nCausal inference\nPropensity scores\n\n\n\n\n\n\nMatching\n\n\n\n\n\n\nWeighting\n\n\n\n\n\n\nG-computation\n\n\n\n\n\n\nOther Methods\nSurvey statistics\nR\nSAS\nPython\nR vs SAS vs Python\n\n\nNearest neighbour\n\n\n\n\n\n\nMachine learning\nR"
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n13_feb_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nYes\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nYes\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nNo\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nNo\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nMeeting minutes\nMin-Hua went through outstanding comments on the white paper.\nChristina did a demo of how to set up R studio to link through via git project to the CAMIS github repo. See “13Feb2023_Contributing to the CAMIS project_Setting up communication between github and R studio” for more information\n\n\nNext meeting: 13th March 2023: 4:30 UTC, 11:30 EST."
       },
       {
    -    "objectID": "East/gsd-tte.html",
    -    "href": "East/gsd-tte.html",
    -    "title": "Group sequential design in East",
    +    "objectID": "minutes/posts/13mar2023.html",
    +    "href": "minutes/posts/13mar2023.html",
    +    "title": "White Paper, Website, ONCO, Volunteers, Conferences",
         "section": "",
    -    "text": "“Two Samples”, “Logrank Test Given Accrual Duration and Study Duration” in the Survival library will be used for sample size calculations.\nAfter selecting the design option, you will initially see tabs: “Test Parameters” and “Accrual/Dropouts”. Once the “Number of Looks” is updated to greater than 1, a “Boundary” tab will appear.\nBelow are screenshots of each of the tabs for a group sequential design (GSD) for a progression-free survival (PFS) endpoint, which has one interim analysis for both efficacy and non-binding futility:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe results are as follows:\n\n\n\n\n\n\n\n\n\nThe results are generated with East version 6.5.4.6."
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n13_mar_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nYes\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nYes\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nNo\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\n\nWhite paper - Lyn\nWebsite progress - Christina\nCAMIS-ONCO - Soma Sekhar\nVolunteers Roles\nConference Reps\nAOB/ PHUSE feedback\n\n\n\nMeeting minutes\nWhite Paper Update: Lyn Min-Hua is sending the white paper to the PHUSE group lead for review soon just a bit more tidying to do following comments.\nWebsite progress: Christina\nThe home page now has the list of stats methods we are looking to collect data on.\nACTION :Christina to put actions for each stats method which we need help to complete into github. We will assign those already selected to the people below. This will enable people that want to help to be able to see which are available for people to select.\nCAMIS- ONCO: Soma Sekhar\n\nplan to launch later this week.\npossibly white paper/ conference presentation.\n\nReview of volunteer roles\n\nGeneral Co-ordination -Lyn\nWebsite Co-ordination / Home page table - Christina\nCAMIS-ONCO - Soma Sekhar\nCopying CSRMLW material to CAMIS\n\nCMH: Aiming Yang\nLinear Models: Brian Varney (ACTION: Set up call with Dani, Lyn, Vikash, christina, + anyone else whose interested in helping to please volunteer)\nMMRM: Ben Arancibia\nSurvival: Min-Hua Jen, Mia Qi\n\n\nACTION: Christina to also add “actions” for people to pick up the following duties.\n\nCo-ordinator for conference material - share standard slides/ content /abstracts\nVolunteer to design a CAMIS Logo\nSocial media rep - to co-ordinate posts (linkedIn/Twitter)\nConference reps/ attendees needed\n\nWe will also add a page which lists the conferences so we can collate and coordinate whose going with the hope of advertising the project more widely once we have content on the website. Include a column for timelines/ abstract deadlines.\n\n\n\n\n\n\n\n\n\n\n\nConference\nLocation\nDate\nMain Contact\nVolunteers to attend\nDetails\n\n\n\n\nPHUSE US Connect\nOrlando, Florida\n5-8 March 2023\nSoma Sekhar\n\nPresentation\n\n\nDISS (Duke industry statistics symposium)\nVirtual\n29-31st March 2023\nLyn Taylor\nMolly MacDiarmid\nPoster\n\n\nPSDM(Pharmaceutical statistics and data management)\nNetherlands\n19 Apr 2023\n\n\n\n\n\nIASCT (ConSPIC - conference for statistics and programming in clinical research)\nBengaluru, India\n4-6 May 2023\nHarshal Khanolkar\nHarshal Khanolkar\n\n\n\nPSI 2023 Conference\nHammersmith London West, England\n11-14 June 2023\nMartin Brown\nChristina Fillmore\nLyn Taylor\nMolly Macdiarmid\nMartin Brown\nOral & poster submission completed\n\n\nDIA 2023 Global Annual Meeting\nBoston MA, USA\n25-29 June 2023\n\n\n\n\n\nJoint statistical meeting (JSM)\nToronto, Ontario, Canada\n5-10 Aug 2023\n\n\n\n\n\nISCB Conference\nMilan-Italy\n27-31 Aug 2023\n\n\n\n\n\nRSS conference\nHarrogate, England\n4-7 sept 2023\n\n\n\n\n\nASA Bio pharmaceutical Section Regulatory-industry Statistics Workshop\nRockville, Maryland, USA\n27-29 Sept 2023\n\n\n\n\n\nEASD 2023 - European Association for study of diabetes\nHamberg Germany\n02-06 Oct 2023\n\n\n\n\n\nPHUSE EU Connect 2023\nICC Birmingham, England\n5-8 November 2023\nChristina Fillmore?\n\n\n\n\nR in Pharma /\nPOSIT conf.\nVirtual/ In person\nNov?\nChristina Fillmore?"
       },
       {
         "objectID": "minutes/posts/19June2023.html",
    @@ -553,11 +490,11 @@
         "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n19_june_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nNo\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nNo\n\n\nMichael Kane\nYes\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nNo\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nYes\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\n\nTeam announcements - Lyn\nWhite paper - Lyn\nWebsite progress - Christina\nConferences feedback (PSI/IASCT)- Lyn/Christina/Martin/Molly/Aiming/Harshal\nConference planning - All\nCAMIS-ONCO - Soma Sekhar\nAOB\n\n\n\nMeeting minutes\nTeam Announcements\nMin-Hua Jen, Gave birth to twins -everyone is doing well !\nWelcome to: Iris Wu (Incyte)\nHarshal volunteered to be our Social Media Rep / co-ordinate our social media posts.\nRole consists of:\n\nHelps to come up for ideas for blogs/posts. Examples could include, if someone writes content on MRMM, you ask them to write a short description on what they’ve done including link to their work on the website, or for example, once the white paper is final, one of us will write a blog post to advertise it. Molly’s poster prize at PSI conference etc !\nChases people up who said they’d write a blog to ensure we are marketing our work in a timely manner.\nEnsures that when you receive content (blog/posts), that it’s sent to all the key contacts for organizations/Societies (See end of minutes for list)\n\nSocial media post list of upcoming posts\n1) Write a short message for Molly winning Poster prize. Just something in third person like “Congrats to Molly for winning a PSI Conference 2023 Poster Prize. If you want to see the poster it’s here.. (Molly to write, Lyn review, then send to Harshil/Christine to review - then Harshil to forward to contacts for advertising).\n2) Once White paper released, PHUSE will advertize but we should write something to share with our wider contacts\nWhite Paper Update No comments from Public review. Paper is here We checked for any last comments from the group. ACTION: Lyn to send confirmation that we are good to proceed to PHUSE tomorrow if no further comments.\nWebsite progress: Christina\nSubstantial content been added in the last month.\nOnce key area we’d like to progress on though is MMRM. ACTION: Christina to ask Kevin Kunzmann if he can write up something.\nLyn - To create a FAQ doc for the website. Make sure it references available material elsewhere so it doesn’t become out of date quickly.\nPSI AIMS will create github training which we can utilize to onboard statisticians.\nConference feedback:\nPSI Conference: Lyn/Christina/Martin/Molly/Aiming. Molly’s conference poster won a Poster Prize ! Need to blog/advertise the award.\nIASCT: Harshil. Spoken to board members, currently board going through election so will restart discussion after that.\nConference planning\nVikash- plan for CSS. Abstract has been submitted by Soma Sekhar (Co-author Vikash & Adittee), 30th june registration opens.\nACTION: Lyn: Ask PHUSE CSS working group (Data visualization and open source technology) DVOST - if we can have a presentation next year at the CSS.\nJSM - ASA conference. Leon. Abstract due Feb 2024 - so try have a rep there next year.\nPHUSE Single day event (SDE- Toronto Mississauga),\nSCT - society of clinical trials - Michael kane? (ACTION : Lyn to update conf website)\nSESUG - South Eastern SAS user group: Brian Varney (ACTION : Lyn to update conf website)\nPHUSE EU got a poster abstract: Jayashree Vendanayagam\nPHUSE Single day event (New york - regeneron hosting Oct 16, Aiming emailed host to see if she can do a poster/presentation/advert - Lyn to add to conf page)\nR in Pharma - Brian or Christina to possibly submit something. Nov virtual. POSIT CONF - September in chicago. (Lyn update website - Christina wont be at POSIT, split into 2 )\nPhuse EU connect : the CAMIS abstract was selected as back up talk only. However there are some companies who have company talks - which take priority so limited independent speakers to accept talks from. TBC if anyone on the list of speakers - could include a slide to advertise us at PHUSE EU!\nLessons learnt for conferences:\n1) Put PHUSE CAMIS on abstract (part of PHUSE DVOST).\n2) submit abstract for Poster & Talk - then you have the back up of a poster if talk is rejected.\nCAMIS- ONCO: Soma Sekhar\n\nNo update this month, carry to next month. Validation of endpoints (primary/secondary oncology endpoints). Propose to do poster at PHUSE CSS. Once Mia’s survival section is loaded. Sema Sekhar to review. Then highlight what’s missing - what else you want to add. Max combo. BICR vs RECIST? In future we can discuss how these fit with current CAMIS structure. Focus on the Stats method ideally. ACTION :Christina to email Semar Sekhar once Survival is live on Website.\n\nPrevious meeting notes/ Key Information\n\nContacts for Organizations/ Societies\n\nPSI /EFSPI (Martin)\nR Consortium / PHUSE / RSS (Lyn)\nIASCT (Harshal)\nASA (Leon) - TBC who are ASA to reach out to? If Ben has any contacts that Leon could use please let him know.\nSAS - Contact TBC.\n\nRoles\n\nLyn Taylor - Lead\nChristina Fillmore - Website/ co-lead\nSoma Sekhar Sriadibhatla- CAMIS ONCO\nHarshal Khanolkar - Social media rep\nLinear models team - Brian Varney, Vikash Jain,\nMMRM - Ben Arancibia / Kevin Kunzmann"
       },
       {
    -    "objectID": "minutes/posts/10July2023.html",
    -    "href": "minutes/posts/10July2023.html",
    -    "title": "Plan for Advertising CAMIS progress",
    +    "objectID": "minutes/posts/17apr2023.html",
    +    "href": "minutes/posts/17apr2023.html",
    +    "title": "White Paper, Website, Launch Plan",
         "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n10_july_2023\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nYes\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nYes\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\n\nWelcome new members - Vandana Yadav (Novo Nordisk) and Iris Wu (incyte)\nCAMIS Advertisement Plan - Harshal\n\nWhite paper\nMolly poster prize\nConference plan\n\nWebsite\n\nMMRM/ Other\n\nCAMIS-ONCO / Prep for PHUSE CSS- Soma Sekhar\nAOB\n\nNext meeting 14th Aug. Lyn on vacation, do you want to go ahead or move back 1 week?\n\n\n\n\nMeeting minutes\nCAMIS Advertisement Plan\n\nBlog re: White paper - All to share link with colleagues and like on social media,\nBlog re: Molly poster prize - ACTION: Molly to write\nLinkedIn -\n\nShould we have our own account (CAMIS linkedIN account) or post through the other organizations. Could post through our own personal accounts & have them repost?\nACTION : Harshal to post from own personal account and we will assesss reach if we all like it and ask the organizations to repost it.\n\nAny other social media sites needed to be used? Twitter was popular but not so now so stick with LinkedIn.\nSpread awareness though individual departments working groups\nPHUSE SDE connect - talk / presentation / posters or interactive workshops at connect SDEs.\nPHUSE/ FDA CSS 2024 - Working groups interactive breakout sessions. create a DVOST break out sessions - see CSS Working Groups (phuse-events.org)\n\nMaybe take inspiration from this years event to see what format they take\nACTION Soma to report back after conference and we can plan for next year\n\nSocial media post on CAMIS engagement at conferences\nUtilise #CAMIS on social media.\nPharmaverse - Could we get a link from Pharmaverse\n\nACTION: Christina to see if we can get a link?\n\n\n\nConference plan. The conference plan on the website was reviewed and updated\n\nPHUSE FDA quarterly meeting. CAMIS invited to present. Plan to go through White paper concepts & website. Request a replacement to represent FDA on our group, since Kyle Lee no longer at FDA. Promote use of site to them. Likely to be in attendance someone from the Division of analytics and informatics in CEDER.\nPHUSE CSS: Somar producing poster. Also doing a talk on validation of oncology endpoints and why it’s important to introduce hybrid programming languanges. Will be representatives present from regulatory authorities\n\n\nWebsite progress: Christina\n\nMMRM (Ben Arancibia happy to contribute)\nOthers - Not much new content in last month. Please if anyone time please add content !\nShould we prioritize any areas, or in getting Python/Julia content. Currently we will just see what content people have, rather than priorizing however re-assess based on growth to see if we need to focus more on a single area and get more volunteers on key areas.\nFAQ Doc - still in progress\n\nCAMIS- ONCO: Soma Sekhar\n\nStarted work on poster due July 28th.\nAfter presentation could convert to a white paper. ACTION: send out a draft plan for white paper, & lyn to add to agenda for discussion next meeting. Planning to evaluate endpoints for oncology. Table of endpoints required for approval.\n\nAOB\nNext meeting 14th Aug. Lyn on vacation, will move back 1 week."
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n17_apr_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nYes\n\n\nDoug Kelkoff\nYes\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nYes\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nNo\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nNo\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\n\nWhite paper - Lyn/Min-Hua\nLogo - All - voting!\nWebsite progress - Christina\nLaunch Plan - Lyn\nCAMIS-ONCO - Soma Sekhar\nVolunteer Open Roles\nConference Attendance\nAOB\n\n\n\nMeeting minutes\nWhite Paper Update: Min-Hua PHUSE are doing technical review so hopefully will come back shortly with any comments. I reminded them last week. Has been reviewed by leads team, now with steering committee ( Final review team), so hopefully not much longer.\nLOGO: Lyn - By a small majority the preferred option was the calculator without the P<0.05 in it. This will now be redrawn & finalized. ACTION: Lyn will update website when image available. Will save under CAMIS/images so you can use for any posters/ presentations.\nWebsite progress: Christina **All - review of progress & answer any questions\nSurvival - Mia has made great progress on survival, Christina and Lyn to help fix branch issue & then will get it pushed to the live site.\nACTION : Lyn to Create a video of creating a branch / doing updates. push/pull - github pull request. Create a FAQ doc for the website.\nLaunch Plan\n\nAlign launch of website with release of white paper. Blog writing & “Video” launch - Lyn to write & distribute for review\nOnce content created reach out to the following to help advertise\n\nPSI /EFSPI (Martin),\nR Consortium / PHUSE / RSS (Lyn)\nIASCT (Harshal)\nASA (Min-hua may have contact or See if Ben has a contact- ACTION christina to check with ben then get back to Min-hua. Lily Hsieh to ask Leon as he’s part of ASA. Aiming can also reach out to a contact to see she has a contact )\nOthers : TBC\n\n\nCAMIS- ONCO: Soma Sekhar\nPlans are in progress\nReview of volunteer open roles Still looking for volunteers to do: - Co-ordinator for conference material - share standard slides/ content /abstracts /posters - Social media rep - to co-ordinate posts (linkedIn/Twitter) - Volunteers to represent CAMIS at various conferences\nConferences All to let Lyn know or update the conferences qmd if you want to attend and represent/advertise camis"
       },
       {
         "objectID": "minutes/posts/11Sept2023.html",
    @@ -567,249 +504,193 @@
         "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n11_sep_2023\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nNo\n\n\nChelsea Dickens\nYes\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nYes\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nYes\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nNo\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nYes\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nYes\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\nPHUSE SDE: Missisauga: June 8th feedback: Jayashreee not available today so see if any feedback at next meeting\nPHUSE FDA CSS Poster acceptance, white paper planning, PHUSE US Connect planning & CAMIS ONCO update: Soma Sekhar / Vikash Jain\nPoster presentation is next week. Harshil will advertise on social media.\nSubmitted a abstract for poster & presentation/workshop for US Connect 2024. White paper ongoing. Python code for CAMIS-ONCO being created. Workshop for PHUSE CSS 2024 will need planning. DVOST subgroup ½ day workshop ACTION Soma/Vikash work on the CSS workshop For 2024 .\nVikash was at the PHUSE SDE Boston last week. Met Michael Rimler and he’s introduced CAMIS to the board so they are aware of it.\nRSS conference feedback - Lyn Suggestions were to get more academics, university representatives involved with the project as it also makes for nice disseration projects for BSc/MScs.\nIBS CEN2023 conference - Feedback from Chi IBS CEN2023 conference (biometric society central Europe network held in Basel), CAMIS was mentioned along with other R working groups in a talk. The talk was about software engineering working group, the one that developed MMRM. Quite encouraging!\nSocial Media update : Harshal\nCall for volunteers.\n\nSoftware Engineering Working Group –\n\nWG goals are:\n\nCollaborate to engineer selected R-packages which will fill in gaps in the open-source statistical software landscape, and to promote software tools designed by the working group through publications, conference presentations, workshops, training courses, and others.\nDevelop best practices for engineering high-quality statistical software, and promote the use of best practices in the broader Biostatistics community via public training materials.\nCommunicate and collaborate with other R software initiatives.\n\n\nWorking group HomePage - https://rconsortium.github.io/asa-biop-swe-wg/\nCo-chairs - Daniel Sabanes Bove and Ya Wang.\n\n\n\n\nStatistical Methods in Oncology Scientific Working Group – WG goals are:\n\nEncourage increased use of systematic oncology assessment approaches and selection of best methods through training and education\n\nGain clear understanding of current regulatory environments in oncology\nPrepare a library of recommended methods including innovative methods\nUnderstand commonly used and innovative methods\nCollect and share experiences on using innovative designs\nPut together points to consider for oncology innovative designs’ implementation\nDevelop new methods if needed\n\nEducate the broader statistical community to understand and contribute to this important area\nIncrease statisticians’ leadership roles in cross-functional collaboration\nCommunicate statistical perspectives to larger clinical trial community\nCo-chairs - qjiang@seagen.com and olga.marchenko@bayer.com\n\n\nAdittee volunteered to join the Stats methods in oncology Scientific working group to represent us. ACTION: Aditee to reach out to co-chairs and ask to join, then feedback at our meetings on if there are opportunities to collaborate.\nAlso looking for volunteers to work on the Software Engineering WG & CAMIS ONCO- white paper, Harshil will work with Vikash & Soma to request that PHUSE share to advertise what we are looking for in a linkedIn post.\nPreparation for PHUSE FDA Quarterly meeting 27th sept: Slides / Survey questions : Lyn / harshil Tomorrow we can get the data back from questionnaire.   ACTION : Lyn/Harshil to meet, summarize survey & prepare slides.   Friday.\nWebsite Christina/ Chi / Jayashree\n\nCurrently, needs fixing pending RENV issue. So will be slight delay on getting content on the website\nContent curation lead items - Chi / Jayashree Made a great start to close discussions & address actions which have questions on them.\nMMRM update - No update ACTION: Lyn to follow up.\ngithub training plan (R/Pharma workshop & PSI training course) - ongoing prep for workshop & course through PSI AIMS team.\nAgnieszka (PAREXEL) and Chi – working on Wilcoxon test content for paired & unpaired data.\n\nUpcoming conference planning\n\nPHUSE SDE New York: Oct 16th : Aiming\nPHUSE US Connect: Soma/Vikash\nR/Pharma – Christina?\nSESUG (South East SAS user group) late october 2023, Brian will present on CAMIS.\nNorth Carolina - SDE if anyone wants to volunteer to attend let us know.\n\nAOB - None."
       },
       {
    -    "objectID": "minutes/posts/9oct2023.html",
    -    "href": "minutes/posts/9oct2023.html",
    -    "title": "FDA quartely meeting, 1st survey feedback - general updates",
    +    "objectID": "minutes/posts/11Mar2024.html",
    +    "href": "minutes/posts/11Mar2024.html",
    +    "title": "How to select packages, Content & Conferences",
         "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n09_oct_2023\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nNo\n\n\nChelsea Dickens\nYes\n\n\nChi Zhang\nYes\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nYes\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nNo\n\n\nVandana Yadav\nYes\n\n\nVidya Gopal\nYes\n\n\nVikash Jain\nNo\n\n\nWilmar Igl\nYes\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\nWelcome New Members: Vikrant Vijay FDA, Ismael Rodriguez (Appsilon)\nPHUSE SDE: Missisauga: June 8th feedback: Jayashreee\nCAMIS-ONCO update: Soma Sekhar / Vikash Jain\nPHUSE US Connect 2024 planning (Poster accepted, will find out re: workshop oct 20th)\nWhite paper planning\nFDA meeting update /survey results.: presented to around 15 FDA representatives, but didn’t get any questions/ comments on the call. However, follow the meeting, our slides were passed to others at the FDA and Vikrant Vijay got in touch to join the group. He’s not available today, but will attend in future.\nQuestionnaire only got 16 responses, 9/16 had heard of CAMIS, 13/16 used R for GXP, 4/15 used python for GXP, 1/16 used Julia for GXP. 9/16 had experienced discrepancies whilst trying to replicate analysis between languages.\nACTION: To re-run maybe just before CSS 2024 / or each year to assess progress and use for conference presentations.\nCommon programming challenges\n\nWhilst executing Analysis in R, I come across challenge in Numerical Differences in Statistical results. Would it be great if Industry & regulatory work together to build Standard R package for Statistical Methods & details in CAMIS repository would be highly appreciated.\nEnsuring reproducible environments and having people accept that different results for different implementations of an algorithm should perhaps be interpreted as a hint towards the accuracy, rather than one of the methods being wrong.\nStandard deviation initially did not match between and SAS. Later resolved by using the type option\nChallenges to figure out array of methods to replicate the same results across different software platforms/ Finding why resutls differ / unclear documentation/ discrepancy in values\nLS means contrasts from GLMs or MMRMs between SAS and R (vis lme4/mmrm + emmeans)\nParsing issues, scalability issues and network crash.\nImplementation of median seem to differ between R and SAS…. Sometimes joins in dplyr can also behave differently than i would expect with raw SQL\nDifferent methodologies (e.g for sample size calculation0 and lack of non-standard methods in SAS (e.g sample size for adaptive design).\n\nSocial Media update : Harshal\nNewsletter, (quarterly, or monthly) to advertise progress (ie. content we created) & conferences we are attending. Can we advertize ourself more to EMA, PMDA etc.. Can send to Frank Petavy (methodological working party). ACTION: Harshal/Lyn put togther summary for newsletter & send to Wilmar to reach out to Frank & others. Lyn to email David to see if any wider participation.\nhttps://www.ema.europa.eu/en/committees/working-parties-other-groups/chmp/methodology-working-party\nWebsite Christina/ Chi / Jayashree\n\nAll pull requests accepted & everything up to date\nMMRM update - No update. ACTION: Chi Zhang: will follow up to see if we can get someone to add in MMRM package to our existing content.\ngithub training plan (R/Pharma workshop & PSI training course) - ongoing prep for workshop & course through PSI AIMS team.\nAgnieszka (PAREXEL) and Chi – working on Wilcoxon test content for paired & unpaired data.\nACTION: Chi & Christina to talk about local rendering & renv issue with not having the packages to be able to render… once we know a fix, can write up and put on the website.\n\nUpcoming conference planning\n\nPHUSE SDE New York: Oct 16th : Aiming\nPHUSE US Connect: Soma/Vikash\nR/Pharma – Christina?\nSESUG (South East SAS user group) late october 2023, Brian will present on CAMIS.\nNorth Carolina - SDE if anyone wants to volunteer to attend let us know.\n\nAOB - None."
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n11_Mar_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nNo\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nLily Hseih\nYes\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nNo\n\n\nKasa Andras\nYes\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nYes\n\n\nMia Qi\nNo\n\n\nLeon Shi\nYes\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nYes\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nYes\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nYes\n\n\nLukas Brausch\nYes\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\nSunil\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nThank you to all those who submitted content this month, especially Chi, David and Filip who all helped to complete new sections. The top section is now almost complete and the first python content will be loaded in the next few weeks which is a great milestone for the project. Watch out for the new column appearing in the repository Table of contents!\nPlease remember even if you dont want to contribute to a section on your own, you can still review current content and propose improvements.\nConference planning. Reminder that if you are attending a conference to represent CAMIS to add the detail here. We need to ensure we continue to advertise the project to encourage people to use the repo and add content. So far in 2024, only 3 conferences being attended, so if you are interested in attending a conference just reach out to Lyn & Christina who can help you with an abstract if needed.\n\nVikash fed back about the PHUSE US Connect conference. CAMIS was mentioned by Michael Rimler in the keynote speech and Soma/Vikash presented a poster so we received great publicity. Brian also attended meeting Soma & Vikash face to face. Thank you to all of you. The abstract for PHUSE FDA CSS has been written by Soma and submitted so all on track.\nReminder to complete CAMIS membership form\nhttps://docs.google.com/forms/d/e/1FAIpQLSdDX79P5ByStVS_3n4tK1mAWidazIiF6DMEtDMK8KqmJywjqA/viewform?vc=0&c=0&w=1&flr=0&usp=mail_form_link\nNOTE:  We will only collect: team members name, email address, organization, software used, interested in oncology, key interests and affiliations to stats organizations.  The email address is solely for the CAMIS leadership team, to make sure you are included in CAMIS emails.\nWe ask on the form: “Are you happy for your Name and company and interests to be visible on the CAMIS website. Note that email addresses will not be visible”. \nIf you do not give permission then your name will not appear on the CAMIS repo as a CAMIS team member. If you do give permission, your name and company and interests will appear but your email addresses will be hidden from public view. At any time you can ask to be removed from the website team list by emailing me.\nSelection of packages: As we continue to grow the number of packages stored in the repository is growing. We realized that this may lead to conflicts and issues for the repo running. We also dont really want packages installed that are no longer used, known to have issues. Therefore if you are writing up an analysis and there are two packages doing similar things, we would like to request that you select the one that is the most commonly used and best quality (i.e. lowest risk). Risk can be assessed using the {riskmetric} package and {riskassessment} application, using the default scoring, but packages risk should also be considered in context of the individual components such as being actively maintained, bug fixes, code coverage, with references, with a github repo or website, by a trusted author and with results being correct vs stats method.\nIt can be very useful to test multiple packages if they are able to do slightly different analysis (i.e. with different options), in these cases it’s useful to include a Table at the top of the comparison summary qmd, to show which package does which analysis, see Comparison of 1 sample t-test as an example.\nPackages that are inferior to others, should not be loaded to the repo, but instead you can add a textual summary of your findings. For example, “Package X also gives the same results” or “Package X can be used but doesn’t have options to do X and Y” or “We do not recommend Package X as during testing, the results are not in line with the statistical methodology”.\nNOTE that we agreed not to have a library of packages “approved” for CAMIS, RENV stores the lock file of the packages in our repo and we do not want to be seen to giving recommendations for/against packages, other than factual evidence based on the analysis they produce.\nIt was noted that when you load the RENV.lock file, it may give a “error downloading” bioconductor warning, this can be ignored, and should not cause issue if you aren’t using these packages. In the future, these packages will be removed as dependancies from mmrm and the issue will resolve.\nAOB\n\nWe had a discussion surrounding communication methods currently used on the project. RE: using teams vs emails, feedback was mixed, Argument for Teams was that it keeps all discussion in one place, and doesn’t fill you in box, but arguments against were that as you often have to log out of your company teams, to log into the PHUSE one, messages are often missed / ignored.\nWe agreed to perhaps send 2 emails a month, the agenda, but also any other important updates that occurr during the month & minutes. This will be supported by also posting on social media. Although small sample, we assessed how many people observed the recent post RE: Soma’s poster (only Lyn & Christina of those on the call saw the post), however when asked re: Other PHUSE posts 7 were getting them. Leadership team to discuss and see if we need to post using PHUSE admin?"
       },
       {
    -    "objectID": "minutes/posts/15July2024.html",
    -    "href": "minutes/posts/15July2024.html",
    -    "title": "Repo Content Growth, Conferences 2024",
    +    "objectID": "python/logistic_regression.html",
    +    "href": "python/logistic_regression.html",
    +    "title": "Logistic Regression",
         "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n15_Jul_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nNo\n\n\nOrla Doyle\nYes\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nYes\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nNo\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nNo\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nNo\n\n\nMichael Kane\nYes\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nYes\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\nMonthly Contributions\n\nNot much content this month, but per the below, lots on the way !\n\nContent updates / assignments\nWe checked the assignments readme (under non-website content)\n\nSurvival – perhaps split into: non parametric, parametric (rather than AFT & non-proportional hazards), Update readme.md table to assign these rows to the survival team.\nTeam will meet again in 2 weeks.\nNegative binomial content has been posted, it’s a comparison, but would now be quick to write the SAS page. ACTION: Orla to ask the Novartis team to add that too.\nKeaven/Yulia – Group sequential designs: pull request internally east vs R – not doing comparison yet, but will do in future.\n\nQUESTIONS: Do we need to use SAS enterprise or SAS studio and should we state the version that gave the output? It’s probably good practice to do this in case something change. For R, we should use renv, any problem ask Christina. The R/Python code runs each time so output will be current per version being used. Only sas is static.\n22nd July – Novartis hackathon 150 signed up. Need to provide Orla with ideas of what we want them to look at. Stats SMEs will also review before doing pull requests. Possible topics could be:\n\nNegative binomial – comparison & SAS code Beecer – covariate adjustment for logistic regression\nLogistic regression page update – improve content & investigate why p value different.\nMANOVA – why R different to SAS\nFriedman test, Jonckheere test, bionomial, R / sas /comp both needed\nCorrelation in SAS\nChristina may need help to review pull request. Both Pfizer, Novartis & merck will have internal reviews prior to pull requests so review can be reduced.\n\nConferences\n\nChi’s UseR slides are now on the repository under\nPHUSE EU Brussels 23rd Sept - Qian Wang (Merck) will attend.\nPOSIT conf, R in pharma…R open now https://github.com/rinpharma/rinpharma-summit-2024?tab=readme-ov-file\nHarshal working with Daniel Sabanes Bove on the organizing committee for R in pharma: Asia pacific track – woudl be good to have a repo from Asia represent us\n25th July: Americas single day event pennylvania anyone going?\nJSM – 1st week august – Keaven Anderson going, lyn to send 1 slide.\n\nQUESTIONS: RE: funding to attend conferences, usually provided by your company, but in special circumstances we could request funding from: R consortium or PHUSE.\nBrainstorming session\nHow can we engage wider to increase content creation?\n\nPSI : enews,\nPHUSE bi-weekly news: Let Alexandra Peace (mailto:workinggroups@phuse.global) know of any events we are attending or new content we worked on and she will share in a weekly summary of progress.\nCould volunteer to host hackathons for conferences. Christina & orla volunteering to host a hackathon for R in pharma this week.\nAdvertise to PSI/PHUSE RE: if you have Findings please add an issue (even if you can’t look into it yourself).\nSpecial media post to Thank you Merck, Pfizer, Novartis for your contributions. Also companies can post what they’ve contributed. New content blogs. -\nBlog of Novartis hackathon.\n\nDissertations –still looking for new ideas for projects & widen engagement with universities."
    +    "text": "#data manipulation\nimport pandas as pd\nimport numpy as np\n\n#modelling\nimport statsmodels.api as sm\nfrom sklearn.linear_model import LogisticRegression"
       },
       {
    -    "objectID": "minutes/posts/12Feb2024.html",
    -    "href": "minutes/posts/12Feb2024.html",
    -    "title": "Website structure update, Team list, Conferences",
    -    "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n12_Feb_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nYes\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nYes\n\n\nVikash Jain\nYes\n\n\nMia Qi\nYes\n\n\nLeon Shi\nYes\n\n\nVandaya Yadav\nYes\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nYes\n\n\nVidya Gopal\nYes\n\n\nDhvani Patel\nYes\n\n\nKyle Lee\nYes\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nNo\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nNo\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nUpdated website demo – Chi & Christina\nCAMIS membership form / data collection – Lyn\nhttps://docs.google.com/forms/d/e/1FAIpQLSdDX79P5ByStVS_3n4tK1mAWidazIiF6DMEtDMK8KqmJywjqA/viewform?vc=0&c=0&w=1&flr=0&usp=mail_form_link\nNOTE:  We will only collect: team members name, email address, organization, software used, interested in oncology, key interests and affiliations to stats organizations.  The email address is solely for the CAMIS leadership team, to make sure you are included in CAMIS emails.\nWe ask on the form: “Are you happy for your Name and company and interests to be visible on the CAMIS website. Note that email addresses will not be visible”. \nIf you do not give permission then your name will not appear on the CAMIS repo as a CAMIS team member. If you do give permission, your name and company and interests will appear but your email addresses will be hidden from public view. At any time you can ask to be removed from the website team list by emailing me.\nPhuse css workshop for 2024 / CAMIS ONCO– Soma/Vikash/Harshil\n\nFilip, Lyn & Chrstina met re: Python content\nNext steps for workshop & white paper\n\nOther conferences\n\nKeaven - attending JSM & ISBN - and will mention CAMIS.\nChi attending use R conference, Lyn/Christina/All: please review abstract if you wish.\nRegulatory stats workshop: Leon Shih (poster)\n\nVolunteers requested for:\n\nOpenstatsware Bayesian MMRM  {brms.mmrm} package input :  Christine/Orla\nMMRM - Volunteer please to look at Proc Mixed vs Proc GLIMMIX for the SAS/mmrm.qmd file (Stephen McCawille & Leon Shi may be able to look at this in future ).\n\nAOB\n\nChristina: Create a 1 slide - This is CAMIS.\nLyn: Load up Dec2023 blog post\nChi: Add links to blogs & add blog tab when we have content"
    +    "objectID": "python/logistic_regression.html#statsmodels-package",
    +    "href": "python/logistic_regression.html#statsmodels-package",
    +    "title": "Logistic Regression",
    +    "section": "Statsmodels package",
    +    "text": "Statsmodels package\nWe will use the sm.Logit() method to fit our logistic regression model.\n\n#intercept column\nx_sm = sm.add_constant(x)\n\n#fit model\nlr_sm = sm.Logit(y, x_sm).fit() \nprint(lr_sm.summary())\n\nOptimization terminated successfully.\n         Current function value: 0.568825\n         Iterations 5\n                           Logit Regression Results                           \n==============================================================================\nDep. Variable:                 wt_grp   No. Observations:                  167\nModel:                          Logit   Df Residuals:                      162\nMethod:                           MLE   Df Model:                            4\nDate:                Tue, 15 Oct 2024   Pseudo R-squ.:                 0.05169\nTime:                        16:24:58   Log-Likelihood:                -94.994\nconverged:                       True   LL-Null:                       -100.17\nCovariance Type:            nonrobust   LLR p-value:                   0.03484\n==============================================================================\n                 coef    std err          z      P>|z|      [0.025      0.975]\n------------------------------------------------------------------------------\nconst          3.3576      1.654      2.029      0.042       0.115       6.600\nage           -0.0126      0.021     -0.598      0.550      -0.054       0.029\nsex           -0.8645      0.371     -2.328      0.020      -1.592      -0.137\nph.ecog        0.4182      0.263      1.592      0.111      -0.097       0.933\nmeal.cal      -0.0009      0.000     -1.932      0.053      -0.002    1.27e-05\n==============================================================================\n\n\n\nModel fitting\nIn addition to the information contained in the summary, we can display the model coefficients as odds ratios:\n\nprint(\"Odds ratios for statsmodels logistic regression:\")\nprint(np.exp(lr_sm.params))\n\nOdds ratios for statsmodels logistic regression:\nconst       28.719651\nage          0.987467\nsex          0.421266\nph.ecog      1.519198\nmeal.cal     0.999140\ndtype: float64\n\n\nWe can also provide the 5% confidence intervals for the odds ratios:\n\nprint(\"CI at 5% for statsmodels logistic regression:\")\nprint(np.exp(lr_sm.conf_int(alpha = 0.05)))\n\nCI at 5% for statsmodels logistic regression:\n                 0           1\nconst     1.121742  735.301118\nage       0.947449    1.029175\nsex       0.203432    0.872354\nph.ecog   0.907984    2.541852\nmeal.cal  0.998269    1.000013\n\n\n\n\nPrediction\nLet’s use our trained model to make a weight loss prediction about a new patient.\n\n# new female, symptomatic but completely ambulatory patient consuming 2500 calories\nnew_pt = pd.DataFrame({\n    \"age\": [56],\n    \"sex\": [2],\n    \"ph.ecog\": [1.00], \n    \"meal.cal\": [2500]\n})\n\n# Add intercept term to the new data; for a single row this should be \n# forced using the `add_constant` command\nnew_pt_sm = sm.add_constant(new_pt, has_constant=\"add\")\nprint(\"Probability of weight loss using the statsmodels package:\")\nprint(lr_sm.predict(new_pt_sm))\n\nProbability of weight loss using the statsmodels package:\n0    0.308057\ndtype: float64"
       },
       {
    -    "objectID": "minutes/posts/12Dec2022.html",
    -    "href": "minutes/posts/12Dec2022.html",
    -    "title": "Restart Meeting",
    -    "section": "",
    -    "text": "Attendees\n\n\nNew names:\nRows: 34 Columns: 14\n── Column specification\n──────────────────────────────────────────────────────── Delimiter: \",\" chr\n(13): attendees, 12_dec_2022, 23_Jan_2023, 13_feb_2023, 13_mar_2023, 17_... lgl\n(1): ...14\nℹ Use `spec()` to retrieve the full column specification for this data. ℹ\nSpecify the column types or set `show_col_types = FALSE` to quiet this message.\n• `` -> `...14`\n\n\n\n\n\n\n\n\n\nattendees\n12_dec_2022\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nNo\n\n\nChristina Fillmore\nNo\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nYes\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nYes\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\nWelcome and brief CAMIS project update: Lyn\nPlease consider which areas of the project you would like to be involved with: \n    * Repository reviewers/framework reviewers\n    * Content creators (Comparing analysis method implementations in software)\n    * Github - content review / approval\n    * Marketing, i.e. blogs and sharing with wider community (PSI, ASA, PHUSE etc) to encourage contributions \n    * Long term plan - Extend reach beyond Europe/USA.\n\n\nRepository roadmap : Lyn\n    * Sample website & templates – mid January 2022\n    * Feedback on website/templates – EOB Feb 2022\n    * Revisions – March 2022\n    * Launch – April 2022\n\n\nWhite paper status update: Min-Hua\nNOTE: we would like to put the URL of new website and mention CAMIS in paper if possible?\n\n\nOther stream updates: All\nNeed to identify who were the previous stream leads to check with them we can put content into new template formats.\n    * CMH\n    * Mixed models\n    * Linear models\n\n\nQuestions/ AOB - All\n    * Future meeting plan – Lyn set up directly so can be quickly adjust/ add more meetings if necessary?\n    * Name change: CAMIS: Comparing analysis method implementations in software\n    * Do we need our own logo. CAMIS. Volunteers?\n    * Supported by PHUSE & PSI & ASA. Assign rep (or reps) for each organization. \n    * Extend membership given many previous members no longer on project\n    * Volunteer needed – can someone create a comparison using any method (but comparing SAS to Python/Julia or R to Python/Julia) – so we can test up with not just R Vs SAS.\n    * AOB."
    +    "objectID": "python/logistic_regression.html#scikit-learn-package",
    +    "href": "python/logistic_regression.html#scikit-learn-package",
    +    "title": "Logistic Regression",
    +    "section": "Scikit-learn Package",
    +    "text": "Scikit-learn Package\nThe scikit-learn package is a popular package for machine learning and predictive modelling.\n\n\n\n\n\n\nWarning\n\n\n\nIt’s important to note that l2 regularisation is applied by default in the scikit-learn implementation of logistic regression. More recent releases of this package include an option to have no regularisation penalty.\n\n\n\nlr_sk = LogisticRegression(penalty=None).fit(x, y)\n\nUnlike the statsmodels approach scikit-learn doesn’t have a summary method for the model but you can extract some of the model parameters as follows:\n\nprint(\"Intercept for scikit learn logistic regression:\")\nprint(lr_sk.intercept_)\nprint(\"Odds ratios for scikit learn logistic regression:\")\nprint(np.exp(lr_sk.coef_))\n\nIntercept for scikit learn logistic regression:\n[3.35756405]\nOdds ratios for scikit learn logistic regression:\n[[0.98746739 0.42126736 1.51919379 0.99914048]]\n\n\nHowever, obtaining the confidence intervals and other metrics is not directly supported in scikit-learn.\n\nPrediction\nUsing the same new patient example we can use our logistic regression model to make a prediction. The predict_proba method is used to return the probability for each class. If you are interested in viewing the prediction for y = 1, i.e. the probability of weight loss then you can select the second probability as shown:\n\nprint(\"Probability of weight loss using the scikit-learn package:\")\nprint(lr_sk.predict_proba(new_pt)[:,1])\n\nProbability of weight loss using the scikit-learn package:\n[0.30805813]"
       },
       {
    -    "objectID": "minutes/posts/13Feb2023.html",
    -    "href": "minutes/posts/13Feb2023.html",
    -    "title": "White Paper and Demo of connecting Rstudio with Github repo",
    -    "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n13_feb_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nYes\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nYes\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nNo\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nNo\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nMeeting minutes\nMin-Hua went through outstanding comments on the white paper.\nChristina did a demo of how to set up R studio to link through via git project to the CAMIS github repo. See “13Feb2023_Contributing to the CAMIS project_Setting up communication between github and R studio” for more information\n\n\nNext meeting: 13th March 2023: 4:30 UTC, 11:30 EST."
    +    "objectID": "python/logistic_regression.html#conclusions",
    +    "href": "python/logistic_regression.html#conclusions",
    +    "title": "Logistic Regression",
    +    "section": "Conclusions",
    +    "text": "Conclusions\nThere are two main ways to fit a logistic regression using python. Each of these packages have their advantages with statsmodel geared more towards model and coefficient interpretation in low dimensional data settings and in contrast the scikit-learn implementation more appropriate for use cases focused on prediction with more complex, higher dimensional data."
       },
       {
    -    "objectID": "minutes/posts/13mar2023.html",
    -    "href": "minutes/posts/13mar2023.html",
    -    "title": "White Paper, Website, ONCO, Volunteers, Conferences",
    +    "objectID": "python/survey-stats-summary.html",
    +    "href": "python/survey-stats-summary.html",
    +    "title": "Survey Summary Statistics using Python",
         "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n13_mar_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nYes\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nYes\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nNo\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\n\nWhite paper - Lyn\nWebsite progress - Christina\nCAMIS-ONCO - Soma Sekhar\nVolunteers Roles\nConference Reps\nAOB/ PHUSE feedback\n\n\n\nMeeting minutes\nWhite Paper Update: Lyn Min-Hua is sending the white paper to the PHUSE group lead for review soon just a bit more tidying to do following comments.\nWebsite progress: Christina\nThe home page now has the list of stats methods we are looking to collect data on.\nACTION :Christina to put actions for each stats method which we need help to complete into github. We will assign those already selected to the people below. This will enable people that want to help to be able to see which are available for people to select.\nCAMIS- ONCO: Soma Sekhar\n\nplan to launch later this week.\npossibly white paper/ conference presentation.\n\nReview of volunteer roles\n\nGeneral Co-ordination -Lyn\nWebsite Co-ordination / Home page table - Christina\nCAMIS-ONCO - Soma Sekhar\nCopying CSRMLW material to CAMIS\n\nCMH: Aiming Yang\nLinear Models: Brian Varney (ACTION: Set up call with Dani, Lyn, Vikash, christina, + anyone else whose interested in helping to please volunteer)\nMMRM: Ben Arancibia\nSurvival: Min-Hua Jen, Mia Qi\n\n\nACTION: Christina to also add “actions” for people to pick up the following duties.\n\nCo-ordinator for conference material - share standard slides/ content /abstracts\nVolunteer to design a CAMIS Logo\nSocial media rep - to co-ordinate posts (linkedIn/Twitter)\nConference reps/ attendees needed\n\nWe will also add a page which lists the conferences so we can collate and coordinate whose going with the hope of advertising the project more widely once we have content on the website. Include a column for timelines/ abstract deadlines.\n\n\n\n\n\n\n\n\n\n\n\nConference\nLocation\nDate\nMain Contact\nVolunteers to attend\nDetails\n\n\n\n\nPHUSE US Connect\nOrlando, Florida\n5-8 March 2023\nSoma Sekhar\n\nPresentation\n\n\nDISS (Duke industry statistics symposium)\nVirtual\n29-31st March 2023\nLyn Taylor\nMolly MacDiarmid\nPoster\n\n\nPSDM(Pharmaceutical statistics and data management)\nNetherlands\n19 Apr 2023\n\n\n\n\n\nIASCT (ConSPIC - conference for statistics and programming in clinical research)\nBengaluru, India\n4-6 May 2023\nHarshal Khanolkar\nHarshal Khanolkar\n\n\n\nPSI 2023 Conference\nHammersmith London West, England\n11-14 June 2023\nMartin Brown\nChristina Fillmore\nLyn Taylor\nMolly Macdiarmid\nMartin Brown\nOral & poster submission completed\n\n\nDIA 2023 Global Annual Meeting\nBoston MA, USA\n25-29 June 2023\n\n\n\n\n\nJoint statistical meeting (JSM)\nToronto, Ontario, Canada\n5-10 Aug 2023\n\n\n\n\n\nISCB Conference\nMilan-Italy\n27-31 Aug 2023\n\n\n\n\n\nRSS conference\nHarrogate, England\n4-7 sept 2023\n\n\n\n\n\nASA Bio pharmaceutical Section Regulatory-industry Statistics Workshop\nRockville, Maryland, USA\n27-29 Sept 2023\n\n\n\n\n\nEASD 2023 - European Association for study of diabetes\nHamberg Germany\n02-06 Oct 2023\n\n\n\n\n\nPHUSE EU Connect 2023\nICC Birmingham, England\n5-8 November 2023\nChristina Fillmore?\n\n\n\n\nR in Pharma /\nPOSIT conf.\nVirtual/ In person\nNov?\nChristina Fillmore?"
    +    "text": "When conducting large-scale trials on samples of the population, it can be necessary to use a more complex sampling design than a simple random sample.\nAll of these designs need to be taken into account when calculating statistics, and when producing models. Only summary statistics are discussed in this document, and variances are calculated using Taylor series linearisation methods. For a more detailed introduction to calculating survey statistics using statistical software, see (Lohr 2022).\nThe ecosystem of survey statistics packages is less mature in Python than in R or SAS, however there is a package that provides a subset of the functionality: samplics."
       },
       {
    -    "objectID": "minutes/posts/15May2023.html",
    -    "href": "minutes/posts/15May2023.html",
    -    "title": "White Paper, Website, Launch Plan",
    -    "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n15_may_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nNo\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nYes\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nYes\n\n\nLily Hsieh\nNo\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nYes\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\n\nWhite paper - Lyn/Min-Hua\nWebsite progress - Christina\nUpdate on Launch - Lyn\nCAMIS-ONCO - Soma Sekhar\nVolunteer Open Roles\nConference Attendance\nAOB\n\n\n\nMeeting minutes\nWhite Paper Update: Min-Hua Paula at PHUSE will distribute for public review. Over the next days we’ll get a link to the official review. ACTION :Christina will put the white paper onto the website as draft open for public review\nWebsite progress: Christina Website content progressing well. Ben Arancibia - progressing MMRMs + other areas.\nSurvival - With Christina to fix importing. ANCOVA - Aditee in progress - change to CSV not SAV (SPSS file). Update to call it linear regression, Lyn to help find ANCOVA (testing treatments) Independant Two-Sample t-test in SAS - Vikash got a few changes then will load ok.\nLyn: To create a FAQ doc for the website. Make sure it references available material elsewhere so it doesn’t become out of date quickly.\nNOTE: When you do a pull request, check your action to see if the checks pass/fail & reach out to Lyn/CHristina if you have problems. Remember to do snapshot::renv, so that any packages you install were snapshot to the central repo. Else it will fail when you do the pull request as the repo wont have the packages in it that your code needs.\nLaunch Update\n\nBlog video now available here\nBlog text to use with various lengths also available here\nConference slides & abstract available here\n\nRather than a standard set, plan is to have abstracts & slides/posters put into this folder (inc. name & date of conference) then people can use the contact that they have preference to use.\nHarshal has loaded IASCT slides to same location.\n\nContacts for Societies\n\nPSI /EFSPI (Martin) - Content sent.\nR Consortium / PHUSE / RSS (Lyn) - Content sent.\nIASCT (Harshal) - Conference went well and lots of interest from IASCT.\nASA (Leon) - TBC who are ASA to reach out to? If Ben has any contacts that Leon could use please let him know.\nSAS - we may reach out to SAS directly through PHUSE. TBC if they would be Ok with us including their data, copyright. Hopefully they’d give approval as not or project & advertising what you can do in SAS. ACTION: to find contact who may be interested in update/review of SAS. Does PHUSE have a contact already that we can use. Lyn to ask Paula. Aiming/ Martin to let Lyn know if she has a contact. ACTION : Lyn/Christina to Add a disclaimer that we are volunteers adding open source content, but if you see anything that infringes copyright please let us know and we’ll remove it immediately.\n\n\nCAMIS- ONCO: Soma Sekhar\n\nValidation of endpoints (primary/secondary oncology endpoints). Propose to do poster at PHUSE CSS. Once Mia’s survival section is loaded. Sema Sekhar to review. Then highlight what’s missing - what else you want to add. Max combo. BICR vs RECIST? In future we can discuss how these fit with current CAMIS structure. Focus on the Stats method ideally. ACTION :Christina to email Semar Sekhar once Survival is live on Website.\n\nConferences Let’s review\nVikesh- plan for CSS. Abstract deadline 12th June, 30th june registration opens.\nPosters only - only invited people can be speakers. Somar Sekhar, Aditee Dani would be happy to do posters. Suggest all 3 meet to discuss contribution to poster or doing separate ones but not duplicating the same content.\nAsk PHUSE CSS working group (Data visualization and open source technology) DVOST - if we can have a presentation next year at the CSS.\nJSM - ASA conference. Leon attending. Abstract due Feb 2024 - so try have a rep there next year.\nPHUSE Single day event (SDE- Toronto Mississauga), PHUSE EU got a poster abstract: Jayashree Vendanayagam PHUSE Single day event (New york - regeneron hosting Oct 16, check check if Aiming can do any poster/presentation/advert)\nAZ R pharm conference 7th June. LYn & Martin presenting."
    +    "objectID": "python/survey-stats-summary.html#mean",
    +    "href": "python/survey-stats-summary.html#mean",
    +    "title": "Survey Summary Statistics using Python",
    +    "section": "Mean",
    +    "text": "Mean\nIf we want to calculate a mean of a variable in a dataset using samplics, we need to create an estimator object using the estimation method we will use - here Taylor Series estimation - and the parameter we are estimating. Then, we can specify the survey design by passing columns which define our strata and PSUs, and a column to estimate:\n\nimport numpy as np\nimport pandas as pd\n\nfrom samplics import TaylorEstimator\nfrom samplics.utils.types import PopParam\n\nnhanes = pd.read_csv(\"../data/nhanes.csv\")\n\nmean_estimator = TaylorEstimator(PopParam.mean)\n\nmean_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    remove_nan=True,\n)\nprint(mean_estimator.to_dataframe())\n\n          _param  _estimate  _stderror      _lci      _uci       _cv\n0  PopParam.mean   0.112143   0.005446  0.100598  0.123688  0.048562"
       },
       {
    -    "objectID": "minutes/index.html",
    -    "href": "minutes/index.html",
    -    "title": "Meeting Minutes",
    -    "section": "",
    -    "text": "Lessons learnt- Novartis Hackathon, Diversity Alliance, OSTCDA\n\n\n\n\n\n\n\n\n\n\n\nSep 9, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nNovartis Hackathon & Content growth\n\n\n\n\n\n\n\n\n\n\n\nAug 12, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nRepo Content Growth, Conferences 2024\n\n\n\n\n\n\n\n\n\n\n\nJul 14, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nRepo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off\n\n\n\n\n\n\n\n\n\n\n\nJun 10, 2024\n\n\n\n\n\n\n\n\n\n\n\n\n2024 Goals\n\n\n\n\n\n\n\n\n\n\n\nMay 13, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nGeneral linear models is complete\n\n\n\n\n\n\n\n\n\n\n\nApr 8, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nHow to select packages, Content & Conferences\n\n\n\n\n\n\n\n\n\n\n\nMar 11, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nWebsite structure update, Team list, Conferences\n\n\n\n\n\n\n\n\n\n\n\nFeb 12, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nCAMIS-ONCO, Conferences, Academic & regulatory input plans\n\n\n\n\n\n\n\n\n\n\n\nJan 8, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nEnd of year summary, plan for 2024\n\n\n\n\n\n\n\n\n\n\n\nNov 20, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nFDA quartely meeting, 1st survey feedback - general updates\n\n\n\n\n\n\n\n\n\n\n\nOct 9, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nConference updates & feedback, FDA quartely meeting, CAMIS-ONCO workshop\n\n\n\n\n\n\n\n\n\n\n\nSep 11, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nFDA quartely meeting, FDA CSS, SDEs, website & conference plans\n\n\n\n\n\n\n\n\n\n\n\nAug 21, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nPlan for Advertising CAMIS progress\n\n\n\n\n\n\n\n\n\n\n\nJul 19, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper Finalization, Advertising CAMIS\n\n\n\n\n\n\n\n\n\n\n\nJun 19, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper, Website, Launch Plan\n\n\n\n\n\n\n\n\n\n\n\nMay 15, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper, Website, Launch Plan\n\n\n\n\n\n\n\n\n\n\n\nApr 17, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper, Website, ONCO, Volunteers, Conferences\n\n\n\n\n\n\n\n\n\n\n\nMar 13, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper and Demo of connecting Rstudio with Github repo\n\n\n\n\n\n\n\n\n\n\n\nFeb 13, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nNew Website Discussion\n\n\n\n\n\n\n\n\n\n\n\nJan 23, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nRestart Meeting\n\n\n\n\n\n\n\n\n\n\n\nDec 12, 2022\n\n\n\n\n\n\nNo matching items"
    +    "objectID": "python/survey-stats-summary.html#total",
    +    "href": "python/survey-stats-summary.html#total",
    +    "title": "Survey Summary Statistics using Python",
    +    "section": "Total",
    +    "text": "Total\nCalculating population totals can be done by changing the TaylorEstimator parameter to PopParam.total:\n\ntotal_estimator = TaylorEstimator(PopParam.total)\n\ntotal_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    remove_nan=True,\n)\nprint(total_estimator.to_dataframe())\n\n           _param     _estimate  ...          _uci       _cv\n0  PopParam.total  2.863525e+07  ...  3.291896e+07  0.070567\n\n[1 rows x 6 columns]"
       },
       {
    -    "objectID": "non_website_content/conferences/2024/abstract_useR2024.html",
    -    "href": "non_website_content/conferences/2024/abstract_useR2024.html",
    -    "title": "Conference information",
    -    "section": "",
    -    "text": "Conference information\nUseR 2024 (Salzburg)\nJuly 8-11 2024\nhttps://events.linuxfoundation.org/user/\n\nSubmission\nDeadline: March 11\nWho is submitting: Chi Zhang\n\n\n\nTitle\nIntroducing CAMIS: an open-source, community endeavor for Comparing Analysis Method Implementations in Software\n\n\nAbstract\n(No longer than 1200 characters)\nStatisticians using multiple softwares (SAS, R, Python) will have found differences in analysis results that warrant further justification. Whilst some industries may accept results not being the same as long as they are “close”, the highly regulated pharmaceutical industry would require an identical match in results. Yet, discrepancies might still occur, and knowing the reasons (different methods, options, algorithms etc) is critical to the modern statistician and subsequent regulatory submissions.\nIn this talk I will introduce CAMIS: Comparing Analysis Method Implementations in Software (CAMIS). https://psiaims.github.io/CAMIS/. It is a joint-project between PHUSE DVOST, the R Validation Hub, PSI AIMS, R consortium and ASA openstatsware. The aim of CAMIS is to investigate and document differences and similarities between different statistical softwares such as SAS and R. We use Quarto and Github to document methods, algorithms and comparisons between softwares through small case studies, and all articles are contributed by the community. In the transition from proprietary to open source technology in the industry, CAMIS can serve as a guidebook to navigate this process.\n\nkeywords: cross industry collaboration, multi-lingua, open-source, quarto\n\n\n\nLearning outcomes\n\nCAMIS is a cross-industry collaboration, focusing on documenting differences between statistical softwares (SAS, R)\nWe use open source technology (Quarto, Github, R), all articles are contributed by the community\nCAMIS aims to facilitate the transition from proprietary to open source in the industry"
    +    "objectID": "python/survey-stats-summary.html#ratios",
    +    "href": "python/survey-stats-summary.html#ratios",
    +    "title": "Survey Summary Statistics using Python",
    +    "section": "Ratios",
    +    "text": "Ratios\nCalculating population ratios can be done by changing the TaylorEstimator parameter to PopParam.ratio, and additionally specifying an x parameter in the estimate method:\n\nratio_estimator = TaylorEstimator(PopParam.ratio)\n\nratio_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"],\n    x=nhanes[\"RIAGENDR\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    remove_nan=True,\n)\nprint(ratio_estimator.to_dataframe())\n\n           _param  _estimate  _stderror      _lci      _uci       _cv\n0  PopParam.ratio   0.074222   0.003715  0.066347  0.082097  0.050049"
       },
       {
    -    "objectID": "publication/dissertation.html",
    -    "href": "publication/dissertation.html",
    -    "title": "Dissertation projects",
    -    "section": "",
    -    "text": "CAMIS have a number of dissertation projects which are likely to be suitable for MSc or BSc dissertation projects that are part of a Statistical degree.\nThis content will be useful for you, if you are:\n\na student looking for a dissertation project?\nan academic looking for projects for your students?\na researcher (academic or industry) who wants to partner with a university and student to help progress your research?\n\n\nAvailable proposals\nIf you are interested in working on one of these projects, please reach out for more information.\nAvailable dissertation projects proposals (further information pending)\n\nMax-Combo\nMultivariate methods\n\n\n\nOngoing and Previously Completed projects\nMMRM - Ongoing\nConversion of MSc Statistics Course notes from R to SAS to be used for English Medical Statistician Apprenticeship scheme - Completed 2022\n\n\nNew proposals\nIf you have an idea for a future proposal, please feel free to tell us what you are interested in!\n\nContact\nLyn @DrLynTaylor"
    +    "objectID": "python/survey-stats-summary.html#proportions",
    +    "href": "python/survey-stats-summary.html#proportions",
    +    "title": "Survey Summary Statistics using Python",
    +    "section": "Proportions",
    +    "text": "Proportions\nCalculating proportions can be done by changing the TaylorEstimator parameter to PopParam.prop:\n\nprop_estimator = TaylorEstimator(PopParam.prop)\n\nprop_estimator.estimate(\n    y=nhanes[\"agecat\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    remove_nan=True,\n)\nprop_estimator.to_dataframe()\n\n          _param    _level  _estimate  _stderror      _lci      _uci       _cv\n0  PopParam.prop    (0,19]   0.207749   0.006130  0.195054  0.221044  0.029506\n1  PopParam.prop   (19,39]   0.293408   0.009561  0.273557  0.314077  0.032585\n2  PopParam.prop   (39,59]   0.303290   0.004519  0.293795  0.312955  0.014901\n3  PopParam.prop  (59,Inf]   0.195553   0.008093  0.178965  0.213280  0.041383"
       },
       {
    -    "objectID": "publication/white_paper.html",
    -    "href": "publication/white_paper.html",
    -    "title": "Whitepaper",
    -    "section": "",
    -    "text": "Key Considerations When Understanding Differences in Statistical Methodology Implementations Across Programming Languages - An Introduction to the CAMIS Project\nThis white paper aims to empower clinical data scientists to make informed choices on the implementation of statistical analyses when multiple languages yield different results. Our objective is not to prescribe what that choice should be, but rather provide guidance on the types of questions clinical data scientists should ask, to identify the fundamental sources of discrepant results. Our objective is also to invite the wider community to contribute to an open-source repository designed for Comparing Analysis Method Implementations in Software (CAMIS: https://github.com/PSIAIMS/CAMIS).\nRead the whitepaper"
    +    "objectID": "python/survey-stats-summary.html#quantiles",
    +    "href": "python/survey-stats-summary.html#quantiles",
    +    "title": "Survey Summary Statistics using Python",
    +    "section": "Quantiles",
    +    "text": "Quantiles\nsamplics currently does not have a method to calculate quantiles."
       },
       {
    -    "objectID": "about.html",
    -    "href": "about.html",
    -    "title": "About",
    -    "section": "",
    -    "text": "CAMIS: Comparing Analysis Method Implementations in Software\nWe are a cross-industry PHUSE DVOST Working Group, run in collaboration with members from PHUSE, PSI, ASA and IASCT. In addition to discussions and issue comments which we do the github repo, we meet monthly on the 2nd Monday of each month. If you would like to join us please contact: workinggroups@phuse.global"
    +    "objectID": "python/survey-stats-summary.html#domain-estimations",
    +    "href": "python/survey-stats-summary.html#domain-estimations",
    +    "title": "Survey Summary Statistics using Python",
    +    "section": "Domain Estimations",
    +    "text": "Domain Estimations\nWe can perform domain estimations of different sub-populations by passing our domain column as a parameter to the estimate method:\n\nmean_estimator = TaylorEstimator(PopParam.mean)\n\nmean_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    domain=nhanes[\"race\"],\n    remove_nan=True,\n)\nmean_estimator.to_dataframe()\n\n          _param  _domain  _estimate  _stderror      _lci      _uci       _cv\n0  PopParam.mean        1   0.101492   0.006246  0.088251  0.114732  0.061540\n1  PopParam.mean        2   0.121649   0.006604  0.107649  0.135649  0.054288\n2  PopParam.mean        3   0.078640   0.010385  0.056626  0.100655  0.132053\n3  PopParam.mean        4   0.099679   0.024666  0.047389  0.151969  0.247458\n\n\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 24.04.1 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-15\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package * version date (UTC) lib source\n P survey  * 4.4-2   2024-03-20 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────\n\n\n\n\n─ Python configuration ────────────────────────────────────────────────────────\n Python    3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0]\n samplics  0.4.22"
       },
       {
    -    "objectID": "about.html#who-are-we",
    -    "href": "about.html#who-are-we",
    -    "title": "About",
    +    "objectID": "python/binomial_test.html",
    +    "href": "python/binomial_test.html",
    +    "title": "Binomial Test",
         "section": "",
    -    "text": "CAMIS: Comparing Analysis Method Implementations in Software\nWe are a cross-industry PHUSE DVOST Working Group, run in collaboration with members from PHUSE, PSI, ASA and IASCT. In addition to discussions and issue comments which we do the github repo, we meet monthly on the 2nd Monday of each month. If you would like to join us please contact: workinggroups@phuse.global"
    +    "text": "The statistical test used to determine whether the proportion in a binary outcome experiment is equal to a specific value. It is appropriate when we have a small sample size and want to test the success probability \\(p\\) against a hypothesized value \\(p_0\\)."
       },
       {
    -    "objectID": "about.html#objectives",
    -    "href": "about.html#objectives",
    -    "title": "About",
    -    "section": "Objectives",
    -    "text": "Objectives\nThrough the creation of the CAMIS White Paper, the group provided guidance on the types of questions statistical staff should ask to aid with replication of analysis methods in different software and to identify the fundamental sources of discrepant results between software.\nThe group aims to save unnecessary repetition of work within the community, through the creation of this open source repository. This repository welcomes contributions from the wider community and is a resource comparing and documenting differences in analysis method implementations in software."
    +    "objectID": "python/binomial_test.html#creating-a-sample-dataset",
    +    "href": "python/binomial_test.html#creating-a-sample-dataset",
    +    "title": "Binomial Test",
    +    "section": "Creating a sample dataset",
    +    "text": "Creating a sample dataset\n\nWe will generate a dataset where we record the outcomes of 1000 coin flips.\nWe will use the binom.test function to test if the proportion of heads is significantly different from 0.5.\n\n\nimport numpy as np\nfrom scipy.stats import binomtest\n\n# Set seed for reproducibility\nnp.random.seed(19)\ncoin_flips = np.random.choice(['H', 'T'], size=1000, replace=True, p=[0.5, 0.5])\n\nNow, we will count the heads and tails and summarize the data.\n\n# Count heads and tails\nheads_count = np.sum(coin_flips == 'H')\ntails_count = np.sum(coin_flips == 'T')\ntotal_flips = len(coin_flips)\n\nheads_count, tails_count, total_flips\n\n(np.int64(523), np.int64(477), 1000)"
       },
       {
    -    "objectID": "about.html#background",
    -    "href": "about.html#background",
    -    "title": "About",
    -    "section": "Background",
    -    "text": "Background\nTraditionally, highly regulated industries (such as the pharmaceutical industry), have limited themselves to the use of commercially available software. When taking such an approach, the responsibility for the validation and testing of the product was often delegated to the software development company themselves, to ensure the software performs in line with its documentation, producing accurate reliable and reproducible results. However, one downside of this approach is that new methods and functionality can be slow to be adopted, limiting new method implementation and tools that can bring in efficiency.\nWith the increase in popularity of data science, the rate at which community led tools and methods are being developed in open-source software is rapid. The availability of advanced analytic capabilities, has led to increased desire for statistical staff in regulated industries to have access and approval to use to open source software (Rimler et al. 2022). The use of open source software is now widely accepted (FDA 2015), however, this increased variety of tools has resulted in an overlap of capabilities. This has raised challenging questions of traditional approaches to clinical analyses – particularly in situations where the overlap yields different results.\nOne example of this challenge encompasses discrepancies which have been discovered in statistical analysis results between different programming languages, even when working within qualified statistical computing environments. Subtle differences exist between the fundamental approaches and assumptions implemented within each language, yielding differences in results which are correct and consistent with their respective documentation. The fact that these differences exist may cause unease for sponsor companies when submitting to a regulatory agency, as it is uncertain if the agency will view these differences as problematic. By understanding the source of any discrepancies, one can reinstate that confidence.\nThis cross-industry group aims to empower statistical staff to make informed choices on the implementation of statistical analyses when multiple languages yield different results."
    +    "objectID": "python/binomial_test.html#conducting-binomial-test",
    +    "href": "python/binomial_test.html#conducting-binomial-test",
    +    "title": "Binomial Test",
    +    "section": "Conducting Binomial Test",
    +    "text": "Conducting Binomial Test\n\n# Perform the binomial test\nbinom_test_result = binomtest(heads_count, total_flips, p=0.5)\nbinom_test_result\n\nBinomTestResult(k=523, n=1000, alternative='two-sided', statistic=0.523, pvalue=0.15469370647995673)\n\n\n\nResults:\nThe output has a p-value py binom_test_result \\(> 0.05\\) (chosen level of significance). Hence, we fail to reject the null hypothesis and conclude that the coin is fair."
       },
       {
    -    "objectID": "about.html#references",
    -    "href": "about.html#references",
    -    "title": "About",
    -    "section": "References",
    -    "text": "References\n\nMichael S. Rimler, Joseph Rickert, Min-Hua Jen, Mike Stackhouse. 2022. Understanding differences in statistical methodology implementations across programming languages.\nStatistical Software Clarifying Statement (fda.gov)\nCAMIS White Paper"
    +    "objectID": "python/binomial_test.html#conduct-the-binomial-test",
    +    "href": "python/binomial_test.html#conduct-the-binomial-test",
    +    "title": "Binomial Test",
    +    "section": "Conduct the Binomial Test",
    +    "text": "Conduct the Binomial Test\nWe will conduct the Binomial test and hypothesize that the proportion of death should be 19%.\n\n# Perform the binomial test\nbinom_test_clinical = binomtest(num_deaths, total_pat, p=0.19)\nbinom_test_clinical\n\nBinomTestResult(k=63, n=228, alternative='two-sided', statistic=0.27631578947368424, pvalue=0.0016828878642599632)"
       },
       {
    -    "objectID": "python/paired_t_test.html",
    -    "href": "python/paired_t_test.html",
    -    "title": "Paired t-test",
    -    "section": "",
    -    "text": "Paired t-tests are used to test the difference of means for two dependant variables. In the Paired t-test, the difference of the means between the two samples is compared to a given number that represents the null hypothesis. For a Paired t-test, the number of observations in each sample must be equal.\nIn Python, a Paired t-test can be performed using the scipy.stats.ttest_rel(…) function from the scipy package, which accepts the following parameters:\n1.a, b: Sample observations. The arrays must have the same shape.\n2.axis: If an int, the axis of the input along which to compute the statistic. The statistic of each axis-slice (e.g. row) of the input will appear in a corresponding element of the output. If None, the input will be raveled before computing the statistic.\n3.nan_policy: Defines how to handle input NaNs.\n4.alternative (optional): Defines the alternative hypothesis.\n5.keepdims: If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array."
    +    "objectID": "python/binomial_test.html#results-1",
    +    "href": "python/binomial_test.html#results-1",
    +    "title": "Binomial Test",
    +    "section": "Results:",
    +    "text": "Results:\nThe output has a p-value py binom_test_clinical \\(< 0.05\\) (chosen level of significance). Hence, we reject the null hypothesis and conclude that the propotion of death is significantly different from 19%."
       },
       {
    -    "objectID": "python/paired_t_test.html#paired-t-test-in-python",
    -    "href": "python/paired_t_test.html#paired-t-test-in-python",
    -    "title": "Paired t-test",
    +    "objectID": "python/correlation.html",
    +    "href": "python/correlation.html",
    +    "title": "Correlation Analysis in Python",
         "section": "",
    -    "text": "Paired t-tests are used to test the difference of means for two dependant variables. In the Paired t-test, the difference of the means between the two samples is compared to a given number that represents the null hypothesis. For a Paired t-test, the number of observations in each sample must be equal.\nIn Python, a Paired t-test can be performed using the scipy.stats.ttest_rel(…) function from the scipy package, which accepts the following parameters:\n1.a, b: Sample observations. The arrays must have the same shape.\n2.axis: If an int, the axis of the input along which to compute the statistic. The statistic of each axis-slice (e.g. row) of the input will appear in a corresponding element of the output. If None, the input will be raveled before computing the statistic.\n3.nan_policy: Defines how to handle input NaNs.\n4.alternative (optional): Defines the alternative hypothesis.\n5.keepdims: If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array."
    -  },
    -  {
    -    "objectID": "python/paired_t_test.html#data-used",
    -    "href": "python/paired_t_test.html#data-used",
    -    "title": "Paired t-test",
    -    "section": "Data Used",
    -    "text": "Data Used\n\nimport pandas as pd\n\n# Create sample data\ndata = {\n    'SBPbefore': [120, 124, 130, 118, 140, 128, 140, 135, 126, 130, 126, 127],\n    'SBPafter': [128, 131, 131, 127, 132, 125, 141, 137, 118, 132, 129, 135]\n}\n\ndf_pressure = pd.DataFrame(data)"
    -  },
    -  {
    -    "objectID": "python/paired_t_test.html#paired-t-test",
    -    "href": "python/paired_t_test.html#paired-t-test",
    -    "title": "Paired t-test",
    -    "section": "Paired t-test",
    -    "text": "Paired t-test\nThe following code was used to test the comparison in Python. Note that the baseline null hypothesis goes in the “popmean” parameter.\n\nimport pandas as pd\nfrom scipy import stats\n\n# Perform paired t-test\nt_stat, p_value = stats.ttest_rel(df_pressure['SBPbefore'], df_pressure['SBPafter'])\n\n# Print results\nprint(\"Paired t-test:\")\nprint(f\"t = {t_stat}\")\nprint(f\"p-value = {p_value}\")\n\nPaired t-test:\nt = -1.0896479884009451\np-value = 0.299163498777129"
    +    "text": "Correlation analyses measures the strength of the relationship between two variables. Correlation analyses can be used to test for associations in hypothesis testing. If the null hypothesis states there is correlation between the variables considered under the study. Then, the purpose is to investigate the possible association in the underlying variables.\nThe Scipy library in Python encompasees Stats module with pearsonr(), kendalltau(), spearsmanr() function to evaluate Pearson, Kendall and Spearsman Correlation co-efficient respectively.\n\nPearson’s Correlation\nIt is a parametric correlation test because it depends on the distribution of data. It measures the linear dependence between two variables x and y. It is the ratio between the covariance of two variables and the product of their standard deviation. The result always have a value between 1 and -1.\n\nimport pandas as pd\nfrom scipy.stats import pearsonr\n\n# Read the sample data\ndf = pd.read_csv(\"../data/NCCTG_Lung_Cancer_Data_535_29.csv\")\n\n# Convert dataframe into series\nx = df['age']\ny = df['meal.cal']\n\n# Apply the pearsonr()\ncorr, _ = pearsonr(x, y)\nprint('Pearsons correlation: %.3f' % corr)\n\nPearsons correlation: -0.240\n\n\n\n\nKendall’s Rank\nA τ test is a non-parametric hypothesis test for statistical dependence based on the τ coefficient. It is a measure of rank correlation: the similarity of the orderings of the data when ranked by each of the quantities. The Kendall correlation between two variables will be high when observations have a similar (or identical for a correlation of 1) rank (i.e. relative position label of the observations within the variable: 1st, 2nd, 3rd, etc.) between the two variables, and low when observations have a dissimilar (or fully different for a correlation of −1) rank between the two variables.\n\nimport pandas as pd\nfrom scipy.stats import kendalltau \n\n# Read the sample data\ndf = pd.read_csv(\"../data/NCCTG_Lung_Cancer_Data_535_29.csv\")\n  \n# Convert dataframe into series\nx=df['age']\ny = df['meal.cal']\n\n\n# Calculating Kendall Rank correlation \ncorr, _ = kendalltau(x, y) \nprint('Kendall Rank correlation: %.5f' % corr) \n\nKendall Rank correlation: -0.14581\n\n\n\n\nSpearman’s Rank\nSpearman’s Rank Correlation is a statistical measure of the strength and direction of the monotonic relationship between two continuous variables. Therefore, these attributes are ranked or put in the order of their preference. It is denoted by the symbol “rho” (ρ) and can take values between -1 to +1. A positive value of rho indicates that there exists a positive relationship between the two variables, while a negative value of rho indicates a negative relationship. A rho value of 0 indicates no association between the two variables.\n\nimport pandas as pd\nfrom scipy.stats import spearmanr\n \n# Read the sample data\ndf= pd.read_csv(\"../data/NCCTG_Lung_Cancer_Data_535_29.csv\")\n\n# Convert dataframe into series\nx = df['age']\ny = df['meal.cal']\n \n# calculate Spearman's correlation coefficient and p-value\ncorr, pval = spearmanr(x, y)\n \n# print the result\nprint(\"Spearman's correlation coefficient:\", corr)\nprint(\"p-value:\", pval)\n\nSpearman's correlation coefficient: -0.21159256066613205\np-value: 0.006051240282927171"
       },
       {
    -    "objectID": "python/MANOVA.html",
    -    "href": "python/MANOVA.html",
    -    "title": "MANOVA",
    +    "objectID": "python/ancova.html",
    +    "href": "python/ancova.html",
    +    "title": "Ancova",
         "section": "",
    -    "text": "MANOVA in Python\nMultivariate analysis of variance (MANOVA) is a statistical technique used to examine group mean difference of several dependent variables at once while accounting for correlations between the variables.By considering multiple dependent variables simultaneously, MANOVA provides a more comprehensive understanding of group differences and patterns. In context of python, statsmodels library can be used to implement MANOVA.\nThe from_formula() function is the recommended method to specify a model and simplifies testing without needing to manually configure the contrast matrices.\nExample 39.6 Multivariate Analysis of Variance from SAS MANOVA User Guide\nThis example employs multivariate analysis of variance (MANOVA) to measure differences in the chemical characteristics of ancient pottery found at four kiln sites in Great Britain. The data are from Tubb, Parker, and Nickless (1980), as reported in Hand et al. (1994).\nFor each of 26 samples of pottery, the percentages of oxides of five metals are measured. The following statements create the data set and invoke the GLM procedure to perform a one-way MANOVA. Additionally, it is of interest to know whether the pottery from one site in Wales (Llanederyn) differs from the samples from other sites; a CONTRAST statement is used to test this hypothesis.\n\nimport pandas as pd\nfrom statsmodels.multivariate.manova import MANOVA\n\ndf= pd.read_csv(\"../data/manova1.csv\")\ndf.rename(columns={'al':'Al','fe':'Fe','mg':'Mg','ca ':'Ca','na':'Na'},inplace=True)\n\nmanova = MANOVA.from_formula('Al + Fe + Mg + Ca + Na ~ site', data=df)\nresult = manova.mv_test()\nprint(result)\n\n                   Multivariate linear model\n===============================================================\n                                                               \n---------------------------------------------------------------\n        Intercept         Value  Num DF  Den DF F Value  Pr > F\n---------------------------------------------------------------\n           Wilks' lambda  0.0300 5.0000 18.0000 116.5838 0.0000\n          Pillai's trace  0.9700 5.0000 18.0000 116.5838 0.0000\n  Hotelling-Lawley trace 32.3844 5.0000 18.0000 116.5838 0.0000\n     Roy's greatest root 32.3844 5.0000 18.0000 116.5838 0.0000\n---------------------------------------------------------------\n                                                               \n---------------------------------------------------------------\n          site           Value   Num DF  Den DF F Value  Pr > F\n---------------------------------------------------------------\n          Wilks' lambda  0.0123 15.0000 50.0915  13.0885 0.0000\n         Pillai's trace  1.5539 15.0000 60.0000   4.2984 0.0000\n Hotelling-Lawley trace 35.4388 15.0000 29.1304  40.5880 0.0000\n    Roy's greatest root 34.1611  5.0000 20.0000 136.6445 0.0000\n===============================================================\n\n\n\nThe Wilki’s lambda test evaluates the significance of group difference across several dependent variables. A lower Wilk’s Lambda value suggest more evidence of group difference.\nThe Pillai’s Trace test statistics is statistically significant [Pillai’s Trace = 1.55, F(6, 72) = 4.29, p < 0.001] and indicates that sites has a statistically significant association with all the listed elements.\nNOTE: if you feel you can help with the above discrepancy please contribute to the CAMIS repo by following the instructions on the contributions page."
    +    "text": "In this example, we’re looking at Analysis of Covariance. ANCOVA is typically used to analyse treatment differences, to see examples of prediction models go to the simple linear regression page."
       },
       {
    -    "objectID": "python/logistic_regression.html",
    -    "href": "python/logistic_regression.html",
    -    "title": "Logistic Regression",
    +    "objectID": "python/ancova.html#introduction",
    +    "href": "python/ancova.html#introduction",
    +    "title": "Ancova",
         "section": "",
    -    "text": "#data manipulation\nimport pandas as pd\nimport numpy as np\n\n#modelling\nimport statsmodels.api as sm\nfrom sklearn.linear_model import LogisticRegression"
    -  },
    -  {
    -    "objectID": "python/logistic_regression.html#statsmodels-package",
    -    "href": "python/logistic_regression.html#statsmodels-package",
    -    "title": "Logistic Regression",
    -    "section": "Statsmodels package",
    -    "text": "Statsmodels package\nWe will use the sm.Logit() method to fit our logistic regression model.\n\n#intercept column\nx_sm = sm.add_constant(x)\n\n#fit model\nlr_sm = sm.Logit(y, x_sm).fit() \nprint(lr_sm.summary())\n\nOptimization terminated successfully.\n         Current function value: 0.568825\n         Iterations 5\n                           Logit Regression Results                           \n==============================================================================\nDep. Variable:                 wt_grp   No. Observations:                  167\nModel:                          Logit   Df Residuals:                      162\nMethod:                           MLE   Df Model:                            4\nDate:                Thu, 10 Oct 2024   Pseudo R-squ.:                 0.05169\nTime:                        16:53:06   Log-Likelihood:                -94.994\nconverged:                       True   LL-Null:                       -100.17\nCovariance Type:            nonrobust   LLR p-value:                   0.03484\n==============================================================================\n                 coef    std err          z      P>|z|      [0.025      0.975]\n------------------------------------------------------------------------------\nconst          3.3576      1.654      2.029      0.042       0.115       6.600\nage           -0.0126      0.021     -0.598      0.550      -0.054       0.029\nsex           -0.8645      0.371     -2.328      0.020      -1.592      -0.137\nph.ecog        0.4182      0.263      1.592      0.111      -0.097       0.933\nmeal.cal      -0.0009      0.000     -1.932      0.053      -0.002    1.27e-05\n==============================================================================\n\n\n\nModel fitting\nIn addition to the information contained in the summary, we can display the model coefficients as odds ratios:\n\nprint(\"Odds ratios for statsmodels logistic regression:\")\nprint(np.exp(lr_sm.params))\n\nOdds ratios for statsmodels logistic regression:\nconst       28.719651\nage          0.987467\nsex          0.421266\nph.ecog      1.519198\nmeal.cal     0.999140\ndtype: float64\n\n\nWe can also provide the 5% confidence intervals for the odds ratios:\n\nprint(\"CI at 5% for statsmodels logistic regression:\")\nprint(np.exp(lr_sm.conf_int(alpha = 0.05)))\n\nCI at 5% for statsmodels logistic regression:\n                 0           1\nconst     1.121742  735.301118\nage       0.947449    1.029175\nsex       0.203432    0.872354\nph.ecog   0.907984    2.541852\nmeal.cal  0.998269    1.000013\n\n\n\n\nPrediction\nLet’s use our trained model to make a weight loss prediction about a new patient.\n\n# new female, symptomatic but completely ambulatory patient consuming 2500 calories\nnew_pt = pd.DataFrame({\n    \"age\": [56],\n    \"sex\": [2],\n    \"ph.ecog\": [1.00], \n    \"meal.cal\": [2500]\n})\n\n# Add intercept term to the new data; for a single row this should be \n# forced using the `add_constant` command\nnew_pt_sm = sm.add_constant(new_pt, has_constant=\"add\")\nprint(\"Probability of weight loss using the statsmodels package:\")\nprint(lr_sm.predict(new_pt_sm))\n\nProbability of weight loss using the statsmodels package:\n0    0.308057\ndtype: float64"
    -  },
    -  {
    -    "objectID": "python/logistic_regression.html#scikit-learn-package",
    -    "href": "python/logistic_regression.html#scikit-learn-package",
    -    "title": "Logistic Regression",
    -    "section": "Scikit-learn Package",
    -    "text": "Scikit-learn Package\nThe scikit-learn package is a popular package for machine learning and predictive modelling.\n\n\n\n\n\n\nWarning\n\n\n\nIt’s important to note that l2 regularisation is applied by default in the scikit-learn implementation of logistic regression. More recent releases of this package include an option to have no regularisation penalty.\n\n\n\nlr_sk = LogisticRegression(penalty=None).fit(x, y)\n\nUnlike the statsmodels approach scikit-learn doesn’t have a summary method for the model but you can extract some of the model parameters as follows:\n\nprint(\"Intercept for scikit learn logistic regression:\")\nprint(lr_sk.intercept_)\nprint(\"Odds ratios for scikit learn logistic regression:\")\nprint(np.exp(lr_sk.coef_))\n\nIntercept for scikit learn logistic regression:\n[3.35756405]\nOdds ratios for scikit learn logistic regression:\n[[0.98746739 0.42126736 1.51919379 0.99914048]]\n\n\nHowever, obtaining the confidence intervals and other metrics is not directly supported in scikit-learn.\n\nPrediction\nUsing the same new patient example we can use our logistic regression model to make a prediction. The predict_proba method is used to return the probability for each class. If you are interested in viewing the prediction for y = 1, i.e. the probability of weight loss then you can select the second probability as shown:\n\nprint(\"Probability of weight loss using the scikit-learn package:\")\nprint(lr_sk.predict_proba(new_pt)[:,1])\n\nProbability of weight loss using the scikit-learn package:\n[0.30805813]"
    +    "text": "In this example, we’re looking at Analysis of Covariance. ANCOVA is typically used to analyse treatment differences, to see examples of prediction models go to the simple linear regression page."
       },
       {
    -    "objectID": "python/logistic_regression.html#conclusions",
    -    "href": "python/logistic_regression.html#conclusions",
    -    "title": "Logistic Regression",
    -    "section": "Conclusions",
    -    "text": "Conclusions\nThere are two main ways to fit a logistic regression using python. Each of these packages have their advantages with statsmodel geared more towards model and coefficient interpretation in low dimensional data settings and in contrast the scikit-learn implementation more appropriate for use cases focused on prediction with more complex, higher dimensional data."
    +    "objectID": "python/ancova.html#data-summary",
    +    "href": "python/ancova.html#data-summary",
    +    "title": "Ancova",
    +    "section": "Data Summary",
    +    "text": "Data Summary\n\nimport pandas as pd\n\n# Input data\ndata = {\n    'drug': [\"A\", \"A\", \"A\", \"A\", \"A\", \"A\", \"A\", \"A\", \"A\", \"A\",\n             \"D\", \"D\", \"D\", \"D\", \"D\", \"D\", \"D\", \"D\", \"D\", \"D\",\n             \"F\", \"F\", \"F\", \"F\", \"F\", \"F\", \"F\", \"F\", \"F\", \"F\"],\n    'pre': [11, 8, 5, 14, 19, 6, 10, 6, 11, 3,\n            6, 6, 7, 8, 18, 8, 19, 8, 5, 15,\n            16, 13, 11, 9, 21, 16, 12, 12, 7, 12],\n    'post': [6, 0, 2, 8, 11, 4, 13, 1, 8, 0,\n             0, 2, 3, 1, 18, 4, 14, 9, 1, 9,\n             13, 10, 18, 5, 23, 12, 5, 16, 1, 20]\n}\n\ndf = pd.DataFrame(data)\n\n\n# Descriptive statistics\nsummary_stats = df.describe()\n\n# Calculate median\nmedian_pre = df['pre'].median()\nmedian_post = df['post'].median()\n\n# Add median to the summary statistics\nsummary_stats.loc['median'] = [median_pre, median_post]\n\nprint(summary_stats)\n\n              pre       post\ncount   30.000000  30.000000\nmean    10.733333   7.900000\nstd      4.791755   6.666178\nmin      3.000000   0.000000\n25%      7.000000   2.000000\n50%     10.500000   7.000000\n75%     13.750000  12.750000\nmax     21.000000  23.000000\nmedian  10.500000   7.000000"
       },
       {
    -    "objectID": "python/kruskal_wallis.html",
    -    "href": "python/kruskal_wallis.html",
    -    "title": "Kruskal Wallis in Python",
    -    "section": "",
    -    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of the iris dataset, testing for difference in sepal width between species of flower.\n\nimport pandas as pd\n\n# Define the data\ndata = {\n    'Species': ['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica'],\n    'Sepal_Width': [3.4, 3.0, 3.4, 3.2, 3.5, 3.1, 2.7, 2.9, 2.7, 2.6, 2.5, 2.5, 3.0, 3.0, 3.1, 3.8, 2.7, 3.3]\n}\n\n# Create the DataFrame\niris_sub = pd.DataFrame(data)\n\n# Print the DataFrame\nprint(iris_sub)\n\n       Species  Sepal_Width\n0       setosa          3.4\n1       setosa          3.0\n2       setosa          3.4\n3       setosa          3.2\n4       setosa          3.5\n5       setosa          3.1\n6   versicolor          2.7\n7   versicolor          2.9\n8   versicolor          2.7\n9   versicolor          2.6\n10  versicolor          2.5\n11  versicolor          2.5\n12   virginica          3.0\n13   virginica          3.0\n14   virginica          3.1\n15   virginica          3.8\n16   virginica          2.7\n17   virginica          3.3"
    +    "objectID": "python/ancova.html#ancova-in-python",
    +    "href": "python/ancova.html#ancova-in-python",
    +    "title": "Ancova",
    +    "section": "Ancova in Python",
    +    "text": "Ancova in Python\nIn Python, Ancova can be performed using the statsmodels library from the scipy package.\n\nimport statsmodels.api as sm\nimport statsmodels.formula.api as smf\nfrom tabulate import tabulate\n\n# Fit the ANCOVA model\nmodel_ancova = smf.ols('post ~ drug + pre', data=df).fit()\n\n# Summary of the model\nmodel_summary = model_ancova.summary()\nprint(model_summary)\n\n# Extracting glance (summary) information\nmodel_glance = {\n    'r_squared': model_ancova.rsquared,\n    'adj_r_squared': model_ancova.rsquared_adj,\n    'f_statistic': model_ancova.fvalue,\n    'f_pvalue': model_ancova.f_pvalue,\n    'aic': model_ancova.aic,\n    'bic': model_ancova.bic\n}\nmodel_glance_df = pd.DataFrame([model_glance])\nprint(tabulate(model_glance_df, headers='keys', tablefmt='grid'))\n\n# Extracting tidy (coefficients) information\nmodel_tidy = model_ancova.summary2().tables[1]\nprint(tabulate(model_tidy, headers='keys', tablefmt='grid'))\n\n                            OLS Regression Results                            \n==============================================================================\nDep. Variable:                   post   R-squared:                       0.676\nModel:                            OLS   Adj. R-squared:                  0.639\nMethod:                 Least Squares   F-statistic:                     18.10\nDate:                Tue, 15 Oct 2024   Prob (F-statistic):           1.50e-06\nTime:                        16:24:24   Log-Likelihood:                -82.054\nNo. Observations:                  30   AIC:                             172.1\nDf Residuals:                      26   BIC:                             177.7\nDf Model:                           3                                         \nCovariance Type:            nonrobust                                         \n==============================================================================\n                 coef    std err          t      P>|t|      [0.025      0.975]\n------------------------------------------------------------------------------\nIntercept     -3.8808      1.986     -1.954      0.062      -7.964       0.202\ndrug[T.D]      0.1090      1.795      0.061      0.952      -3.581       3.799\ndrug[T.F]      3.4461      1.887      1.826      0.079      -0.432       7.324\npre            0.9872      0.164      6.001      0.000       0.649       1.325\n==============================================================================\nOmnibus:                        2.609   Durbin-Watson:                   2.526\nProb(Omnibus):                  0.271   Jarque-Bera (JB):                2.148\nSkew:                           0.645   Prob(JB):                        0.342\nKurtosis:                       2.765   Cond. No.                         39.8\n==============================================================================\n\nNotes:\n[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n+----+-------------+-----------------+---------------+-------------+---------+---------+\n|    |   r_squared |   adj_r_squared |   f_statistic |    f_pvalue |     aic |     bic |\n+====+=============+=================+===============+=============+=========+=========+\n|  0 |    0.676261 |        0.638906 |       18.1039 | 1.50137e-06 | 172.108 | 177.712 |\n+----+-------------+-----------------+---------------+-------------+---------+---------+\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n|           |     Coef. |   Std.Err. |          t |       P>|t| |    [0.025 |   0.975] |\n+===========+===========+============+============+=============+===========+==========+\n| Intercept | -3.88081  |   1.9862   | -1.95388   | 0.0615519   | -7.96351  | 0.201887 |\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n| drug[T.D] |  0.108971 |   1.79514  |  0.0607037 | 0.952059    | -3.58098  | 3.79892  |\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n| drug[T.F] |  3.44614  |   1.88678  |  1.82646   | 0.0792846   | -0.432195 | 7.32447  |\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n| pre       |  0.987184 |   0.164498 |  6.00121   | 2.45433e-06 |  0.649054 | 1.32531  |\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n\n\nPlease note that all values match with the corresponding R version, except for the AIC and BIC values, which differ slightly. This should be acceptable for most practical purposes in statistical analysis. Currently, there are ongoing discussions in the statsmodels community regarding the computational details of AIC and BIC.\nThe following code can be used to enforce complete consistency of AIC and BIC values with R outputs by adding 1 to the number of parameters:\n\nimport numpy as np\n\n# Manual calculation of AIC and BIC to ensure consistency with R\nn = df.shape[0]  # number of observations\nk = model_ancova.df_model + 1  # number of parameters (including intercept)\nlog_lik = model_ancova.llf  # log-likelihood\n\n# Adjusted number of parameters (including scale parameter)\nk_adjusted = k + 1\n\n# Manually calculate AIC and BIC to match R's behavior\naic_adjusted = 2 * k_adjusted - 2 * log_lik\nbic_adjusted = np.log(n) * k_adjusted - 2 * log_lik\n\nprint(f\"Number of observations (n): {n}\")\nprint(f\"Number of parameters (k_adjusted): {k_adjusted}\")\nprint(f\"Log-likelihood: {log_lik}\")\nprint(f\"AIC (adjusted): {aic_adjusted}\")\nprint(f\"BIC (adjusted): {bic_adjusted}\")\n\nNumber of observations (n): 30\nNumber of parameters (k_adjusted): 5.0\nLog-likelihood: -82.0537744890265\nAIC (adjusted): 174.107548978053\nBIC (adjusted): 181.11353588636376\n\n\nThere are different types of anova computations. The statsmodels.stats.anova.anova_lm function allows the types 1, 2 and 3. The code to compute these types is depicted below:\n\nimport statsmodels.formula.api as smf\nimport statsmodels.stats.anova as ssa\n\n# Center the predictor for Type III anova\n#df['pre_centered'] = df['pre'] - df['pre'].mean()\n\n# Fit the model for types I and II anova\nmodel = smf.ols('post ~ C(drug) + pre', data=df).fit()\n\n# Perform anova for types I and II\nancova_table_type_1 = ssa.anova_lm(model, typ=1)\nancova_table_type_2 = ssa.anova_lm(model, typ=2)\n\n# Fit the model for Type III anova with centered predictors\nmodel_type_3 = smf.ols('post ~ C(drug) + pre', data=df).fit()\nancova_table_type_3 = ssa.anova_lm(model_type_3, typ=3)\n\n# Calculate SSd (sum of squares for residuals)\nssd_type1 = ancova_table_type_1['sum_sq'].loc['Residual']\nssd_type2 = ancova_table_type_2['sum_sq'].loc['Residual']\nssd_type3 = ancova_table_type_3['sum_sq'].loc['Residual']\n\n# Calculate ges\nancova_table_type_1['ges'] = ancova_table_type_1['sum_sq'] / (ancova_table_type_1['sum_sq'] + ssd_type1)\nancova_table_type_2['ges'] = ancova_table_type_2['sum_sq'] / (ancova_table_type_2['sum_sq'] + ssd_type2)\nancova_table_type_3['ges'] = ancova_table_type_3['sum_sq'] / (ancova_table_type_3['sum_sq'] + ssd_type3)\n\n# Add SSd column\nancova_table_type_1['SSd'] = ssd_type1\nancova_table_type_2['SSd'] = ssd_type2\nancova_table_type_3['SSd'] = ssd_type3\n\n# Add significance column\nancova_table_type_1['p<0.05'] = ancova_table_type_1['PR(>F)'] < 0.05\nancova_table_type_2['p<0.05'] = ancova_table_type_2['PR(>F)'] < 0.05\nancova_table_type_3['p<0.05'] = ancova_table_type_3['PR(>F)'] < 0.05\n\n# Rename columns to match the R output\nancova_table_type_1.rename(columns={'sum_sq': 'SSn', 'df': 'DFn', 'F': 'F', 'PR(>F)': 'p'}, inplace=True)\nancova_table_type_1.reset_index(inplace=True)\nancova_table_type_1.rename(columns={'index': 'Effect'}, inplace=True)\n\nancova_table_type_2.rename(columns={'sum_sq': 'SSn', 'df': 'DFn', 'F': 'F', 'PR(>F)': 'p'}, inplace=True)\nancova_table_type_2.reset_index(inplace=True)\nancova_table_type_2.rename(columns={'index': 'Effect'}, inplace=True)\n\nancova_table_type_3.rename(columns={'sum_sq': 'SSn', 'df': 'DFn', 'F': 'F', 'PR(>F)': 'p'}, inplace=True)\nancova_table_type_3.reset_index(inplace=True)\nancova_table_type_3.rename(columns={'index': 'Effect'}, inplace=True)\n\n# Calculate DFd (degrees of freedom for residuals)\ndfd_type1 = ancova_table_type_1.loc[ancova_table_type_1['Effect'] == 'Residual', 'DFn'].values[0]\ndfd_type2 = ancova_table_type_2.loc[ancova_table_type_2['Effect'] == 'Residual', 'DFn'].values[0]\ndfd_type3 = ancova_table_type_3.loc[ancova_table_type_3['Effect'] == 'Residual', 'DFn'].values[0]\nancova_table_type_1['DFd'] = dfd_type1\nancova_table_type_2['DFd'] = dfd_type2\nancova_table_type_3['DFd'] = dfd_type3\n\n# Filter out the Residual row\nancova_table_type_1 = ancova_table_type_1[ancova_table_type_1['Effect'] != 'Residual']\nancova_table_type_2 = ancova_table_type_2[ancova_table_type_2['Effect'] != 'Residual']\nancova_table_type_3 = ancova_table_type_3[ancova_table_type_3['Effect'] != 'Residual']\n\n# Select and reorder columns to match the R output\nancova_table_type_1 = ancova_table_type_1[['Effect', 'DFn', 'DFd', 'SSn', 'SSd', 'F', 'p', 'p<0.05', 'ges']]\nancova_table_type_2 = ancova_table_type_2[['Effect', 'DFn', 'DFd', 'SSn', 'SSd', 'F', 'p', 'p<0.05', 'ges']]\nancova_table_type_3 = ancova_table_type_3[['Effect', 'DFn', 'DFd', 'SSn', 'SSd', 'F', 'p', 'p<0.05', 'ges']]"
       },
       {
    -    "objectID": "python/kruskal_wallis.html#introduction",
    -    "href": "python/kruskal_wallis.html#introduction",
    -    "title": "Kruskal Wallis in Python",
    -    "section": "",
    -    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of the iris dataset, testing for difference in sepal width between species of flower.\n\nimport pandas as pd\n\n# Define the data\ndata = {\n    'Species': ['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica'],\n    'Sepal_Width': [3.4, 3.0, 3.4, 3.2, 3.5, 3.1, 2.7, 2.9, 2.7, 2.6, 2.5, 2.5, 3.0, 3.0, 3.1, 3.8, 2.7, 3.3]\n}\n\n# Create the DataFrame\niris_sub = pd.DataFrame(data)\n\n# Print the DataFrame\nprint(iris_sub)\n\n       Species  Sepal_Width\n0       setosa          3.4\n1       setosa          3.0\n2       setosa          3.4\n3       setosa          3.2\n4       setosa          3.5\n5       setosa          3.1\n6   versicolor          2.7\n7   versicolor          2.9\n8   versicolor          2.7\n9   versicolor          2.6\n10  versicolor          2.5\n11  versicolor          2.5\n12   virginica          3.0\n13   virginica          3.0\n14   virginica          3.1\n15   virginica          3.8\n16   virginica          2.7\n17   virginica          3.3"
    +    "objectID": "python/ancova.html#type-1-ancova-in-python",
    +    "href": "python/ancova.html#type-1-ancova-in-python",
    +    "title": "Ancova",
    +    "section": "Type 1 Ancova in Python",
    +    "text": "Type 1 Ancova in Python\n\nprint(tabulate(ancova_table_type_1, headers='keys', tablefmt='grid'))\n\n+----+----------+-------+-------+---------+---------+----------+-------------+----------+----------+\n|    | Effect   |   DFn |   DFd |     SSn |     SSd |        F |           p | p<0.05   |      ges |\n+====+==========+=======+=======+=========+=========+==========+=============+==========+==========+\n|  0 | C(drug)  |     2 |    26 | 293.6   | 417.203 |  9.14855 | 0.000981237 | True     | 0.413054 |\n+----+----------+-------+-------+---------+---------+----------+-------------+----------+----------+\n|  1 | pre      |     1 |    26 | 577.897 | 417.203 | 36.0145  | 2.45433e-06 | True     | 0.580743 |\n+----+----------+-------+-------+---------+---------+----------+-------------+----------+----------+"
       },
       {
    -    "objectID": "python/kruskal_wallis.html#implementing-kruskal-wallis-in-python",
    -    "href": "python/kruskal_wallis.html#implementing-kruskal-wallis-in-python",
    -    "title": "Kruskal Wallis in Python",
    -    "section": "Implementing Kruskal-Wallis in Python",
    -    "text": "Implementing Kruskal-Wallis in Python\nThe Kruskal-Wallis test can be implemented in Python using the kruskal function from scipy.stats. The null hypothesis is that the samples are from identical populations.\n\nfrom scipy.stats import kruskal\n\n# Separate the data for each species\nsetosa_data = iris_sub[iris_sub['Species'] == 'setosa']['Sepal_Width']\nversicolor_data = iris_sub[iris_sub['Species'] == 'versicolor']['Sepal_Width']\nvirginica_data = iris_sub[iris_sub['Species'] == 'virginica']['Sepal_Width']\n\n# Perform the Kruskal-Wallis H-test\nh_statistic, p_value = kruskal(setosa_data, versicolor_data, virginica_data)\n\n# Calculate the degrees of freedom\nk = len(iris_sub['Species'].unique())\ndf = k - 1\n\nprint(\"H-statistic:\", h_statistic)\nprint(\"p-value:\", p_value)\nprint(\"Degrees of freedom:\", df)\n\nH-statistic: 10.922233820459285\np-value: 0.0042488075570347485\nDegrees of freedom: 2"
    +    "objectID": "python/ancova.html#type-2-ancova-in-python",
    +    "href": "python/ancova.html#type-2-ancova-in-python",
    +    "title": "Ancova",
    +    "section": "Type 2 Ancova in Python",
    +    "text": "Type 2 Ancova in Python\n\nprint(tabulate(ancova_table_type_2, headers='keys', tablefmt='grid'))\n\n+----+----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|    | Effect   |   DFn |   DFd |      SSn |     SSd |        F |           p | p<0.05   |      ges |\n+====+==========+=======+=======+==========+=========+==========+=============+==========+==========+\n|  0 | C(drug)  |     2 |    26 |  68.5537 | 417.203 |  2.13613 | 0.138379    | False    | 0.141128 |\n+----+----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|  1 | pre      |     1 |    26 | 577.897  | 417.203 | 36.0145  | 2.45433e-06 | True     | 0.580743 |\n+----+----------+-------+-------+----------+---------+----------+-------------+----------+----------+"
       },
       {
    -    "objectID": "python/kruskal_wallis.html#results",
    -    "href": "python/kruskal_wallis.html#results",
    -    "title": "Kruskal Wallis in Python",
    -    "section": "Results",
    -    "text": "Results\nAs seen above, Python outputs the Kruskal-Wallis rank sum statistic (10.922), the degrees of freedom (2), and the p-value of the test (0.004249). Therefore, the difference in population medians is statistically significant at the 5% level."
    +    "objectID": "python/ancova.html#type-3-ancova-in-python",
    +    "href": "python/ancova.html#type-3-ancova-in-python",
    +    "title": "Ancova",
    +    "section": "Type 3 Ancova in Python",
    +    "text": "Type 3 Ancova in Python\n\nprint(tabulate(ancova_table_type_3, headers='keys', tablefmt='grid'))\n\n+----+-----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|    | Effect    |   DFn |   DFd |      SSn |     SSd |        F |           p | p<0.05   |      ges |\n+====+===========+=======+=======+==========+=========+==========+=============+==========+==========+\n|  0 | Intercept |     1 |    26 |  61.2592 | 417.203 |  3.81767 | 0.0615519   | False    | 0.128034 |\n+----+-----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|  1 | C(drug)   |     2 |    26 |  68.5537 | 417.203 |  2.13613 | 0.138379    | False    | 0.141128 |\n+----+-----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|  2 | pre       |     1 |    26 | 577.897  | 417.203 | 36.0145  | 2.45433e-06 | True     | 0.580743 |\n+----+-----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n\n\nPlease note that the results are consistent with the results achieved with R, except for the first row of the type 3 table featuring the intercept."
       },
       {
    -    "objectID": "python/correlation.html",
    -    "href": "python/correlation.html",
    -    "title": "Correlation Analysis in Python",
    +    "objectID": "python/Summary_statistics.html",
    +    "href": "python/Summary_statistics.html",
    +    "title": "Summary statistics",
         "section": "",
    -    "text": "Correlation analyses measures the strength of the relationship between two variables. Correlation analyses can be used to test for associations in hypothesis testing. If the null hypothesis states there is correlation between the variables considered under the study. Then, the purpose is to investigate the possible association in the underlying variables.\nThe Scipy library in Python encompasees Stats module with pearsonr(), kendalltau(), spearsmanr() function to evaluate Pearson, Kendall and Spearsman Correlation co-efficient respectively.\n\nPearson’s Correlation\nIt is a parametric correlation test because it depends on the distribution of data. It measures the linear dependence between two variables x and y. It is the ratio between the covariance of two variables and the product of their standard deviation. The result always have a value between 1 and -1.\n\nimport pandas as pd\nfrom scipy.stats import pearsonr\n\n# Read the sample data\ndf = pd.read_csv(\"../data/NCCTG_Lung_Cancer_Data_535_29.csv\")\n\n# Convert dataframe into series\nx = df['age']\ny = df['meal.cal']\n\n# Apply the pearsonr()\ncorr, _ = pearsonr(x, y)\nprint('Pearsons correlation: %.3f' % corr)\n\nPearsons correlation: -0.240\n\n\n\n\nKendall’s Rank\nA τ test is a non-parametric hypothesis test for statistical dependence based on the τ coefficient. It is a measure of rank correlation: the similarity of the orderings of the data when ranked by each of the quantities. The Kendall correlation between two variables will be high when observations have a similar (or identical for a correlation of 1) rank (i.e. relative position label of the observations within the variable: 1st, 2nd, 3rd, etc.) between the two variables, and low when observations have a dissimilar (or fully different for a correlation of −1) rank between the two variables.\n\nimport pandas as pd\nfrom scipy.stats import kendalltau \n\n# Read the sample data\ndf = pd.read_csv(\"../data/NCCTG_Lung_Cancer_Data_535_29.csv\")\n  \n# Convert dataframe into series\nx=df['age']\ny = df['meal.cal']\n\n\n# Calculating Kendall Rank correlation \ncorr, _ = kendalltau(x, y) \nprint('Kendall Rank correlation: %.5f' % corr) \n\nKendall Rank correlation: -0.14581\n\n\n\n\nSpearman’s Rank\nSpearman’s Rank Correlation is a statistical measure of the strength and direction of the monotonic relationship between two continuous variables. Therefore, these attributes are ranked or put in the order of their preference. It is denoted by the symbol “rho” (ρ) and can take values between -1 to +1. A positive value of rho indicates that there exists a positive relationship between the two variables, while a negative value of rho indicates a negative relationship. A rho value of 0 indicates no association between the two variables.\n\nimport pandas as pd\nfrom scipy.stats import spearmanr\n \n# Read the sample data\ndf= pd.read_csv(\"../data/NCCTG_Lung_Cancer_Data_535_29.csv\")\n\n# Convert dataframe into series\nx = df['age']\ny = df['meal.cal']\n \n# calculate Spearman's correlation coefficient and p-value\ncorr, pval = spearmanr(x, y)\n \n# print the result\nprint(\"Spearman's correlation coefficient:\", corr)\nprint(\"p-value:\", pval)\n\nSpearman's correlation coefficient: -0.21159256066613205\np-value: 0.006051240282927171"
    +    "text": "The numpy.percentile() function is useful to determine the nth-percentile for the given array of data. It returns an array with percentile values or a scalar along the specified axis. The function accepts the following parameters:\n1.array: The array of data whose percentile needs to be calculated.\n2.percentile: Denotes the percentile that needs to be computed.\n3.axis (optional): Denotes the axis along which the percentile is calculated. By default, a flattened array is used.\n4.out (optional): An alternate output array where we can place the result.\n5.overwrite_input (optional): Used to modify the input array.\n6.keepdims (optional): Creates reduced axes with dimensions of one size.\n\nimport numpy as np\n\nsample_data=[12, 25, 16, 50, 34, 29, 60, 86, 52, 39, 41]\n\npercentile = np.percentile(sample_data,75)\n\nprint(percentile)\n\n51.0"
       },
       {
    -    "objectID": "python/binomial_test.html",
    -    "href": "python/binomial_test.html",
    -    "title": "Binomial Test",
    +    "objectID": "python/linear_regression.html",
    +    "href": "python/linear_regression.html",
    +    "title": "Linear Regression",
         "section": "",
    -    "text": "The statistical test used to determine whether the proportion in a binary outcome experiment is equal to a specific value. It is appropriate when we have a small sample size and want to test the success probability \\(p\\) against a hypothesized value \\(p_0\\)."
    -  },
    -  {
    -    "objectID": "python/binomial_test.html#creating-a-sample-dataset",
    -    "href": "python/binomial_test.html#creating-a-sample-dataset",
    -    "title": "Binomial Test",
    -    "section": "Creating a sample dataset",
    -    "text": "Creating a sample dataset\n\nWe will generate a dataset where we record the outcomes of 1000 coin flips.\nWe will use the binom.test function to test if the proportion of heads is significantly different from 0.5.\n\n\nimport numpy as np\nfrom scipy.stats import binomtest\n\n# Set seed for reproducibility\nnp.random.seed(19)\ncoin_flips = np.random.choice(['H', 'T'], size=1000, replace=True, p=[0.5, 0.5])\n\nNow, we will count the heads and tails and summarize the data.\n\n# Count heads and tails\nheads_count = np.sum(coin_flips == 'H')\ntails_count = np.sum(coin_flips == 'T')\ntotal_flips = len(coin_flips)\n\nheads_count, tails_count, total_flips\n\n(np.int64(523), np.int64(477), 1000)"
    -  },
    -  {
    -    "objectID": "python/binomial_test.html#conducting-binomial-test",
    -    "href": "python/binomial_test.html#conducting-binomial-test",
    -    "title": "Binomial Test",
    -    "section": "Conducting Binomial Test",
    -    "text": "Conducting Binomial Test\n\n# Perform the binomial test\nbinom_test_result = binomtest(heads_count, total_flips, p=0.5)\nbinom_test_result\n\nBinomTestResult(k=523, n=1000, alternative='two-sided', statistic=0.523, pvalue=0.15469370647995673)\n\n\n\nResults:\nThe output has a p-value py binom_test_result \\(> 0.05\\) (chosen level of significance). Hence, we fail to reject the null hypothesis and conclude that the coin is fair."
    -  },
    -  {
    -    "objectID": "python/binomial_test.html#conduct-the-binomial-test",
    -    "href": "python/binomial_test.html#conduct-the-binomial-test",
    -    "title": "Binomial Test",
    -    "section": "Conduct the Binomial Test",
    -    "text": "Conduct the Binomial Test\nWe will conduct the Binomial test and hypothesize that the proportion of death should be 19%.\n\n# Perform the binomial test\nbinom_test_clinical = binomtest(num_deaths, total_pat, p=0.19)\nbinom_test_clinical\n\nBinomTestResult(k=63, n=228, alternative='two-sided', statistic=0.27631578947368424, pvalue=0.0016828878642599632)"
    -  },
    -  {
    -    "objectID": "python/binomial_test.html#results-1",
    -    "href": "python/binomial_test.html#results-1",
    -    "title": "Binomial Test",
    -    "section": "Results:",
    -    "text": "Results:\nThe output has a p-value py binom_test_clinical \\(< 0.05\\) (chosen level of significance). Hence, we reject the null hypothesis and conclude that the propotion of death is significantly different from 19%."
    +    "text": "To demonstrate the use of linear regression we examine a dataset that illustrates the relationship between Height and Weight in a group of 237 teen-aged boys and girls. The dataset is available here and is imported to the workspace.\n\nDescriptive Statistics\nThe first step is to obtain the simple descriptive statistics for the numeric variables of htwt data, and one-way frequencies for categorical variables. This is accomplished by employing summary function. There are 237 participants who are from 13.9 to 25 years old. It is a cross-sectional study, with each participant having one observation. We can use this data set to examine the relationship of participants’ height to their age and sex.\n\nimport pandas as pd\nimport statsmodels.api as sm\n\n# Importing CSV\nhtwt = pd.read_csv(\"../data/htwt.csv\")\n\nIn order to create a regression model to demonstrate the relationship between age and height for females, we first need to create a flag variable identifying females and an interaction variable between age and female gender flag.\n\nhtwt['female'] = (htwt['SEX'] == 'f').astype(int)\nhtwt['fem_age'] = htwt['AGE'] * htwt['female']\nhtwt.head()\n\n\n\n\n\n\n\n\nROW\nSEX\nAGE\nHEIGHT\nWEIGHT\nfemale\nfem_age\n\n\n\n\n0\n1\nf\n14.3\n56.3\n85.0\n1\n14.3\n\n\n1\n2\nf\n15.5\n62.3\n105.0\n1\n15.5\n\n\n2\n3\nf\n15.3\n63.3\n108.0\n1\n15.3\n\n\n3\n4\nf\n16.1\n59.0\n92.0\n1\n16.1\n\n\n4\n5\nf\n19.1\n62.5\n112.5\n1\n19.1\n\n\n\n\n\n\n\n\n\nRegression Analysis\nNext, we fit a regression model, representing the relationships between gender, age, height and the interaction variable created in the datastep above. We again use a where statement to restrict the analysis to those who are less than or equal to 19 years old. We use the clb option to get a 95% confidence interval for each of the parameters in the model. The model that we are fitting is height = b0 + b1 x female + b2 x age + b3 x fem_age + e\n\nX = htwt[['female', 'AGE', 'fem_age']][htwt['AGE'] <= 19]\nX = sm.add_constant(X)\nY = htwt['HEIGHT'][htwt['AGE'] <= 19]\n\nmodel = sm.OLS(Y, X).fit()\n\nmodel.summary()\n\n\nOLS Regression Results\n\n\nDep. Variable:\nHEIGHT\nR-squared:\n0.460\n\n\nModel:\nOLS\nAdj. R-squared:\n0.452\n\n\nMethod:\nLeast Squares\nF-statistic:\n60.93\n\n\nDate:\nTue, 15 Oct 2024\nProb (F-statistic):\n1.50e-28\n\n\nTime:\n16:24:11\nLog-Likelihood:\n-534.17\n\n\nNo. Observations:\n219\nAIC:\n1076.\n\n\nDf Residuals:\n215\nBIC:\n1090.\n\n\nDf Model:\n3\n\n\n\n\nCovariance Type:\nnonrobust\n\n\n\n\n\n\n\n\n\n\n\ncoef\nstd err\nt\nP>|t|\n[0.025\n0.975]\n\n\nconst\n28.8828\n2.873\n10.052\n0.000\n23.219\n34.547\n\n\nfemale\n13.6123\n4.019\n3.387\n0.001\n5.690\n21.534\n\n\nAGE\n2.0313\n0.178\n11.435\n0.000\n1.681\n2.381\n\n\nfem_age\n-0.9294\n0.248\n-3.750\n0.000\n-1.418\n-0.441\n\n\n\n\n\n\n\n\nOmnibus:\n1.300\nDurbin-Watson:\n2.284\n\n\nProb(Omnibus):\n0.522\nJarque-Bera (JB):\n0.981\n\n\nSkew:\n-0.133\nProb(JB):\n0.612\n\n\nKurtosis:\n3.191\nCond. No.\n450.\n\n\n\nNotes:[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n\n\nFrom the coefficients table b0,b1,b2,b3 are estimated as b0=28.88 b1=13.61 b2=2.03 b3=-0.92942\nThe resulting regression model for height, age and gender based on the available data is height=28.8828 + 13.6123 x female + 2.0313 x age -0.9294 x fem_age"
       },
       {
         "objectID": "python/chi-square.html",
    @@ -837,7 +718,7 @@
         "href": "python/chi-square.html#implementing-chi-square-test-in-python",
         "title": "Chi-Square Association/Fisher’s exact",
         "section": "Implementing Chi-Square test in Python",
    -    "text": "Implementing Chi-Square test in Python\nWe can use crosstab() function to create contingency table of two selected variables.\n\nimport pandas as pd \nimport numpy as np\nimport scipy.stats as stats \n\n# Read the sample data\ndata = pd.read_csv(\"../data/lung_cancer.csv\") \n\n# Removing undesired rows\ndf= data.dropna(subset=['ph.ecog','wt.loss']) \n\n# Converting numerical variable into categorical variable\n\ndf['ecog_grp']= np.where(df['ph.ecog']>0, \"fully active\",\"symptomatic\")\nprint(df['ecog_grp'])\ndf['wt_grp'] = np.where(df['wt.loss']>0, \"weight loss\", \"weight gain\")\n\ncontingency_table= pd.crosstab(df['ecog_grp'],df['wt_grp'])\ncontingency_table\n\n1       symptomatic\n2       symptomatic\n3      fully active\n4       symptomatic\n5      fully active\n           ...     \n223    fully active\n224     symptomatic\n225    fully active\n226    fully active\n227    fully active\nName: ecog_grp, Length: 213, dtype: object\n\n\n/tmp/ipykernel_7549/2909872460.py:13: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  df['ecog_grp']= np.where(df['ph.ecog']>0, \"fully active\",\"symptomatic\")\n/tmp/ipykernel_7549/2909872460.py:15: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  df['wt_grp'] = np.where(df['wt.loss']>0, \"weight loss\", \"weight gain\")\n\n\n\n\n\n\n\n\nwt_grp\nweight gain\nweight loss\n\n\necog_grp\n\n\n\n\n\n\nfully active\n39\n113\n\n\nsymptomatic\n22\n39\n\n\n\n\n\n\n\nFurthermore, the chi2_contingency() function in scipy.stats library in Python can be used to implement Chi-square test.\n\n# Parsing the values from the contingency table\nvalue = np.array([contingency_table.iloc[0][0:5].values,\n                  contingency_table.iloc[1][0:5].values])\n\nstatistic, p, dof, expected = stats.chi2_contingency(value)\n\nprint(\"The chi2 value is:\", statistic)\nprint(\"The p value is:\", p)\nprint(\"The degree of freedom is:\", dof)\nprint(\"The expected values are:\", expected)\n\nThe chi2 value is: 1.8260529076055192\nThe p value is: 0.17659446865934614\nThe degree of freedom is: 1\nThe expected values are: [[ 43.53051643 108.46948357]\n [ 17.46948357  43.53051643]]"
    +    "text": "Implementing Chi-Square test in Python\nWe can use crosstab() function to create contingency table of two selected variables.\n\nimport pandas as pd \nimport numpy as np\nimport scipy.stats as stats \n\n# Read the sample data\ndata = pd.read_csv(\"../data/lung_cancer.csv\") \n\n# Removing undesired rows\ndf= data.dropna(subset=['ph.ecog','wt.loss']) \n\n# Converting numerical variable into categorical variable\n\ndf['ecog_grp']= np.where(df['ph.ecog']>0, \"fully active\",\"symptomatic\")\nprint(df['ecog_grp'])\ndf['wt_grp'] = np.where(df['wt.loss']>0, \"weight loss\", \"weight gain\")\n\ncontingency_table= pd.crosstab(df['ecog_grp'],df['wt_grp'])\ncontingency_table\n\n1       symptomatic\n2       symptomatic\n3      fully active\n4       symptomatic\n5      fully active\n           ...     \n223    fully active\n224     symptomatic\n225    fully active\n226    fully active\n227    fully active\nName: ecog_grp, Length: 213, dtype: object\n\n\n/tmp/ipykernel_26195/2909872460.py:13: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  df['ecog_grp']= np.where(df['ph.ecog']>0, \"fully active\",\"symptomatic\")\n/tmp/ipykernel_26195/2909872460.py:15: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  df['wt_grp'] = np.where(df['wt.loss']>0, \"weight loss\", \"weight gain\")\n\n\n\n\n\n\n\n\nwt_grp\nweight gain\nweight loss\n\n\necog_grp\n\n\n\n\n\n\nfully active\n39\n113\n\n\nsymptomatic\n22\n39\n\n\n\n\n\n\n\nFurthermore, the chi2_contingency() function in scipy.stats library in Python can be used to implement Chi-square test.\n\n# Parsing the values from the contingency table\nvalue = np.array([contingency_table.iloc[0][0:5].values,\n                  contingency_table.iloc[1][0:5].values])\n\nstatistic, p, dof, expected = stats.chi2_contingency(value)\n\nprint(\"The chi2 value is:\", statistic)\nprint(\"The p value is:\", p)\nprint(\"The degree of freedom is:\", dof)\nprint(\"The expected values are:\", expected)\n\nThe chi2 value is: 1.8260529076055192\nThe p value is: 0.17659446865934614\nThe degree of freedom is: 1\nThe expected values are: [[ 43.53051643 108.46948357]\n [ 17.46948357  43.53051643]]"
       },
       {
         "objectID": "python/chi-square.html#implementing-fisher-exact-test-in-python",
    @@ -847,375 +728,382 @@
         "text": "Implementing Fisher exact test in Python\nTo implement Fischer’s exact test in Python, we can use the fischer_exact() function from the stats module in SciPy library. It returns SignificanceResult object with statistic and pvalue as it’s attributes.\n\nstats.fisher_exact(value, alternative=\"two-sided\")\n\nSignificanceResult(statistic=np.float64(0.6118262268704746), pvalue=np.float64(0.13500579984749855))"
       },
       {
    -    "objectID": "python/Summary_statistics.html",
    -    "href": "python/Summary_statistics.html",
    -    "title": "Summary statistics",
    +    "objectID": "templates/RvsSAS_template.html",
    +    "href": "templates/RvsSAS_template.html",
    +    "title": "R vs SAS [Name of Method]",
         "section": "",
    -    "text": "The numpy.percentile() function is useful to determine the nth-percentile for the given array of data. It returns an array with percentile values or a scalar along the specified axis. The function accepts the following parameters:\n1.array: The array of data whose percentile needs to be calculated.\n2.percentile: Denotes the percentile that needs to be computed.\n3.axis (optional): Denotes the axis along which the percentile is calculated. By default, a flattened array is used.\n4.out (optional): An alternate output array where we can place the result.\n5.overwrite_input (optional): Used to modify the input array.\n6.keepdims (optional): Creates reduced axes with dimensions of one size.\n\nimport numpy as np\n\nsample_data=[12, 25, 16, 50, 34, 29, 60, 86, 52, 39, 41]\n\npercentile = np.percentile(sample_data,75)\n\nprint(percentile)\n\n51.0"
    +    "text": "Provide a brief overview of the analysis, its purpose, and its applications.\nExample: This section compares the implementation of Poisson Regression in R and SAS. Poisson regression is used to model count data and contingency tables. It’s particularly useful for modeling the number of events occurring within a fixed period of time or space.\n\n\n\nThe following table provides an overview of the support and results comparability between R and SAS for the new analysis point.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nScenario 1: Basic Functionality\nExample: Yes\nExample: Yes\nExample 1: Yes\nExample 2: No\nSpecific settings or packages required for exact match\n\n\nScenario 2: Advanced Feature\nExample: Yes\nExample: Yes\nExample 3: Partial\nSpecial considerations for data structure or assumptions\n\n\n\n\n\n\nList the R packages required for this analysis. Include a brief description if necessary.\n\n# Example R packages required\nlibrary() # Call what packages are needed\nlibrary()\n\n\n\n\nProvide an example of the dataset being used. For simulated / dummy datasets please provide some context on how you construct the dataset and its relevance to the methodology. For real data please provide the code for how these data can be accessed and a reference that describes the data source.\n\n# Simulate an example dataset for Poisson Regression\nset.seed(123)\nexample_data <- data.frame(\n  count = rpois(100, lambda = 2),\n  predictor = rnorm(100)\n)\n\n# Display the first few rows of the dataset\nhead(example_data)\n\n/* Example dataset in SAS */\ndata example_data;\n  do id = 1 to 100;\n    count = ranpoi(123, 2); /* random Poisson variable */\n    predictor = rannor(123); /* random normal variable */\n    output;\n  end;\nrun;\n\n/* Display the first few rows of the dataset */\nproc print data=example_data(obs=10);\nrun;\n\n\n\n\n\nProvide a detailed description of the scenario.\n\n\n/* SAS code for basic Poisson Regression */\nproc genmod data=example_data;\n  class predictor;\n  model count = predictor / dist=poisson link=log;\nrun;\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\n\n# R code for basic Poisson Regression\nexample_model <- glm(count ~ predictor, family = poisson(link = \"log\"), data = example_data)\n\n# Summary of the model\nsummary(example_model)\n\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\nProvide a detailed comparison of the results obtained from both SAS and R. Highlight any differences and provide explanations if possible.\n\n\n\n\n\n\n\n\n\n\nStatistic\nR Result\nSAS Result\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n98\n98\nYes\n\n\n\nCoefficient Estimate for Predictor\n0.1\n0.1\nYes\n\n\n\np-value\n0.05\n0.05\nYes\n\n\n\n\n\n\n\n\nProvide a detailed description of the scenario. Example: Address specific advanced features or configurations that may be necessary for more complex analyses.\n\n\n/* SAS code for handling overdispersion */\nproc genmod data=example_data;\n  class predictor;\n  model count = predictor / dist=poisson link=log scale=pearson;\nrun;\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\n\n# R code for handling overdispersion\nalternative_model <- glm(count ~ predictor, family = quasipoisson(link = \"log\"), data = example_data)\n\n# Summary of the alternative model\nsummary(alternative_model)\n\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\nProvide a detailed comparison of the results obtained from both SAS and R. Highlight any differences and provide explanations if possible.\n\n\n\n\n\n\n\n\n\n\nStatistic\nR Result\nSAS Result\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n98\n98\nYes\n\n\n\nCoefficient Estimate for Predictor\n0.1\n0.1\nYes\n\n\n\np-value\n0.05\n0.05\nYes\n\n\n\n\n\n\n\n\n\nAddress any additional features or settings that need to be considered. This might include specific configuration settings, handling of special cases, or performance considerations.\nExample: For handling overdispersion in Poisson Regression, SAS provides the scale option in PROC GENMOD, while in R, one may have to switch to a quasi-Poisson family or use negative binomial regression.\n\n\n\nSummarize the key findings from the analysis. Highlight any major differences observed and offer recommendations on which software/packages to use. Provide guidance on how to interpret the differences between the results obtained from various software of packages.\n\n\n\nList potential issues that users may encounter and propose solutions or troubleshooting steps.\nExample:\n\nIssue: Non-convergence in Poisson Regression.\nSolution: Check for multicollinearity among predictors, scale the predictors, or switch to a more appropriate model family.\n\n\n\n\nProvide references and additional reading materials for both R and SAS documentation related to the analysis.\nR Documentation:\n\nglm function: https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/glm\n\nSAS Documentation:\n\nPROC GENMOD: https://documentation.sas.com/doc/en/statcdc/14.2/statug/statug_genmod_overview.htm\n\n\n\n\nInclude any additional information, extended examples, or advanced topics that may be helpful for expert users.\nThis template is designed to be comprehensive and flexible, able to accommodate multiple scenarios and diverse datasets. It ensures that each section clearly communicates the necessary information and comparisons, making it easier for users to understand and apply the analyses appropriately across both R and SAS platforms.\n\n\n\n\n\n\nSession Info"
       },
       {
    -    "objectID": "Comp/r-sas_manova.html",
    -    "href": "Comp/r-sas_manova.html",
    -    "title": "Multivariate Analysis of Variance in R vs SAS",
    +    "objectID": "templates/RvsSAS_template.html#introduction",
    +    "href": "templates/RvsSAS_template.html#introduction",
    +    "title": "R vs SAS [Name of Method]",
         "section": "",
    -    "text": "MANOVA: Testing for group mean vectors are the same vs at least one is different\nWhen applying the following hypothesis, SAS and R match identically see R and SAS.\n\nH0: Group mean vectors are the same for all groups or they don’t differ significantly.\nH1: At least one of the group mean vectors is different from the rest.\n\nHowever, if interest was in comparing 1 level of a parameter vs the others, this was only achieved using SAS. Contrast statements in SAS were easy to implement as shown here SAS however R did not replicate these results and to date a solution has not been found.\nNOTE: if you feel you can help with the above discrepancy please contribute to the CAMIS repo by following the instructions on the contributions page."
    +    "text": "Provide a brief overview of the analysis, its purpose, and its applications.\nExample: This section compares the implementation of Poisson Regression in R and SAS. Poisson regression is used to model count data and contingency tables. It’s particularly useful for modeling the number of events occurring within a fixed period of time or space."
       },
       {
    -    "objectID": "Comp/r-sas_survival.html",
    -    "href": "Comp/r-sas_survival.html",
    -    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
    +    "objectID": "templates/RvsSAS_template.html#general-comparison-table",
    +    "href": "templates/RvsSAS_template.html#general-comparison-table",
    +    "title": "R vs SAS [Name of Method]",
         "section": "",
    -    "text": "The following table shows the options available in SAS and R for Kaplan Meier and Cox Proportional Hazards modelling, the capabilities of each language, and whether or not the results from each language match.\n\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nKaplan Meier with confidence intervals using log-log method\nYes (using the option conf.type = “log-log”)\nYes (Default)\nMostly\n1) Survival estimates can disagree when last event is censored and survival estimate does not cross the percentile being estimated.\n2) Survival estimates at time X can disagree when the time X is after the last observed censored time\n\n\nKaplan Meier with confidence intervals using log method\nYes (Default)\nYes (using the option conftype=log)\nMostly\nAs above.\n\n\nCox Proportional Hazards Model using breslow method for ties\nYes (using the option ties=“breslow”)\nYes (Default)\nYes\n\n\n\nCox Proportional Hazards Model using efron method for ties\nYes (Default)\nYes (using the option ties=efron)\nYes\n\n\n\n\nResults from the examples shown for R here and SAS here were compared below.\nComparing the non-stratified model results side-by-side, the CIs for the quartile estimates and landmark estimates are different between R and SAS. HR and CI also have slight differences.\n\n\n\n\n\n\n\n\n\n\n\nThe default methods for handling ties in a Cox regression model are different which can lead to a different result for the Hazard ratio and associated confidence interval.\nR uses “efron” by default. SAS uses “breslow” by default. Both R and SAS are able to change these default options. By making the changes to the code below, we can force R to use “breslow” to match SAS, or SAS to use “efron” to match R. When the software use the same methods, then we obtain an identical HR and CI.\n\nR: change method for ties to use “breslow”\n\n\nfit.cox <- coxph(Surv(LENFOLY, FSTAT) ~ AFB, ties = \"breslow\", data = dat)\n\n\nSAS: change method for ties to use “efron”\n\n\nproc phreg data=dat;\nclass afb;\nmodel lenfol*fstat(0) = afb/rl ties = efron;\nrun;\n\nIf there are no tied event times, then the methods are equivalent.\nThe Breslow approximation is the easiest to program and hence it historically became the first option coded for almost all software. It then ended up as the default option when other options were added in order to maintain “backwards compatibility”. The Efron option is more accurate if there are a large number of ties, and it was therefore selected as the default option in R. In practice the number of ties is usually small, in which case all the methods are statistically indistinguishable.\nFrom the arguments of coxph in R, there are three possible choices for handling tied event times ‘ties=breslow’, ‘ties=efron’, or ‘ties=’clogit’. This last option is an exact partial likelihood approach. See here for more detail.\n\n\n\nThe default methods for calculation of the confidence interval of a KM estimator are different in the two languages (for example, for calculation of the CI associated with the Median Survival estimate, the 25th percentile and the 75th percentile).\nR uses “log” by default, and SAS uses “log-log” by default. As shown below, using ‘conf.type’ option, R can be forced to use the “log-log” method to match SAS. Alternatively, using the ‘conftype=’ option, SAS can be forced to use the “log” method to match R.\n\nR: change to “log-log”\n\n\nfit.km <- survfit(Surv(LENFOLY, FSTAT) ~ AFB, conf.type = \"log-log\", data = dat)\n\n\nSAS: change to “log”\n\n\nproc lifetest data=dat conftype=log;\ntime lenfoly*fstat(0);\nstrata afb;\nrun;\n\n“log-log” prevents the problem of having confidence intervals of >1 or <0, which might happen if using “log” transformation. However, both R and SAS will clip the interval at [0, 1] and report a bound >1 as 1 and <0 as 0.\nFrom a reference: The appeal of the log-log interval is clear, but the log-scale interval has the advantage of variance stabilization. As a result, simulation studies have generally found it to have better (closer to nominal) coverage; for this reason, it is the default in the survival package.\nNow if we change the confidence interval type in SAS to “log” and tie handling to “efron”, the results will be identical to the results in R.\n\n\n\n\n\n\n\n\n\nBelow is the side-by-side comparison for stratified analysis with default methods in SAS matched to R’s, the results are also identical."
    +    "text": "The following table provides an overview of the support and results comparability between R and SAS for the new analysis point.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nScenario 1: Basic Functionality\nExample: Yes\nExample: Yes\nExample 1: Yes\nExample 2: No\nSpecific settings or packages required for exact match\n\n\nScenario 2: Advanced Feature\nExample: Yes\nExample: Yes\nExample 3: Partial\nSpecial considerations for data structure or assumptions"
       },
       {
    -    "objectID": "Comp/r-sas_survival.html#reason-1-cox-regression-handling-of-tied-survival-times",
    -    "href": "Comp/r-sas_survival.html#reason-1-cox-regression-handling-of-tied-survival-times",
    -    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
    +    "objectID": "templates/RvsSAS_template.html#prerequisites-r-packages",
    +    "href": "templates/RvsSAS_template.html#prerequisites-r-packages",
    +    "title": "R vs SAS [Name of Method]",
         "section": "",
    -    "text": "The default methods for handling ties in a Cox regression model are different which can lead to a different result for the Hazard ratio and associated confidence interval.\nR uses “efron” by default. SAS uses “breslow” by default. Both R and SAS are able to change these default options. By making the changes to the code below, we can force R to use “breslow” to match SAS, or SAS to use “efron” to match R. When the software use the same methods, then we obtain an identical HR and CI.\n\nR: change method for ties to use “breslow”\n\n\nfit.cox <- coxph(Surv(LENFOLY, FSTAT) ~ AFB, ties = \"breslow\", data = dat)\n\n\nSAS: change method for ties to use “efron”\n\n\nproc phreg data=dat;\nclass afb;\nmodel lenfol*fstat(0) = afb/rl ties = efron;\nrun;\n\nIf there are no tied event times, then the methods are equivalent.\nThe Breslow approximation is the easiest to program and hence it historically became the first option coded for almost all software. It then ended up as the default option when other options were added in order to maintain “backwards compatibility”. The Efron option is more accurate if there are a large number of ties, and it was therefore selected as the default option in R. In practice the number of ties is usually small, in which case all the methods are statistically indistinguishable.\nFrom the arguments of coxph in R, there are three possible choices for handling tied event times ‘ties=breslow’, ‘ties=efron’, or ‘ties=’clogit’. This last option is an exact partial likelihood approach. See here for more detail."
    +    "text": "List the R packages required for this analysis. Include a brief description if necessary.\n\n# Example R packages required\nlibrary() # Call what packages are needed\nlibrary()"
       },
       {
    -    "objectID": "Comp/r-sas_survival.html#reason-2-kaplan-meier-median-survival-confidence-intervals",
    -    "href": "Comp/r-sas_survival.html#reason-2-kaplan-meier-median-survival-confidence-intervals",
    -    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
    +    "objectID": "templates/RvsSAS_template.html#example-data",
    +    "href": "templates/RvsSAS_template.html#example-data",
    +    "title": "R vs SAS [Name of Method]",
         "section": "",
    -    "text": "The default methods for calculation of the confidence interval of a KM estimator are different in the two languages (for example, for calculation of the CI associated with the Median Survival estimate, the 25th percentile and the 75th percentile).\nR uses “log” by default, and SAS uses “log-log” by default. As shown below, using ‘conf.type’ option, R can be forced to use the “log-log” method to match SAS. Alternatively, using the ‘conftype=’ option, SAS can be forced to use the “log” method to match R.\n\nR: change to “log-log”\n\n\nfit.km <- survfit(Surv(LENFOLY, FSTAT) ~ AFB, conf.type = \"log-log\", data = dat)\n\n\nSAS: change to “log”\n\n\nproc lifetest data=dat conftype=log;\ntime lenfoly*fstat(0);\nstrata afb;\nrun;\n\n“log-log” prevents the problem of having confidence intervals of >1 or <0, which might happen if using “log” transformation. However, both R and SAS will clip the interval at [0, 1] and report a bound >1 as 1 and <0 as 0.\nFrom a reference: The appeal of the log-log interval is clear, but the log-scale interval has the advantage of variance stabilization. As a result, simulation studies have generally found it to have better (closer to nominal) coverage; for this reason, it is the default in the survival package.\nNow if we change the confidence interval type in SAS to “log” and tie handling to “efron”, the results will be identical to the results in R.\n\n\n\n\n\n\n\n\n\nBelow is the side-by-side comparison for stratified analysis with default methods in SAS matched to R’s, the results are also identical."
    +    "text": "Provide an example of the dataset being used. For simulated / dummy datasets please provide some context on how you construct the dataset and its relevance to the methodology. For real data please provide the code for how these data can be accessed and a reference that describes the data source.\n\n# Simulate an example dataset for Poisson Regression\nset.seed(123)\nexample_data <- data.frame(\n  count = rpois(100, lambda = 2),\n  predictor = rnorm(100)\n)\n\n# Display the first few rows of the dataset\nhead(example_data)\n\n/* Example dataset in SAS */\ndata example_data;\n  do id = 1 to 100;\n    count = ranpoi(123, 2); /* random Poisson variable */\n    predictor = rannor(123); /* random normal variable */\n    output;\n  end;\nrun;\n\n/* Display the first few rows of the dataset */\nproc print data=example_data(obs=10);\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas_survival.html#differences-observed-in-the-km-estimators",
    -    "href": "Comp/r-sas_survival.html#differences-observed-in-the-km-estimators",
    -    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
    -    "section": "Differences Observed in the KM Estimators",
    -    "text": "Differences Observed in the KM Estimators\nSuppose we are interested to know the 25%, 50% and 75% quartile estimates, and the day 80, 100, and 120 estimates.\nBelow is the R code:\n\nfit.km <- survfit(Surv(time, status) ~ 1, conf.type = \"log-log\", data = test)\n## quantile estimates\nquantile(fit.km, probs = c(0.25, 0.5, 0.75))\n## landmark estimates at 80, 100, 120-day\nsummary(fit.km, times = c(80, 100, 120), extend = T)\n\nBelow is the SAS code:\n\nproc lifetest data=dat outsurv=_SurvEst timelist= 80 100 120 reduceout stderr; \ntime lenfoly*fstat(0);\nrun;\n\nBelow is the side-by-side comparison:"
    +    "objectID": "templates/RvsSAS_template.html#analysis-scenarios",
    +    "href": "templates/RvsSAS_template.html#analysis-scenarios",
    +    "title": "R vs SAS [Name of Method]",
    +    "section": "",
    +    "text": "Provide a detailed description of the scenario.\n\n\n/* SAS code for basic Poisson Regression */\nproc genmod data=example_data;\n  class predictor;\n  model count = predictor / dist=poisson link=log;\nrun;\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\n\n# R code for basic Poisson Regression\nexample_model <- glm(count ~ predictor, family = poisson(link = \"log\"), data = example_data)\n\n# Summary of the model\nsummary(example_model)\n\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\nProvide a detailed comparison of the results obtained from both SAS and R. Highlight any differences and provide explanations if possible.\n\n\n\n\n\n\n\n\n\n\nStatistic\nR Result\nSAS Result\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n98\n98\nYes\n\n\n\nCoefficient Estimate for Predictor\n0.1\n0.1\nYes\n\n\n\np-value\n0.05\n0.05\nYes\n\n\n\n\n\n\n\n\nProvide a detailed description of the scenario. Example: Address specific advanced features or configurations that may be necessary for more complex analyses.\n\n\n/* SAS code for handling overdispersion */\nproc genmod data=example_data;\n  class predictor;\n  model count = predictor / dist=poisson link=log scale=pearson;\nrun;\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\n\n# R code for handling overdispersion\nalternative_model <- glm(count ~ predictor, family = quasipoisson(link = \"log\"), data = example_data)\n\n# Summary of the alternative model\nsummary(alternative_model)\n\nDescribe key options utilized in the code, along with a screenshot showcasing the output.\n\n\n\nProvide a detailed comparison of the results obtained from both SAS and R. Highlight any differences and provide explanations if possible.\n\n\n\n\n\n\n\n\n\n\nStatistic\nR Result\nSAS Result\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n98\n98\nYes\n\n\n\nCoefficient Estimate for Predictor\n0.1\n0.1\nYes\n\n\n\np-value\n0.05\n0.05\nYes"
       },
       {
    -    "objectID": "Comp/r-sas_survival.html#reasons",
    -    "href": "Comp/r-sas_survival.html#reasons",
    -    "title": "R vs SAS - Kaplan Meier and Cox-proportion hazards modelling",
    -    "section": "Reasons",
    -    "text": "Reasons\nThe reasons for the differences are because:\nReason 1: Survival estimate does not cross the 50% percentile.\nThe kth quantile for a survival curve S(t) is the location at which a horizontal line at height p= 1-k intersects the plot of S(t) as shown in the KM curve below. Since S(t) is a step function, it is possible for the curve to have a horizontal segment at exactly 1-k, in which case the midpoint of the horizontal segment is returned.\nFor example, using the data above, the survival probability is exactly 0.5 at time=87 and remains at 0.5 until the last censored observation at 118.\n\n\n\n\n\n\n\n\n\nWhen using R, the median is the smallest time which survival estimate is <= 0.5 –> (87+118) / 2 = 102.5. However, SAS searches the smallest time which survival estimate is < 0.5, which does not exist in this dataset, so it gives “NE” (Not evaluable).\n\npl <- survminer::ggsurvplot(fit.km, \n                            conf.int = TRUE,\n                            ggtheme = theme_light()) \npl$plot +  geom_hline(yintercept = 0.5, color = \"black\", linetype = \"solid\")  \n\nsummary(fit.km)\n\nReason 2: Last event censored and prior to the required landmark estimate.\nFor the 120-day event-free estimate, SAS considers that 120 days is beyond the maximum observed day in the data (which was a censored event at time =118). Therefore, SAS considers this as Unknown and returns a result of “NE” (Not-evaluable). However, R uses the rate at last observed censored date to estimate the 120-day event free rate. As the event-free estimate at time of the last censored event at 118 was 0.5 (0.184, 0.753), R makes the assumption that this is the best estimate for the event-free rate at Time =120.\nIf we change the last observation in the dataset to be an event (instead of censored), R and SAS will both give 0 for the event-free survival estimate, because it is for sure that all subjects did not survive beyond 120 days.\n\ntest <- tibble(time = c(54, 75, 77, 84, 87, 92, 103, 105, 112, 118), \n                   status = c(1, 1, 1, 1, 1, 0, 0, 0, 0, 1))\n\ntest\n\n# A tibble: 10 × 2\n    time status\n   <dbl>  <dbl>\n 1    54      1\n 2    75      1\n 3    77      1\n 4    84      1\n 5    87      1\n 6    92      0\n 7   103      0\n 8   105      0\n 9   112      0\n10   118      1"
    +    "objectID": "templates/RvsSAS_template.html#special-considerations",
    +    "href": "templates/RvsSAS_template.html#special-considerations",
    +    "title": "R vs SAS [Name of Method]",
    +    "section": "",
    +    "text": "Address any additional features or settings that need to be considered. This might include specific configuration settings, handling of special cases, or performance considerations.\nExample: For handling overdispersion in Poisson Regression, SAS provides the scale option in PROC GENMOD, while in R, one may have to switch to a quasi-Poisson family or use negative binomial regression."
       },
       {
    -    "objectID": "Comp/r-sas_jonckheere.html",
    -    "href": "Comp/r-sas_jonckheere.html",
    -    "title": "R vs SAS on the Jonckheere-Terpstra test",
    +    "objectID": "templates/RvsSAS_template.html#summary-and-recommendation",
    +    "href": "templates/RvsSAS_template.html#summary-and-recommendation",
    +    "title": "R vs SAS [Name of Method]",
         "section": "",
    -    "text": "Analysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nJonckheere-Terpstra test using normal approximation\nYes\nYes\nPartial match\nThe test statistics was 184.5 from both languages.\nRegarding the p-value, R yields 0.002655, and SAS 0.002649\n\n\nJonckheere-Terpstra test using Monte Carlo approximation for an exact test\nYes\nYes\nPartially matching\nThe resampling number is 10000.\nThe test statistics was 184.5 from both languages.\nRegarding the p-value, R yields 0.0023, and SAS 0.0016"
    +    "text": "Summarize the key findings from the analysis. Highlight any major differences observed and offer recommendations on which software/packages to use. Provide guidance on how to interpret the differences between the results obtained from various software of packages."
       },
       {
    -    "objectID": "Comp/r-sas_jonckheere.html#comparison",
    -    "href": "Comp/r-sas_jonckheere.html#comparison",
    -    "title": "R vs SAS on the Jonckheere-Terpstra test",
    +    "objectID": "templates/RvsSAS_template.html#troubleshooting-and-edge-cases",
    +    "href": "templates/RvsSAS_template.html#troubleshooting-and-edge-cases",
    +    "title": "R vs SAS [Name of Method]",
         "section": "",
    -    "text": "Analysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nJonckheere-Terpstra test using normal approximation\nYes\nYes\nPartial match\nThe test statistics was 184.5 from both languages.\nRegarding the p-value, R yields 0.002655, and SAS 0.002649\n\n\nJonckheere-Terpstra test using Monte Carlo approximation for an exact test\nYes\nYes\nPartially matching\nThe resampling number is 10000.\nThe test statistics was 184.5 from both languages.\nRegarding the p-value, R yields 0.0023, and SAS 0.0016"
    +    "text": "List potential issues that users may encounter and propose solutions or troubleshooting steps.\nExample:\n\nIssue: Non-convergence in Poisson Regression.\nSolution: Check for multicollinearity among predictors, scale the predictors, or switch to a more appropriate model family."
       },
       {
    -    "objectID": "Comp/r-sas_jonckheere.html#conclusion",
    -    "href": "Comp/r-sas_jonckheere.html#conclusion",
    -    "title": "R vs SAS on the Jonckheere-Terpstra test",
    -    "section": "Conclusion",
    -    "text": "Conclusion\n\nResults from normal approximation\nFor the test using normal approximation, the results look slightly different. The reason for this gap may be either of the following.\n\nContinuity correction\nHandling of ties in calculating the variance of the test statistics\nNumerical integration for normal distribution\n\nRegarding continuity correction, the SAS manual mentions that PROC FREQ does not apply it. The DescTools manual does not mention anything about this point.\nRegarding variance of the test statistics, it depends only on the “cell counts” in the context of cross tabulation analysis. From the viewpoint of rank tests, it depends on the frequencies of each tie values. However, since the same test statistics value was given by both R and SAS, it is less likely that a gap exists in calculation variance between languages.\nBased on consideration above, the gap looks acceptable. However, it should kept in mind that R and SAS may take different approaches in continuity correction.\n\n\nResults from Monte Carlo approximation of an exact test\nFor the test using simulation, the results also look slightly different.\nAs mentioned above, R and SAS may take different approaches in continuity correction and calculation of variance for the test statistics. In addition, simulation-based results generally differ between different environments.\nThe \\(95 \\%\\) CI for the approximate p-value given by SAS was \\([0.0008, 0.0024]\\). Since the p-value from R, 0.0023, locates within the CI, this result looks comparable.\n\n\nOverall conclusion\nOverall, the gap between R and SAS is accaptable regarding the Jonckheere-Terpstra test. However, users should know that R and SAS may take different approaches for the following aspects:\n\nContinuity correction\nHandling of ties in calculating the variance of the test statistics"
    +    "objectID": "templates/RvsSAS_template.html#additional-references",
    +    "href": "templates/RvsSAS_template.html#additional-references",
    +    "title": "R vs SAS [Name of Method]",
    +    "section": "",
    +    "text": "Provide references and additional reading materials for both R and SAS documentation related to the analysis.\nR Documentation:\n\nglm function: https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/glm\n\nSAS Documentation:\n\nPROC GENMOD: https://documentation.sas.com/doc/en/statcdc/14.2/statug/statug_genmod_overview.htm"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html",
    -    "href": "Comp/r-sas_mmrm.html",
    -    "title": "R vs SAS MMRM",
    +    "objectID": "templates/RvsSAS_template.html#appendix-optional",
    +    "href": "templates/RvsSAS_template.html#appendix-optional",
    +    "title": "R vs SAS [Name of Method]",
         "section": "",
    -    "text": "In this vignette we briefly compare the mmrm::mmrm, SAS’s PROC GLIMMIX, nlme::gls, lme4::lmer, and glmmTMB::glmmTMB functions for fitting mixed models for repeated measures (MMRMs). A primary difference in these implementations lies in the covariance structures that are supported “out of the box”. In particular, PROC GLIMMIX and mmrm are the only procedures which provide support for many of the most common MMRM covariance structures. Most covariance structures can be implemented in gls, though users are required to define them manually. lmer and glmmTMB are more limited. We find that mmmrm converges more quickly than other R implementations while also producing estimates that are virtually identical to PROC GLIMMIX’s."
    +    "text": "Include any additional information, extended examples, or advanced topics that may be helpful for expert users.\nThis template is designed to be comprehensive and flexible, able to accommodate multiple scenarios and diverse datasets. It ensures that each section clearly communicates the necessary information and comparisons, making it easier for users to understand and apply the analyses appropriately across both R and SAS platforms.\n\n\n\n\n\n\nSession Info"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#fev-data",
    -    "href": "Comp/r-sas_mmrm.html#fev-data",
    -    "title": "R vs SAS MMRM",
    -    "section": "FEV Data",
    -    "text": "FEV Data\nThe FEV dataset contains measurements of FEV1 (forced expired volume in one second), a measure of how quickly the lungs can be emptied. Low levels of FEV1 may indicate chronic obstructive pulmonary disease (COPD). It is summarized below.\n                                      Stratified by ARMCD\n                               Overall       PBO           TRT\n  n                              800           420           380\n  USUBJID (%)\n     PT[1-200]                   200           105 (52.5)     95 (47.5)\n  AVISIT\n     VIS1                        200           105            95\n     VIS2                        200           105            95\n     VIS3                        200           105            95\n     VIS4                        200           105            95\n  RACE (%)\n     Asian                       280 (35.0)    152 (36.2)    128 (33.7)\n     Black or African American   300 (37.5)    184 (43.8)    116 (30.5)\n     White                       220 (27.5)     84 (20.0)    136 (35.8)\n  SEX = Female (%)               424 (53.0)    220 (52.4)    204 (53.7)\n  FEV1_BL (mean (SD))          40.19 (9.12)  40.46 (8.84)  39.90 (9.42)\n  FEV1 (mean (SD))             42.30 (9.32)  40.24 (8.67)  44.45 (9.51)\n  WEIGHT (mean (SD))            0.52 (0.23)   0.52 (0.23)   0.51 (0.23)\n  VISITN (mean (SD))            2.50 (1.12)   2.50 (1.12)   2.50 (1.12)\n  VISITN2 (mean (SD))          -0.02 (1.03)   0.01 (1.07)  -0.04 (0.98)"
    +    "objectID": "SAS/survey-stats-summary.html",
    +    "href": "SAS/survey-stats-summary.html",
    +    "title": "Survey Summary Statistics using SAS",
    +    "section": "",
    +    "text": "When conducting large-scale trials on samples of the population, it can be necessary to use a more complex sampling design than a simple random sample.\nAll of these designs need to be taken into account when calculating statistics, and when producing models. Only summary statistics are discussed in this document, and variances are calculated using the default Taylor series linearisation methods. For a more detailed introduction to survey statistics in SAS, see (Lohr 2022) or (SAS/STAT® 15.1 User’s Guide 2018).\nFor survey summary statistics in SAS, we can use the SURVEYMEANS and SURVEYFREQ procedures."
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#bcva-data",
    -    "href": "Comp/r-sas_mmrm.html#bcva-data",
    -    "title": "R vs SAS MMRM",
    -    "section": "BCVA Data",
    -    "text": "BCVA Data\nThe BCVA dataset contains data from a randomized longitudinal ophthalmology trial evaluating the change in baseline corrected visual acuity (BCVA) over the course of 10 visits. BCVA corresponds to the number of letters read from a visual acuity chart. A summary of the data is given below:\n                                      Stratified by ARMCD\n                               Overall         CTL            TRT\n  n                             8605          4123           4482\n  USUBJID (%)\n     PT[1-1000]                 1000           494 (49.4)     506 (50.6)\n  AVISIT\n     VIS1                        983           482            501\n     VIS2                        980           481            499\n     VIS3                        960           471            489\n     VIS4                        946           458            488\n     VIS5                        925           454            471\n     VIS6                        868           410            458\n     VIS7                        816           388            428\n     VIS8                        791           371            420\n     VIS9                        719           327            392\n     VIS10                       617           281            336\n  RACE (%)\n     Asian                       297 (29.7)    151 (30.6)     146 (28.9)\n     Black or African American   317 (31.7)    149 (30.1)     168 (33.2)\n     White                       386 (38.6)    194 (39.3)     192 (37.9)\n  BCVA_BL (mean (SD))          75.12 (9.93)  74.90 (9.76)   75.40 (10.1)\n  BCVA_CHG (mean (SD))\n     VIS1                       5.59 (1.31)   5.32 (1.23)    5.86 (1.33)\n     VIS10                      9.18 (2.91)   7.49 (2.58)   10.60 (2.36)"
    +    "objectID": "SAS/survey-stats-summary.html#mean",
    +    "href": "SAS/survey-stats-summary.html#mean",
    +    "title": "Survey Summary Statistics using SAS",
    +    "section": "Mean",
    +    "text": "Mean\nIf we want to calculate a mean of a variable in a dataset which has been obtained from a simple random sample such as apisrs, in SAS we can do the following (nb. here total=6194 is obtained from the constant fpc column, and provides the finite population correction):\nproc surveymeans data=apisrs total=6194 mean;\n    var growth;\nrun;\n                             The SURVEYMEANS Procedure\n\n                                    Data Summary\n\n                        Number of Observations           200\n\n\n                                    Statistics\n\n                                                Std Error\n Variable               N            Mean         of Mean       95% CL for Mean\n ---------------------------------------------------------------------------------\n growth               200       31.900000        2.090493    27.7776382 36.0223618\n ---------------------------------------------------------------------------------"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#ante-dependence-heterogeneous",
    -    "href": "Comp/r-sas_mmrm.html#ante-dependence-heterogeneous",
    -    "title": "R vs SAS MMRM",
    -    "section": "Ante-dependence (heterogeneous)",
    -    "text": "Ante-dependence (heterogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=ANTE(1);\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + adh(VISITN | USUBJID),\n  data = fev_data\n)"
    +    "objectID": "SAS/survey-stats-summary.html#total",
    +    "href": "SAS/survey-stats-summary.html#total",
    +    "title": "Survey Summary Statistics using SAS",
    +    "section": "Total",
    +    "text": "Total\nTo calculate population totals, we can request the sum. However SAS requires the user to specify the weights, otherwise the totals will be incorrect. These weights in this case are equivalent to the total population size divided by the sample size:\ndata apisrs;\n    set apisrs nobs=n;\n    weight = fpc / n;\nrun;\n\nproc surveymeans data=apisrs total=6194 sum;\n    var growth;\n    weight weight;\nrun;\n       The SURVEYMEANS Procedure\n\n              Data Summary\n\n  Number of Observations           200\n  Sum of Weights                  6194\n\n\n               Statistics\n\n                               Std Error\nVariable             Sum          of Sum\n----------------------------------------\ngrowth            197589           12949\n----------------------------------------"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#ante-dependence-homogeneous",
    -    "href": "Comp/r-sas_mmrm.html#ante-dependence-homogeneous",
    -    "title": "R vs SAS MMRM",
    -    "section": "Ante-dependence (homogeneous)",
    -    "text": "Ante-dependence (homogeneous)\n\nmmrm\nmmrm(\n  formula =FEV1 ~ ARMCD * AVISIT + ad(VISITN | USUBJID),\n  data = fev_data\n)"
    +    "objectID": "SAS/survey-stats-summary.html#ratios",
    +    "href": "SAS/survey-stats-summary.html#ratios",
    +    "title": "Survey Summary Statistics using SAS",
    +    "section": "Ratios",
    +    "text": "Ratios\nTo perform ratio analysis for means or proportions of analysis variables in SAS, we can use the following:\nproc surveymeans data=apisrs total=6194;\n    ratio api00 / api99;\nrun;\n                             The SURVEYMEANS Procedure\n\n                                    Data Summary\n\n                        Number of Observations           200\n\n\n                                    Statistics\n\n                                                Std Error\n Variable               N            Mean         of Mean       95% CL for Mean\n ---------------------------------------------------------------------------------\n api00                200      656.585000        9.249722    638.344950 674.825050\n api99                200      624.685000        9.500304    605.950813 643.419187\n ---------------------------------------------------------------------------------\n\n\n                                   Ratio Analysis\n\n                                                          Std\nNumerator Denominator            N           Ratio           Error        95% CL for Ratio\n----------------------------------------------------------------------------------------------\napi00     api99                200        1.051066        0.003604    1.04395882    1.05817265\n----------------------------------------------------------------------------------------------"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#auto-regressive-heterogeneous",
    -    "href": "Comp/r-sas_mmrm.html#auto-regressive-heterogeneous",
    -    "title": "R vs SAS MMRM",
    -    "section": "Auto-regressive (heterogeneous)",
    -    "text": "Auto-regressive (heterogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=ARH(1);\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + ar1h(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corCAR1(form = ~AVISIT | USUBJID),\n  weights = varIdent(form = ~1|AVISIT),\n  na.action = na.omit\n)"
    +    "objectID": "SAS/survey-stats-summary.html#proportions",
    +    "href": "SAS/survey-stats-summary.html#proportions",
    +    "title": "Survey Summary Statistics using SAS",
    +    "section": "Proportions",
    +    "text": "Proportions\nTo calculate a proportion in SAS, we use the PROC SURVEYFREQ, in the simplest case below:\nproc surveyfreq data=apisrs total=6194;\ntable 'sch.wide'n / cl;\nrun;\n                          The SURVEYFREQ Procedure\n\n                                Data Summary\n\n                    Number of Observations           200\n\n\n                             Table of sch.wide\n\n                                       Std Err of    95% Confidence Limits\n sch.wide     Frequency     Percent       Percent         for Percent\n -------------------------------------------------------------------------\n No                  37     18.5000        2.7078     13.1604      23.8396\n Yes                163     81.5000        2.7078     76.1604      86.8396\n\n Total              200    100.0000"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#auto-regressive-homogeneous",
    -    "href": "Comp/r-sas_mmrm.html#auto-regressive-homogeneous",
    -    "title": "R vs SAS MMRM",
    -    "section": "Auto-regressive (homogeneous)",
    -    "text": "Auto-regressive (homogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 =  ARMCD|AVISIT / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=AR(1);\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + ar1(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corCAR1(form = ~AVISIT | USUBJID),\n  na.action = na.omit\n)\n\n\n\nglmmTMB\nglmmTMB(\n  FEV1 ~ ARMCD * AVISIT + ar1(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +    "objectID": "SAS/survey-stats-summary.html#quantiles",
    +    "href": "SAS/survey-stats-summary.html#quantiles",
    +    "title": "Survey Summary Statistics using SAS",
    +    "section": "Quantiles",
    +    "text": "Quantiles\nTo calculate quantiles in SAS, we can use the quantile option to request specific quantiles, or can use keywords to request common quantiles (e.g. quartiles or the median). This will use Woodruff’s method for confidence intervals, and a custom quantile method (SAS/STAT® 15.1 User’s Guide 2018, 9834).\nproc surveymeans data=apisrs total=6194 quantile=(0.025 0.5 0.975);\n    var growth;\nrun;\n                             The SURVEYMEANS Procedure\n\n                                    Data Summary\n\n                        Number of Observations           200\n\n\n\n\n                                     Quantiles\n\n                                                      Std\n Variable       Percentile       Estimate           Error    95% Confidence Limits\n ---------------------------------------------------------------------------------\n growth           2.5          -16.500000        1.755916    -19.962591 -13.037409\n                   50 Median    26.500000        1.924351     22.705263  30.294737\n                 97.5           99.000000       16.133827     67.184794 130.815206\n ---------------------------------------------------------------------------------"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#compound-symmetry-heterogeneous",
    -    "href": "Comp/r-sas_mmrm.html#compound-symmetry-heterogeneous",
    -    "title": "R vs SAS MMRM",
    -    "section": "Compound symmetry (heterogeneous)",
    -    "text": "Compound symmetry (heterogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=CSH;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + csh(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corCompSymm(form = ~AVISIT | USUBJID),\n  weights = varIdent(form = ~1|AVISIT),\n  na.action = na.omit\n)\n\n\n\nglmmTMB\nglmmTMB(\n  FEV1 ~ ARMCD * AVISIT + cs(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +    "objectID": "SAS/survival_cif.html",
    +    "href": "SAS/survival_cif.html",
    +    "title": "Estimating Cumulative Incidence Functions Using SAS",
    +    "section": "",
    +    "text": "In this document we present how to estimate the cumulative incidence function (CIF) in SAS (version 9.4). We focus on the competing risks model where each subject experiences only one out of k possible events as depicted in the figure below.\n\n\n\n\n\n\n\n\n\n\n\nThe bone marrow transplant (BTM) dataset as presented by Guo & So (2018) is used. The dataset has the following variables:\n\nGroup has three levels, indicating three disease groups: ALL, AML-Low Risk, AML-High Risk.\nT is the disease-free survival time in days. A derived variable TYears = T/365.25 is used in the analysis.\nStatus has value 0 if T is censored; 1 if T is time to relapse; 2 if T is time to death.\nWaitTime is the waiting time to transplant in days. This variable is not used here.\nA new variable ID is created.\n\nSAS code to prepare the data:\n\nproc format;\n  value DiseaseGroup 1='ALL'\n                     2='AML-Low Risk'\n                     3='AML-High Risk';\n  value EventStatus  0='Censored'\n                     1='Relapse'\n                     2='Death';\nrun;\nlibname datalib \"..\\data\";\ndata bmt;\n  set datalib.bmt;\n  TYears = T / 365.25;\n  ID = _n_;\n  format Group DiseaseGroup.;\n  format Status EventStatus.;\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#compound-symmetry-homogeneous",
    -    "href": "Comp/r-sas_mmrm.html#compound-symmetry-homogeneous",
    -    "title": "R vs SAS MMRM",
    -    "section": "Compound symmetry (homogeneous)",
    -    "text": "Compound symmetry (homogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=CS;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + cs(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corCompSymm(form = ~AVISIT | USUBJID),\n  na.action = na.omit\n)"
    +    "objectID": "SAS/survival_cif.html#objective",
    +    "href": "SAS/survival_cif.html#objective",
    +    "title": "Estimating Cumulative Incidence Functions Using SAS",
    +    "section": "",
    +    "text": "In this document we present how to estimate the cumulative incidence function (CIF) in SAS (version 9.4). We focus on the competing risks model where each subject experiences only one out of k possible events as depicted in the figure below.\n\n\n\n\n\n\n\n\n\n\n\nThe bone marrow transplant (BTM) dataset as presented by Guo & So (2018) is used. The dataset has the following variables:\n\nGroup has three levels, indicating three disease groups: ALL, AML-Low Risk, AML-High Risk.\nT is the disease-free survival time in days. A derived variable TYears = T/365.25 is used in the analysis.\nStatus has value 0 if T is censored; 1 if T is time to relapse; 2 if T is time to death.\nWaitTime is the waiting time to transplant in days. This variable is not used here.\nA new variable ID is created.\n\nSAS code to prepare the data:\n\nproc format;\n  value DiseaseGroup 1='ALL'\n                     2='AML-Low Risk'\n                     3='AML-High Risk';\n  value EventStatus  0='Censored'\n                     1='Relapse'\n                     2='Death';\nrun;\nlibname datalib \"..\\data\";\ndata bmt;\n  set datalib.bmt;\n  TYears = T / 365.25;\n  ID = _n_;\n  format Group DiseaseGroup.;\n  format Status EventStatus.;\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#spatial-exponential",
    -    "href": "Comp/r-sas_mmrm.html#spatial-exponential",
    -    "title": "R vs SAS MMRM",
    -    "section": "Spatial exponential",
    -    "text": "Spatial exponential\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM / subject=USUBJID type=sp(exp)(visitn) rcorr;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + sp_exp(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corExp(form = ~AVISIT | USUBJID),\n  weights = varIdent(form = ~1|AVISIT),\n  na.action = na.omit\n)\n\n\n\nglmmTMB\n# NOTE: requires use of coordinates\nglmmTMB(\n  FEV1 ~ ARMCD * AVISIT + exp(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +    "objectID": "SAS/survival_cif.html#estimating-cifs-in-sas",
    +    "href": "SAS/survival_cif.html#estimating-cifs-in-sas",
    +    "title": "Estimating Cumulative Incidence Functions Using SAS",
    +    "section": "Estimating CIFs in SAS",
    +    "text": "Estimating CIFs in SAS\nPROC LIFETEST is used to estimate the CIFs in SAS. For illustration, we model the time to relapse.\n\nods graphics on;\nproc lifetest data=bmt \n              plots=cif(test) \n              error=aalen\n              conftype=loglog\n              outcif=cif1 \n              timelist=0.5 1 1.5 2 3; \n  time Tyears * Status(0) / eventcode=1; \n  strata Group / order=internal; \n  format Group DiseaseGroup.;\nrun; \nods graphics off;\n\nBelow are selected outputs for comparison with the R outputs in the companion document.\nCIF estimates for time to relapse at selected timepoints for ‘AML-Low Risk’ patients:\n\n\n\n\n\n\n\n\n\nCIF estimates for time to relapses:\n\n\n\n\n\n\n\n\n\nTwo points to note:\n\nBy default the variance of the estimated CIF are estimated with Aalen’s asymptotic method. This can be changed to the delta method by setting error=delta in the PROC LIFETEST statement.\nBy default the log-log transformation is used to produce the pointwise confidence intervals (CIs) for the estimated CIFs. To select other methods, for instance log, set conftype=log."
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#toeplitz-heterogeneous",
    -    "href": "Comp/r-sas_mmrm.html#toeplitz-heterogeneous",
    -    "title": "R vs SAS MMRM",
    -    "section": "Toeplitz (heterogeneous)",
    -    "text": "Toeplitz (heterogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=TOEPH;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + toeph(AVISIT | USUBJID),\n  data = fev_data\n)\n\n\n\nglmmTMB\n glmmTMB(\n  FEV1 ~ ARMCD * AVISIT + toep(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +    "objectID": "SAS/survival_cif.html#reference",
    +    "href": "SAS/survival_cif.html#reference",
    +    "title": "Estimating Cumulative Incidence Functions Using SAS",
    +    "section": "Reference",
    +    "text": "Reference\nAalen O. (1978). Nonparametric Estimation of Partial Transition Probabilities in Multiple Decrement Models, Annals of Statistics, 6:534-545.\nGray R. (1988). A Class of K-Sample Tests for Comparing the Cumulative Incidence of a Competing Risk, Annals of Statistics, 16:1141-1154.\nGray R. (2024). cmprsk: Subdistribution Analysis of Competing Risks. https://cran.r-project.org/web/packages/cmprsk/cmprsk.pdf\nGuo C and So Y. (2018). Cause-Specific Analysis of Competing Risks Using the PHREG Procedure. In Proceedings of the SAS Global Forum 2018 Conference. Cary, NC: SAS Institute Inc. https://support.sas.com/resources/papers/proceedings18/2159-2018.pdf.\nSAS (2019). Statistical Analysis Software. Users’ Guide Statistics Version 9.4. SAS Institute Inc., Cary."
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#toeplitz-homogeneous",
    -    "href": "Comp/r-sas_mmrm.html#toeplitz-homogeneous",
    -    "title": "R vs SAS MMRM",
    -    "section": "Toeplitz (homogeneous)",
    -    "text": "Toeplitz (homogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=TOEP;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + toep(AVISIT | USUBJID),\n  data = fev_data\n)"
    +    "objectID": "SAS/logistic-regr.html",
    +    "href": "SAS/logistic-regr.html",
    +    "title": "Logistic Regression in SAS",
    +    "section": "",
    +    "text": "For a brief description of what is logistic regression see here.\n\nModelling the lung cancer data\nIn SAS, we can use proc logistic or proc genmod to perform a logistic regression.\nTo demonstrate the use of logistic regression we examine the same lung dataset as used in the R example here.\nSome Common mistakes\n\nHandling of missing data. Check SAS output that the number of missing values is as you expect. Make sure you have changed any NA results in the raw data to be missing, since SAS would consider NA as a valid category (a non-missing character result).\nMake sure you consider continuous or categorical variables as you intended. Just because a variable is character or numeric in the dataset, doesn’t mean SAS will treat it that way in the model. You have to use Class row to tell SAS which variables should be treated as character factors (also using ref=' ' to select the reference category).\nBe careful you are modelling the correct event (response vs non-response, or weight_gain vs weight_loss for example)\nBe careful when interpreting any odds ratios that you have the factor of interest the correct way around (0 vs 1, or 1 vs 0)\nIf using proc logistic, be careful of how SAS creates its parameters used in the model as this determines how you can use the parameter estimates! It is often easiest to use param=glm so that the exp(maximum liklihood parameter estimate) = odds ratio. Check the class level information (Design variables) is as you would expect. See below for more detail on other parameterization methods.\n\nOption 1: Using Proc Logistic with sex and ph_ecog as character factors: sex (2 levels: 1,2) and ph_ecog (4 levels:0,1,2 or 3), meal_cal as continuous. As shown below, the class statement and ref=\" \" option can be used to set the direction of the comparison, /param=glm ensures exp(estimates)=odds ratio.\n\nproc logistic data=lung;  \n    class sex (ref=\"1\") ph_ecog (ref=\"0\")/param=glm;\n    model  wt_grp(event=\"weight_gain\") = age sex ph_ecog meal_cal;\nrun;\n\nOption 2: Using proc Genmod with sex and ph_ecog as character factors: sex (2 levels: 1,2) and ph_ecog (4 levels:0,1,2 or 3), meal_cal as continuous. This gets the same results as above. You can use exp(maximum likelihood parameter estimate) to obtain the odds ratios and 95% CIs for the odds ratios. The below already uses GLM parameterization.\n\nproc genmod data=lung; \n      class sex (ref=\"1\") ph_ecog (ref=\"0\"); \n      model wt_grp (event=\"weight_gain\") = age sex ph_ecog meal_cal / dist=bin link=logit;\nrun;\n\nOption 3: Using proc logistic, however this time all covariates are treated as continuous parameters not categorical. You do need to ensure age sex ph_ecog and meal_cal are numeric SAS variables else you will get an error message suggesting to add the varibles to a class statement.\n\nproc logistic data=lung;\nmodel wt_grp(event=\"weight_gain\") = age sex ph_ecog meal_cal;\nrun;\n\nComparison with R model Option 3 is used with the following 3 models, in order to match the same analysis performed in R. This is modelling Sex and ECOG as continuous parameters. We analyze the weight gain in lung cancer patients in dependency of age, sex, ECOG performance score and calories consumed at meals. Weight is categorized into a binary variable for Loss or Gain. The probability modelled is weight_gain.\nWe fit 3 models. In\n\nModel 1: Weight Loss (1/0) = Age + Sex + ECOG + Calories\nModel 2: Weight Loss (1/0) = Sex + ECOG + Calories\nModel 3: Using backwards selection to compare models with/without age\n\n\ntitle1 \"Model 1\";                                                                                                             \nproc logistic data=lung;                                                                                                    \n  model  wt_grp (event=\"weight_gain\")  = age sex ph_ecog meal_cal;                                                                                    \nrun;  \n\nResponse Profile\nOrdered value     wt_grp         Total Frequency\n-----------------------------------------------------------------------------\n1                 weight_gain     122 \n2                 weight_loss     48\n-----------------------------------------------------------------------------\n\nModel 1 Results\n                    Analysis of Maximum Likelihood Estimates                 \n\nParameter   DF     Estimate       Standard Error    Wald Chi-Square  Pr>ChiSq\n-----------------------------------------------------------------------------\nIntercept   1      3.2632         1.6488            3.9168            0.0478\nAge         1     -0.0102         0.0208            0.2389            0.6250\nSex         1     -0.8717         0.3714            5.5090            0.0189\nph_ecog     1      0.4180         0.2589            2.6069            0.1064\nmeal_cal    1     -0.00089        0.000447          3.9417            0.0471\n----------------------------------------------------------------------------\n\nModel Fit Statistics\nCriterion   Intercept Only     Intercept and Covariates       \n--------------------------------------------------------\nAIC         204.355            201.505\nSC          207.491            217.184\n-2 Log L    202.355            191.505   \n--------------------------------------------------------\n\n\ntitle1 \"Model 2\";                                                    \nproc logistic data=lung2;\nmodel  wt_grp (event=\"weight_gain\") = sex ph_ecog meal_cal;\nrun;             \n\nModel 2 Results\n                    Analysis of Maximum Likelihood Estimates                 \n\nParameter   DF     Estimate       Standard Error    Wald Chi-Square  Pr>ChiSq\n-----------------------------------------------------------------------------\nIntercept   1      2.5607         0.7977           10.3047            0.0013\nSex         1     -0.8359         0.3637            5.2815            0.0216\nph_ecog     1      0.3794         0.2469            2.3616            0.1244\nmeal_cal    1     -0.00083        0.000435          3.6770            0.0552\n----------------------------------------------------------------------------\n\nModel Fit Statistics\nCriterion   Intercept Only     Intercept and Covariates       \n--------------------------------------------------------\nAIC         204.355            201.505\nSC          207.491            217.184\n-2 Log L    202.355            191.505   \n--------------------------------------------------------\n\n\ntitle1 \"Using selection=backward to get model comparison stats\"; \nproc logistic data=lung2;  \nmodel  wt_grp (event=\"weight_gain\")  = age sex ph_ecog meal_cal / selection = backward stop=3; \nrun;   \n\nStep 1: Effect age is removed\nSummary of Backward Elimination\nStep   Effect Removed   DF     Number In     Wald Chi-Square   Pr>ChiSq\n-----------------------------------------------------------------------------\n1      Age              1      3             0.2389            0.6250   \n-----------------------------------------------------------------------------\n\nNote: The number of effects in the model has reached STOP=3, (when 3 variables remain in the model, it will not proceed to remove any more even if the ones left are not significant)\n\nModel 3 Results\n                    Analysis of Maximum Likelihood Estimates                 \n\nParameter   DF     Estimate       Standard Error    Wald Chi-Square  Pr>ChiSq\n-----------------------------------------------------------------------------\nIntercept   1      2.5607         0.7977           10.3047            0.0013\nSex         1     -0.8359         0.3637            5.2815            0.0216\nph_ecog     1      0.3794         0.2469            2.3616            0.1244\nmeal_cal    1     -0.00083        0.000435          3.6770            0.0552\n----------------------------------------------------------------------------\n\nNOTE: the chi-square test summary of backward elimination, p=0.6250 is different to the results in R, which gave a difference in deviance of -0.24046, p=0.6239. This difference is currently being investigated.\n\n\nParameterization of model effects (categorical covariates) in SAS\nThe most common problem when fitting logistic regression in SAS, is getting SAS to model the binary variable (events) and any categorical covariates correctly.\nThere are two procedures which can be used to perform logistic regression in SAS, proc logistic, and proc genmod (using dist=bin and link=logit options). They obtain the same results when parameterized correctly. However proc logistic has three ways to parameterize categorical variables, and failure to parameterize correctly can lead to incorrect interpretation of results. Parameterization is what SAS does when you include a categorical variable in your model. It codes that variable using new parameters and it fits those into your model.\nThe default parameterization is /PARAM=EFFECT - This is shown as Example A in the design matrix example figure below.\nFor the example of a categorical variable trt - which has 3 treatment levels (Active 1, Active 2, Placebo). With the EFFECT option, the reference level (Placebo) is given values of “-1” for both of the x1 and x2 parameters. The design matrix consists of 1 less parameter than the number of levels of your variable (so that for 3 treatment groups you have x1 and x2 - 2 parameters in the model). Which reference category is selected is specified either by using the ref='X' option, or the default which would be the last value of the variable. In our example (as we have not specified ref='X' this is Placebo (as this is last in the alphabet after Active 1 and Active 2).\n\nproc logistic data=dataset; \n      CLASS TRTP /PARAM=EFFECT; \n      MODEL resp (event=\"Y\") = TRTP ;\nrun;\n\nor \n\nproc logistic data=dataset; \n      CLASS TRTP; \n      MODEL resp (event=\"Y\") = TRTP ;\nrun;\n\nAlternatively, you change the parameterization in SAS using the following options:\nPARAM=REF - This is shown as Example B below - reference parameter values “0”, n-1 variables\n\nproc logistic data=dataset; \n      CLASS TRTP /PARAM=REF; \n      MODEL resp (event=\"Y\") = TRTP ;\nrun;\n\nPARAM=GLM - This is shown as Example C below - no reference parameter as such (output compares against last value of treatment group), n variables.\n\nproc logistic data=dataset;  \n      CLASS TRTP /PARAM=GLM; \n      MODEL resp (event=\"Y\") = TRTP ;\nrun;\n\nDesign Matrix Examples\n\n\n\n\n\n\n\n\n\nDepending on which parameterization you use, you have to interpret the estimates you obtains from the model carefully. It is also very important to check the reference assigned is the correct one.\nThis is also particularly important if you are using any contrast, estimate or lsmestimate statements since the coefficients used for the contrasts must be in line with the parameterization.\n\n\nExample of deriving contrast statements in SAS\nThe table below shows the how the parameterizations using EFFECT, REF or GLM, translate to the model being fitted.\nUsing General model: Y= α + β1x1 + β2x1 {+β3x3}, the treatments are represented as follows:\n\nTreatment  Effect(A)          REF (B)       GLM (C)\n--------------------------------------------------------\nActive A   Y = α + β1         Y = α + β1    Y = α + β1 \nActive B   Y = α + β2         Y = α + β2    Y = α + β2 \nPlacebo    Y = α - β1 - β2    Y = α         Y = α + β3 \n--------------------------------------------------------\n\nNow let’s suppose we wanted to compare the average of the Active Treatment groups versus the Placebo treatment group. (A+B)/2 compared to Placebo.\nEFFECT (A) parameterization\n\n((α + β1 + α + β2 ) /2 ) - (α - β1 - β2)\n= α + 0.5 β1 + 0.5 β2 - α + β1 + β2  \n= 1.5 β1 + 1.5 β2\n\nTherefore, to apply this contrast in SAS we would use:\n\nPROC LOGISTIC data=dataset;\nCLASS trt ; -default PARAM=EFFECT option is used so last trt is reference \nMODEL resp (event=\"Y\") = trt ; \nCONTRAST \"Active (A & B) vs. Placebo\" trt 1.5 1.5 / e; \nRUN;\n\nGLM (C) parameterization\nThe GLM parameterization can be more intuitive.\n\n((α + β1 + α + β2)/2 - (α + β3) \n= α + 0.5 β1 + 0.5 β2 - α - β3 \n= 0.5 β1 + 0.5 β2 - β3\n\nTherefore, to apply this contrast in SAS we would use:\n\nPROC LOGISTIC data=dataset; \nCLASS trt / param=glm; \nMODEL resp (event=\"Y\") = trt ; \nCONTRAST \"Active (2 & 3) vs. Placebo (1)\" trt 0.5 0.5 -1 / e; \nRUN;\n\nFor this reason, it is common to either use the default PARAM=Effect with ref=“X” option. or to use the param=GLM with no ref=“X” option. It is very important to check the output design matrix so you know what parameterization and reference groups are being used.\n\n\nEnsuring you are modelling the correct Binary event in SAS\nWith logistic regression, we often want to model the number of “Successes”. However, by default, SAS sorts alphabetically/numerically and selects the first occurring EVENT alphabetically as the one it’s going to model.\nIt’s a common mistake, and we find SAS modelling the number of failures instead of successes. Very common when your response is: ‘Responder’ vs ‘Non-responder’, SAS will model the Non-responders as ‘N’ is alphabetically first before ‘R’!\nFor this reason, It is recommended to always use the event=“Y” option.\nOptions such as ORDER=DATA|FORMATTED|FREQ|INTERNAL as well as descending can be used to ensure the correct levels of classification variables are being modelled. More detail here"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#unstructured",
    -    "href": "Comp/r-sas_mmrm.html#unstructured",
    -    "title": "R vs SAS MMRM",
    -    "section": "Unstructured",
    -    "text": "Unstructured\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = ARMCD|AVISIT / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=un;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + us(AVISIT | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~  ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corSymm(form = ~AVISIT | USUBJID),\n  weights = varIdent(form = ~1|AVISIT),\n  na.action = na.omit\n)\n\n\n\nlmer\nlmer(\n  FEV1 ~ ARMCD * AVISIT + (0 + AVISIT | USUBJID),\n  data = fev_data,\n  control = lmerControl(check.nobs.vs.nRE = \"ignore\"),\n  na.action = na.omit\n)\n\n\n\nglmmTMB\nglmmTMB(\n  FEV1 ~ ARMCD * AVISIT + us(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +    "objectID": "SAS/SAS_Friedmantest.html",
    +    "href": "SAS/SAS_Friedmantest.html",
    +    "title": "Friedman Chi-Square test using SAS",
    +    "section": "",
    +    "text": "The Friedman test is a non-parametric statistical test developed by Milton Friedman similar to the parametric repeated measures ANOVA. It is used to detect differences in groups across multiple blocks. The procedure involves ranking each row (or block) together, then considering the values of ranks by columns. Applicable to complete block designs, it is thus a special case of the Durbin test.\nThe Friedman test is used for one-way repeated measures analysis of variance by ranks. In its use of ranks it is similar to the Kruskal–Wallis one-way analysis of variance by ranks.\n\n\nSAS 9.4\n\n\n\nSimulated dataset of 10 subjects(blocks) with continuous endpoints are generated for single-drug repeated measurements to check whether any significance exists between the responses(y) at different time points(4 time points simulated)(groups). The p-value will indicate whether differences in response for different time points are significant.\n\n\n\n\ndata one_way_repeat;\n   do subject = 1 to 10;\n    do timepoint = 1 to 4;\n      response = round(rand('Uniform',10,50));\n      output;\n    end;\n   end;\nrun;\n\nproc print;\nrun;\n\n\n\n\nThe FREQ procedure computes CMH statistic, Friedman’s test is identical to the ANOVA (row means scores) CMH statistic when the analysis uses rank scores (SCORES=RANK). The TABLES statement creates a three-way table i.e., timepoint and response stratified by subject. The output produces following statistics along with its degrees of freedom and p-value(Prob):\n\nNonzero Correlation\nRow Mean Scores Differ\n\nThe row corresponding to ‘Row Mean Scores Differ’ gives the required statistic and p-value for Friedman’s test.\n\n\n\nWhen the data contains missing response, the procedure discards the corresponding row and calculates the required statistic with a message about number of missing responses below the test statisitc output.\n\n\n\n\nproc freq data=one_way_repeat;\n      tables subject*timepoint*response / \n             cmh2 scores=rank noprint;\nrun;\n\n\n\n\n                                               The FREQ Procedure\n\n                                  Summary Statistics for timepoint by response\n                                            Controlling for subject\n\n                           Cochran-Mantel-Haenszel Statistics (Based on Rank Scores)\n\n                        Statistic    Alternative Hypothesis    DF       Value      Prob\n                        ---------------------------------------------------------------\n                            1        Nonzero Correlation        1      0.0276    0.8682\n                            2        Row Mean Scores Differ     3      3.6429    0.3027\n\n\n                                             Total Sample Size = 40\n\n\n\nExamples: FREQ Procedure (sas.com)"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#convergence-times",
    -    "href": "Comp/r-sas_mmrm.html#convergence-times",
    -    "title": "R vs SAS MMRM",
    -    "section": "Convergence Times",
    -    "text": "Convergence Times\n\nFEV Data\nThe mmrm, PROC GLIMMIX, gls, lmer, and glmmTMB functions are applied to the FEV dataset 10 times. The convergence times are recorded for each replicate and are reported in the table below.\n\n\n\nComparison of convergence times: milliseconds\n\n\nImplementation\nMedian\nFirst Quartile\nThird Quartile\n\n\n\n\nmmrm\n56.15\n55.76\n56.30\n\n\nPROC GLIMMIX\n100.00\n100.00\n100.00\n\n\nlmer\n247.02\n245.25\n257.46\n\n\ngls\n687.63\n683.50\n692.45\n\n\nglmmTMB\n715.90\n708.70\n721.57\n\n\n\n\n\nIt is clear from these results that mmrm converges significantly faster than other R functions. Though not demonstrated here, this is generally true regardless of the sample size and covariance structure used. mmrm is faster than PROC GLIMMIX.\n\n\nBCVA Data\nThe MMRM implementations are now applied to the BCVA dataset 10 times. The convergence times are presented below.\n\n\n\nComparison of convergence times: seconds\n\n\nImplementation\nMedian\nFirst Quartile\nThird Quartile\n\n\n\n\nmmrm\n3.36\n3.32\n3.46\n\n\nglmmTMB\n18.65\n18.14\n18.87\n\n\nPROC GLIMMIX\n36.25\n36.17\n36.29\n\n\ngls\n164.36\n158.61\n165.93\n\n\nlmer\n165.26\n157.46\n166.42\n\n\n\n\n\nWe again find that mmrm produces the fastest convergence times on average."
    +    "objectID": "SAS/SAS_Friedmantest.html#sas-version",
    +    "href": "SAS/SAS_Friedmantest.html#sas-version",
    +    "title": "Friedman Chi-Square test using SAS",
    +    "section": "",
    +    "text": "SAS 9.4"
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#marginal-treatment-effect-estimates-comparison",
    -    "href": "Comp/r-sas_mmrm.html#marginal-treatment-effect-estimates-comparison",
    -    "title": "R vs SAS MMRM",
    -    "section": "Marginal Treatment Effect Estimates Comparison",
    -    "text": "Marginal Treatment Effect Estimates Comparison\nWe next estimate the marginal mean treatment effects for each visit in the FEV and BCVA datasets using the MMRM fitting procedures. All R implementations’ estimates are reported relative to PROC GLIMMIX’s estimates. Convergence status is also reported.\n\nFEV Data\n\n\n\n\n\n\n\n\n\nThe R procedures’ estimates are very similar to those output by PROC GLIMMIX, though mmrm and gls generate the estimates that are closest to those produced when using SAS. All methods converge using their default optimization arguments.\n\n\nBCVA Data\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nmmrm, gls and lmer produce estimates that are virtually identical to PROC GLIMMIX’s, while glmmTMB does not. This is likely explained by glmmTMB’s failure to converge. Note too that lmer fails to converge."
    +    "objectID": "SAS/SAS_Friedmantest.html#data-used",
    +    "href": "SAS/SAS_Friedmantest.html#data-used",
    +    "title": "Friedman Chi-Square test using SAS",
    +    "section": "",
    +    "text": "Simulated dataset of 10 subjects(blocks) with continuous endpoints are generated for single-drug repeated measurements to check whether any significance exists between the responses(y) at different time points(4 time points simulated)(groups). The p-value will indicate whether differences in response for different time points are significant."
       },
       {
    -    "objectID": "Comp/r-sas_mmrm.html#impact-of-missing-data-on-convergence-rates",
    -    "href": "Comp/r-sas_mmrm.html#impact-of-missing-data-on-convergence-rates",
    -    "title": "R vs SAS MMRM",
    -    "section": "Impact of Missing Data on Convergence Rates",
    -    "text": "Impact of Missing Data on Convergence Rates\nThe results of the previous benchmark suggest that the amount of patients missing from later time points affect certain implementations’ capacity to converge. We investigate this further by simulating data using a data-generating process similar to that of the BCVA datasets, though with various rates of patient dropout.\nTen datasets of 200 patients are generated each of the following levels of missingness: none, mild, moderate, and high. In all scenarios, observations are missing at random. The number patients observed at each visit is obtained for one replicated dataset at each level of missingness is presented in the table below.\n\n\n\nNumber of patients per visit\n\n\n\nnone\nmild\nmoderate\nhigh\n\n\n\n\nVIS01\n200\n196.7\n197.6\n188.1\n\n\nVIS02\n200\n195.4\n194.4\n182.4\n\n\nVIS03\n200\n195.1\n190.7\n175.2\n\n\nVIS04\n200\n194.1\n188.4\n162.8\n\n\nVIS05\n200\n191.6\n182.5\n142.7\n\n\nVIS06\n200\n188.2\n177.3\n125.4\n\n\nVIS07\n200\n184.6\n168.0\n105.9\n\n\nVIS08\n200\n178.5\n155.4\n82.6\n\n\nVIS09\n200\n175.3\n139.9\n58.1\n\n\nVIS10\n200\n164.1\n124.0\n39.5\n\n\n\n\n\nThe convergence rates of all implementations for stratified by missingness level is presented in the plot below.\n\n\n\n\n\n\n\n\n\nmmrm, gls, and PROC GLIMMIX are resilient to missingness, only exhibiting some convergence problems in the scenarios with the most missingness. These implementations converged in all the other scenarios’ replicates. glmmTMB, on the other hand, has convergence issues in the no-, mild-, and high-missingness datasets, with the worst convergence rate occurring in the datasets with the most dropout. Finally, lmer is unreliable in all scenarios, suggesting that it’s convergence issues stem from something other than the missing observations.\nNote that the default optimization schemes are used for each method; these schemes can be modified to potentially improve convergence rates.\nA more comprehensive simulation study using data-generating processes similar to the one used here is outlined in the simulations/missing-data-benchmarks subdirectory. In addition to assessing the effect of missing data on software convergence rates, we also evaluate these methods’ fit times and empirical bias, variance, 95% coverage rates, type I error rates and type II error rates. mmrm is found to be the most most robust software for fitting MMRMs in scenarios where a large proportion of patients are missing from the last time points. Additionally, mmrm has the fastest average fit times regardless of the amount of missingness. All implementations considered produce similar empirical biases, variances, 95% coverage rates, type I error rates and type II error rates."
    +    "objectID": "SAS/SAS_Friedmantest.html#data-source",
    +    "href": "SAS/SAS_Friedmantest.html#data-source",
    +    "title": "Friedman Chi-Square test using SAS",
    +    "section": "",
    +    "text": "data one_way_repeat;\n   do subject = 1 to 10;\n    do timepoint = 1 to 4;\n      response = round(rand('Uniform',10,50));\n      output;\n    end;\n   end;\nrun;\n\nproc print;\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas_ttest_1Sample.html",
    -    "href": "Comp/r-sas_ttest_1Sample.html",
    -    "title": "R vs SAS One Sample T-Test",
    +    "objectID": "SAS/SAS_Friedmantest.html#overview",
    +    "href": "SAS/SAS_Friedmantest.html#overview",
    +    "title": "Friedman Chi-Square test using SAS",
         "section": "",
    -    "text": "The following table shows the types of One Sample t-test analysis, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nOne sample t-test, normal data\nYes\nYes\nYes\nIn Base R, use mu parameter on t.test() function to set null hypothesis value\n\n\nOne sample t-test, lognormal data\nMaybe\nYes\nNA\nMay be supported by envstats package\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n29\n29\n29\nYes\n\n\n\nt value\n2.364306\n2.364306\n2.364306\nYes\n\n\n\np value\n0.0249741\n0.0249741\n0.0249741\nYes\n\n\n\n\n\n\n\nSince there is currently no known support for lognormal t-test in R, this comparison is not applicable."
    +    "text": "The FREQ procedure computes CMH statistic, Friedman’s test is identical to the ANOVA (row means scores) CMH statistic when the analysis uses rank scores (SCORES=RANK). The TABLES statement creates a three-way table i.e., timepoint and response stratified by subject. The output produces following statistics along with its degrees of freedom and p-value(Prob):\n\nNonzero Correlation\nRow Mean Scores Differ\n\nThe row corresponding to ‘Row Mean Scores Differ’ gives the required statistic and p-value for Friedman’s test."
       },
       {
    -    "objectID": "Comp/r-sas_ttest_1Sample.html#comparison-results",
    -    "href": "Comp/r-sas_ttest_1Sample.html#comparison-results",
    -    "title": "R vs SAS One Sample T-Test",
    +    "objectID": "SAS/SAS_Friedmantest.html#handling-missing-values",
    +    "href": "SAS/SAS_Friedmantest.html#handling-missing-values",
    +    "title": "Friedman Chi-Square test using SAS",
         "section": "",
    -    "text": "Here is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n29\n29\n29\nYes\n\n\n\nt value\n2.364306\n2.364306\n2.364306\nYes\n\n\n\np value\n0.0249741\n0.0249741\n0.0249741\nYes\n\n\n\n\n\n\n\nSince there is currently no known support for lognormal t-test in R, this comparison is not applicable."
    +    "text": "When the data contains missing response, the procedure discards the corresponding row and calculates the required statistic with a message about number of missing responses below the test statisitc output."
       },
       {
    -    "objectID": "Comp/r-sas-wilcoxonsr_HL.html",
    -    "href": "Comp/r-sas-wilcoxonsr_HL.html",
    -    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
    +    "objectID": "SAS/SAS_Friedmantest.html#example-code-for-friedman-chi-square-test",
    +    "href": "SAS/SAS_Friedmantest.html#example-code-for-friedman-chi-square-test",
    +    "title": "Friedman Chi-Square test using SAS",
         "section": "",
    -    "text": "This section compares the implementation of Wilcoxon signed-rank test in R, SAS and StatXact.\n\n\n\nThe following table provides an overview of the methods support comparability between R, SAS and StatXact for the new analysis point.\n\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nSupported in StatXact\nNotes\n\n\n\n\nWilcoxon signed-rank test with p value only\nYES\nYES\nYES\nAvailable in all, but results match only between R and StatXact. See details on p value on each software page.\n\n\nHodges-Lehmann estimator\nYES\nNO\nYES\nAvailable in R and StatXact only. In SAS needs to be derived manually.\n\n\nExact/non-exact method\nNon-exact method with/without continuity correction\nYES\nYES\nNO\nNO\nYES\nNO\nStats package in R and StatXact support both options. SAS applies a default one depending on N.\nOnly Stats package in R support both options.\n\n\nDataset with “0” differences\nYES\nNO\nYES\nSAS ignores 0s. In R only Coin package supports.\n\n\nDataset with ties\nYES\nYES\nYES\nSupported in SAS and StatXact. In R only in Coin.\n\n\n\n\n\n\nAnalysis will be conducted on the example of anonymized data from 2-period, cross-over study comparing treatments A and B in patients with asthma and acute airway obstruction induced by repeated mannitol challenges.\nFor the purpose of the results comparison we will consider a specific case where the dataset has no ties and N (number of observations) = 240.\nWilcoxon signed rank test was applied to analyse the time to return to baseline FEV1 post-mannitol challenge 2. Median difference, p value and 95% CI were provided using the Hodges-Lehmann estimator.\n\nblood_p <- read.csv(\"../data/WilcoxonSignedRank_TTR.csv\", dec = \".\")\n\n\nhead(blood_p)\n\n  SUBJID   TRT_A   TRT_B\n1      1 143.670 153.316\n2      2 163.082 170.576\n3      3 153.393 168.599\n4      4 153.082 142.358\n5      5 146.720 141.193\n6      6 150.668 147.204\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nIf you need a flexibility of choosing between methods (exact, non-exact etc) in one software, go for R or StatXact.\nIf you need a detailed documentation explaining applied methods, go for StatXact.\nIf you only need p value and don’t mind a default exact or t-Student distribution depending on N, you can choose SAS.\nIf you need 0s to contribute to the analysis, go for Coin package in R or StatXact.\nIf your dataset has ties, go for Coin package in R or StatXact.\n\n\n\n\nDetails of how to implement the methods in the discussed software are available below:\nR:\n\nCheck how to perform this analysis in R here\n\nSAS & StatXact:\n\nCheck how to perform this analysis in SAS & StatXact here"
    +    "text": "proc freq data=one_way_repeat;\n      tables subject*timepoint*response / \n             cmh2 scores=rank noprint;\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#introduction",
    -    "href": "Comp/r-sas-wilcoxonsr_HL.html#introduction",
    -    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
    +    "objectID": "SAS/SAS_Friedmantest.html#results",
    +    "href": "SAS/SAS_Friedmantest.html#results",
    +    "title": "Friedman Chi-Square test using SAS",
         "section": "",
    -    "text": "This section compares the implementation of Wilcoxon signed-rank test in R, SAS and StatXact."
    +    "text": "The FREQ Procedure\n\n                                  Summary Statistics for timepoint by response\n                                            Controlling for subject\n\n                           Cochran-Mantel-Haenszel Statistics (Based on Rank Scores)\n\n                        Statistic    Alternative Hypothesis    DF       Value      Prob\n                        ---------------------------------------------------------------\n                            1        Nonzero Correlation        1      0.0276    0.8682\n                            2        Row Mean Scores Differ     3      3.6429    0.3027\n\n\n                                             Total Sample Size = 40"
       },
       {
    -    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#general-comparison-table",
    -    "href": "Comp/r-sas-wilcoxonsr_HL.html#general-comparison-table",
    -    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
    +    "objectID": "SAS/SAS_Friedmantest.html#references",
    +    "href": "SAS/SAS_Friedmantest.html#references",
    +    "title": "Friedman Chi-Square test using SAS",
         "section": "",
    -    "text": "The following table provides an overview of the methods support comparability between R, SAS and StatXact for the new analysis point.\n\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nSupported in StatXact\nNotes\n\n\n\n\nWilcoxon signed-rank test with p value only\nYES\nYES\nYES\nAvailable in all, but results match only between R and StatXact. See details on p value on each software page.\n\n\nHodges-Lehmann estimator\nYES\nNO\nYES\nAvailable in R and StatXact only. In SAS needs to be derived manually.\n\n\nExact/non-exact method\nNon-exact method with/without continuity correction\nYES\nYES\nNO\nNO\nYES\nNO\nStats package in R and StatXact support both options. SAS applies a default one depending on N.\nOnly Stats package in R support both options.\n\n\nDataset with “0” differences\nYES\nNO\nYES\nSAS ignores 0s. In R only Coin package supports.\n\n\nDataset with ties\nYES\nYES\nYES\nSupported in SAS and StatXact. In R only in Coin."
    +    "text": "Examples: FREQ Procedure (sas.com)"
       },
       {
    -    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#example-data",
    -    "href": "Comp/r-sas-wilcoxonsr_HL.html#example-data",
    -    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
    +    "objectID": "SAS/ancova.html",
    +    "href": "SAS/ancova.html",
    +    "title": "Ancova",
         "section": "",
    -    "text": "Analysis will be conducted on the example of anonymized data from 2-period, cross-over study comparing treatments A and B in patients with asthma and acute airway obstruction induced by repeated mannitol challenges.\nFor the purpose of the results comparison we will consider a specific case where the dataset has no ties and N (number of observations) = 240.\nWilcoxon signed rank test was applied to analyse the time to return to baseline FEV1 post-mannitol challenge 2. Median difference, p value and 95% CI were provided using the Hodges-Lehmann estimator.\n\nblood_p <- read.csv(\"../data/WilcoxonSignedRank_TTR.csv\", dec = \".\")\n\n\nhead(blood_p)\n\n  SUBJID   TRT_A   TRT_B\n1      1 143.670 153.316\n2      2 163.082 170.576\n3      3 153.393 168.599\n4      4 153.082 142.358\n5      5 146.720 141.193\n6      6 150.668 147.204"
    +    "text": "ANCOVA in SAS\nIn SAS, there are several ways to perform ANCOVA analysis. One common way is to use PROC GLM with the LSMEANS option. The below example will use this method.\n\nData Used\nThe following data was used in this example.\n  data DrugTest;\n     input Drug $ PreTreatment PostTreatment @@;\n     datalines;\n  A 11  6   A  8  0   A  5  2   A 14  8   A 19 11\n  A  6  4   A 10 13   A  6  1   A 11  8   A  3  0\n  D  6  0   D  6  2   D  7  3   D  8  1   D 18 18\n  D  8  4   D 19 14   D  8  9   D  5  1   D 15  9\n  F 16 13   F 13 10   F 11 18   F  9  5   F 21 23\n  F 16 12   F 12  5   F 12 16   F  7  1   F 12 20\n  ;\n\n\nCode\nThe following code was used to test the effects of a drug pre and post treatment:\n  proc glm data=DrugTest;\n     class Drug;\n     model PostTreatment = Drug PreTreatment / solution;\n     lsmeans Drug / stderr pdiff cov out=adjmeans;\n  run;\n  proc print data=adjmeans;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAs can be seen in the images above, the GLM procedure provides multiple types of analysis to determine the relationship between the dependent and independent variables. The last step produces a table of LSMEANS and coefficient of variation values for each of the three different drugs in the dataset."
       },
       {
    -    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#summary-and-recommendation",
    -    "href": "Comp/r-sas-wilcoxonsr_HL.html#summary-and-recommendation",
    -    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
    -    "section": "",
    -    "text": "If you need a flexibility of choosing between methods (exact, non-exact etc) in one software, go for R or StatXact.\nIf you need a detailed documentation explaining applied methods, go for StatXact.\nIf you only need p value and don’t mind a default exact or t-Student distribution depending on N, you can choose SAS.\nIf you need 0s to contribute to the analysis, go for Coin package in R or StatXact.\nIf your dataset has ties, go for Coin package in R or StatXact."
    +    "objectID": "SAS/ci_for_prop.html",
    +    "href": "SAS/ci_for_prop.html",
    +    "title": "Confidence intervals for Proportions in SAS",
    +    "section": "",
    +    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (e.g 1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (e.g different subjects in each of the 2 groups), or can be matched (e.g the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more information about these methods in R & SAS, including which performs better in different scenarios see Five Confidence Intervals for Proportions That You Should Know about1 and Confidence Intervals for Binomial Proportion Using SAS2"
       },
       {
    -    "objectID": "Comp/r-sas-wilcoxonsr_HL.html#additional-references",
    -    "href": "Comp/r-sas-wilcoxonsr_HL.html#additional-references",
    -    "title": "R vs SAS vs StatXact - Wilcoxon signed-rank test",
    +    "objectID": "SAS/ci_for_prop.html#introduction",
    +    "href": "SAS/ci_for_prop.html#introduction",
    +    "title": "Confidence intervals for Proportions in SAS",
         "section": "",
    -    "text": "Details of how to implement the methods in the discussed software are available below:\nR:\n\nCheck how to perform this analysis in R here\n\nSAS & StatXact:\n\nCheck how to perform this analysis in SAS & StatXact here"
    +    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (e.g 1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (e.g different subjects in each of the 2 groups), or can be matched (e.g the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more information about these methods in R & SAS, including which performs better in different scenarios see Five Confidence Intervals for Proportions That You Should Know about1 and Confidence Intervals for Binomial Proportion Using SAS2"
       },
       {
    -    "objectID": "Comp/r-sas-summary-stats.html",
    -    "href": "Comp/r-sas-summary-stats.html",
    -    "title": "Deriving Quantiles or Percentiles in R vs SAS",
    -    "section": "",
    -    "text": "Data\nThe following data will be used show the differences between the default percentile definitions used by SAS and R:\n\n10, 20, 30, 40, 150, 160, 170, 180, 190, 200\n\n\n\nSAS Code\nAssuming the data above is stored in the variable aval within the dataset adlb, the 25th and 40th percentiles could be calculated using the following code.\n\nproc univariate data=adlb;\n  var aval;\n  output out=stats pctlpts=25 40 pctlpre=p;\nrun;\n\nThis procedure creates the dataset stats containing the variables p25 and p40.\n\n\n\n\n\n\n\n\n\nThe procedure has the option PCTLDEF which allows for five different percentile definitions to be used. The default is PCTLDEF=5.\n\n\nR code\nThe 25th and 40th percentiles of aval can be calculated using the quantile function.\n\nquantile(adlb$aval, probs = c(0.25, 0.4))\n\nThis gives the following output.\n\n\n  25%   40% \n 32.5 106.0 \n\n\nThe function has the argument type which allows for nine different percentile definitions to be used. The default is type = 7.\n\n\nComparison\nThe default percentile definition used by the UNIVARIATE procedure in SAS finds the 25th and 40th percentiles to be 30 and 95. The default definition used by R finds these percentiles to be 32.5 and 106.\nIt is possible to get the quantile function in R to use the same definition as the default used in SAS, by specifying type=2.\n\nquantile(adlb$aval, probs = c(0.25, 0.4), type=2)\n\nThis gives the following output.\n\n\n25% 40% \n 30  95 \n\n\nIt is not possible to get the UNIVARIATE procedure in SAS to use the same definition as the default used in R.\nRick Wicklin provided a blog post showing how SAS has built in support for calculations using 5 of the 9 percentile definitions available in R, and also demonstrated how you can use a SAS/IML function to calculate percentiles using the other 4 definitions.\nMore information about quantile derivation can be found in the SAS blog.\n\n\nKey references:\nCompare the default definitions for sample quantiles in SAS, R, and Python\nSample quantiles: A comparison of 9 definitions\nHyndman, R. J., & Fan, Y. (1996). Sample quantiles in statistical packages. The American Statistician, 50(4), 361-365."
    +    "objectID": "SAS/ci_for_prop.html#data-used",
    +    "href": "SAS/ci_for_prop.html#data-used",
    +    "title": "Confidence intervals for Proportions in SAS",
    +    "section": "Data used",
    +    "text": "Data used\nThe adcibc data stored here was used in this example, creating a binary treatment variable trt taking the values of Act or PBO and a binary response variable resp taking the values of Yes or No. For this example, a response is defined as a score greater than 4.\n\ndata adcibc2 (keep=trt resp) ;\n    set adcibc;     \n    if aval gt 4 then resp=\"Yes\";\n    else resp=\"No\";     \n    if trtp=\"Placebo\" then trt=\"PBO\";\n    else trt=\"Act\"; \nrun;\n\nThe below shows that for the Actual Treatment, there are 36 responders out of 154 subjects = 0.2338 (23.38% responders).\n\nproc freq data=adcibc;\n  table trt*resp/ nopct nocol;\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas_anova.html",
    -    "href": "Comp/r-sas_anova.html",
    -    "title": "R vs SAS Linear Models",
    -    "section": "",
    -    "text": "Matching Contrasts: R and SAS\nIt is recommended to use the emmeans package when attempting to match contrasts between R and SAS. In SAS, all contrasts must be manually defined, whereas in R, we have many ways to use pre-existing contrast definitions. The emmeans package makes simplifies this process, and provides syntax that is similar to the syntax of SAS.\nThis is how we would define a contrast in SAS.\n\n# In SAS\nproc glm data=work.mycsv;\n   class drug;\n   model post = drug pre / solution;\n   estimate 'C vs A'  drug -1  1 0;\n   estimate 'E vs CA' drug -1 -1 2;\nrun;\n\nAnd this is how we would define the same contrast in R, using the emmeans package.\n\nlm(formula = post ~ pre + drug, data = df_trial) %>% \n  emmeans(\"drug\") %>% \n  contrast(method = list(\n    \"C vs A\"  = c(-1,  1, 0),\n    \"E vs CA\" = c(-1, -1, 2)\n  ))\n\nNote, however, that there are some cases where the scale of the parameter estimates between SAS and R is off, though the test statistics and p-values are identical. In these cases, we can adjust the SAS code to include a divisor. As far as we can tell, this difference only occurs when using the predefined Base R contrast methods like contr.helmert.\n\nproc glm data=work.mycsv;\n   class drug;\n   model post = drug pre / solution;\n   estimate 'C vs A'  drug -1  1 0 / divisor = 2;\n   estimate 'E vs CA' drug -1 -1 2 / divisor = 6;\nrun;"
    +    "objectID": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-single-proportion",
    +    "href": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-single-proportion",
    +    "title": "Confidence intervals for Proportions in SAS",
    +    "section": "Methods for Calculating Confidence Intervals for a single proportion",
    +    "text": "Methods for Calculating Confidence Intervals for a single proportion\nSAS PROC FREQ in Version 9.4 can compute 11 methods to calculate CIs for a single proportion, an explanation of these methods and the code is shown below. See BINOMIAL3 for more information on SAS parameterization. It is recommended to always sort your data prior to doing a PROC FREQ.\nHere we are calculating a 95% confidence interval for the proportion of responders in the active treatment group.\n\nClopper-Pearson (Exact or binomial CI) Method\nWith Binary endpoint data (response/non-response), we make the assumption that the proportion of responders, has been derived from a series of Bernoulli trials. Trials (Subjects) are independent and we have a fixed number of repeated trials with an outcome of respond or not respond. This type of data follows the discrete binomial probability distribution, and the Clopper-Pearson4 (Exact) method uses this distribution to calculate the CIs. However, for large numbers of trials (subjects), the probability distribution becomes difficult to calculate and hence a variety of approximations were developed all with their pros and cons (depending on your data distribution). This method can also be too conservative, implying that the interval returned is too wide an interval compared to the interval containing the true population proportion 95% of the time.\nClopper-Pearson method is output by SAS as the default method, but you can also specify it using BINOMIAL(LEVEL=\"Yes\" CL=CLOPPERPEARSON);\n\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nThe most commonly used alternative to the Clopper-Pearson (Exact) method is the asymptotic Normal Approximation (Wald) CI. In large random samples from independent trials, the sampling distribution of proportions approximately follows the normal distribution. The expectation of a sample proportion is the corresponding population proportion. Therefore, based on a sample of size \\(n\\), a \\((1-\\alpha)\\%\\) confidence interval for population proportion can be calculated using normal approximation as follows:\n\\(p\\approx \\hat p \\pm z_\\alpha \\sqrt{\\hat p(1-\\hat p)}/{n}\\), where \\(\\hat p\\) is the sample proportion, \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\), and \\(\\sqrt{\\hat p(1-\\hat p)}/{n}\\) is the standard error.\nOne should note that the approximation can become unreliable as the proportion of responders gets close to 0 or 1 (e.g. 0 or 100% responding), and alternative methods may be more suitable. In this scenario, common issues consist of:\n\nit does not respect the 0 and 1 proportion boundary (so you can get a lower CI of -0.1 or an upper CI of 1.1%!)\nthe derived 95% CI may not cover the true proportion 95% of the time\n\nWald method can be derived with or without a Yate’s continuity correction. Applying the continuity correction is recommended when you have a small sample size or the estimated proportion is close to the tail ends (0 or 1). Applying Yate’s correction is considered more conservative but it’s not as conservative as Clopper-Pearson approach.\nNormal approximation method is output by SAS as the default method, but you can also specify it using BINOMIAL(LEVEL=\"Yes\" CL=WALD);\nSAS also produces a continuity correction version of the Wald method, you can specify it using BINOMIAL(LEVEL=\"Yes\" CL=WALD(CORRECT));\n\n\nWilson Method (Also known as the Score method or the Newcombe method)7\nThe Wilson (Score) method is an extension to the normal approximation, but commonly used where the proportion is close to 0 or 1 (i.e. 0% or 100% responding). This is because the normal approximation can be unreliable at the tail ends of the distribution, and as such the Wilson method can provide more reliable CIs. The method can be derived with or without a Yate’s continuity correction. Applying the continuity correction is recommended when you have a small sample size or the estimated proportion is close to the tail ends (0 or 1). Applying Yate’s correction is considered more conservative (sometimes too conservative), but it’s not as conservative as Clopper-Pearson approach. Not that the Wilson method is not boundary-respecting so you can get confidence interval <0 or >1.\nLet p=r/n, where r= number of responses, and n=number of subjects, q=1-p, and z= the appropriate value from standard normal distribution:\n\\[ z{_1-\\alpha/2} \\]For example, for 95% confidence intervals, alpha=0.05, using standard normal tables, z in the equations below will take the value =1.96. Calculate 3 quantities\n\\[ A= 2r+z^2\\]\n\\[ B=z\\sqrt(z^2 + 4rq) \\] \\[ C=2(n+z^2) \\]The method calculates the confidence interval (Low to High) as: (A-B)/C to (A+B)/C\nA = 2 * 36 + 1.96^2 = 75.8416\nB = 1.96 * sqrt (1.96^2 + 4 x 36 x 0.7662) = 20.9435\nC = 2* (154+1.96^2) = 315.6832\nLower interval = A-B/C = 75.8416 - 20.9435 / 315.6832 = 0.17390\nUpper interval = A+B/C = 75.8416 + 20.9435 / 315.6832 = 0.30659\nCI = 0.17390 to 0.30659\nWilson (score) method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=Wilson);\nSAS also produces a continuity correction version of the Wilson method, you can specify it using BINOMIAL(LEVEL=\"Yes\" CL=WILSON(CORRECT));\nThe only differences in the equations to calculate the Wilson score with continuity correction is that the equations for A and B are changed as follows:\n\\[ A= 2r+z^2 -1\\]\n\\[ B=z\\sqrt(z^2 - 2 -\\frac{1}{n} + 4rq) \\]\n\n\nAgresti-Coull Method\nAgresti-Coull Method is a ‘simple solution’ designed to improve coverage compared to the Wald method and still perform better than Clopper-Pearson particularly when the probability isn’t in the mid-range (0.5). It is less conservative whilst still having good coverage. The only difference compared to the Wald method is that it adds two successes and two failures to the original observations (increasing the sample by 4 observations). In practice it is not often used.\nAgresti-Coull method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=AGRESTICOULL);\n\n\nBinomial based MidP Method\nThe MidP method is similar to the Clopper-Pearson method, but aims to reduce the conservatism. It’s quite a complex method compared to the methods above and rarely used in practice.\nMidP method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=MIDP);\n\n\nJeffreys Method\nJeffreys method is a particular type of Bayesian Highest Probability Density (HPD) Method. For proportions, the beta distribution is generally used for the prior, which consists of two parameters alpha and beta. Setting alpha=beta=0.5 is called Jeffrey’s prior. This is considered as non-informative for a binomial proportion.\n\\[\n(Beta (^k/_2 + ^1/_{2}, ^{(n-k)}/_2+^1/_2)_{\\alpha}, Beta (^k/_2 + ^1/_{2}, ^{(n-k)}/_2+^1/_2)_{1-\\alpha}\n\\] Jeffreys method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=Jeffreys);\n\n\nBlaker Method6\nThe Blaker method is a less conservative alternative to the Clopper-pearson exact test. It is also an exact method, but derives the CI by inverting the p-value function of an exact test.\nThe Clopper-pearson CI’s are always wider and contain the Blaker CI limits. It’s adoption has been limited due to the numerical algorithm taking longer to compute compared to some of the other methods especially when the sample size is large. NOTE: Klaschka and Reiczigel5 is yet another adaptation of this method.\nBLAKER method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=BLAKER);"
       },
       {
    -    "objectID": "Comp/r-sas_correlation.html#codes",
    -    "href": "Comp/r-sas_correlation.html#codes",
    -    "title": "",
    -    "section": "Codes",
    -    "text": "Codes\nThe following table shows the three different types of correlations considered, their functions in each language and whether the results match\n\n\n\n\n\n\n\n\n\nCorrelation coefficient\nR code\nSAS code\nResults match\n\n\n\n\nPearson\ncor.test(x,y,method=\"pearson\")\nproc corr data pearson;\nvar x y;\nrun;\nYes\n\n\nSpearman\ncor.test(x,y,method=\"spearman\")\nproc corr data spearman;\nvar x y;\nrun;\nYes\n\n\nKendall\ncor.test(x,y,method=\"kendall\")\nproc corr data kendall;\nvar x y;\nrun;\nYes\n\n\n\n‘x’ and ‘y’ are variables in the dataset “data” for which we determine the correlation."
    +    "objectID": "SAS/ci_for_prop.html#example-code-using-proc-freq",
    +    "href": "SAS/ci_for_prop.html#example-code-using-proc-freq",
    +    "title": "Confidence intervals for Proportions in SAS",
    +    "section": "Example Code using PROC FREQ",
    +    "text": "Example Code using PROC FREQ\nBy adding the option BINOMIAL(LEVEL=\"Yes\") to your ‘PROC FREQ’, SAS outputs the Normal Approximation (Wald) and Clopper-Pearson (Exact) confidence intervals as two default methods, derived for the Responders = Yes. If you do not specify the LEVEL you want to model, then SAS assumes you want to model the first level that appears in the output (alphabetically).\nIt is very important to ensure you are calculating the CI for the correct level! Check your output to confirm, you will see below it states resp=Yes !\nThe output consists of the proportion of resp=Yes, the Asymptotic SE, 95% CIs using normal-approximation method, 95% CI using the Clopper-Pearson method (Exact), and then a Binomial test statistic and p-value for the null hypothesis of H0: Proportion = 0.5.\n\nproc sort data=adcibc;\nby trt; \nrun; \n\nproc freq data=adcibc ; \ntable resp/ nopct nocol BINOMIAL(LEVEL=\"Yes\");\nby trt;\nrun;\n\n\n\n\n\n\n\n\n\n\nBy adding the option BINOMIAL(LEVEL=\"Yes\" CL=<name of CI method>), the other CIs are output as shown below. You can list any number of the available methods within the BINOMIAL option CL=XXXX separated by a space. However, SAS will only calculate the WILSON and WALD or the WILSON(CORRECT) and WALD(CORRECT). SAS wont output them both from the same procedure.\n\nBINOMIAL(LEVEL=\"Yes\" CL=CLOPPERPEARSON WALD WILSON AGRESTICOULL JEFFREYS MIDP LIKELIHOODRATIO LOGIT BLAKER) will return Agresti-Coull, BLAKER, Clopper-pearson(Exact), WALD(without continuity correction) WILSON(without continuity correction), JEFFREYS, MIDP, LIKELIHOODRATIO, and LOGIT\nBINOMIAL(LEVEL=\"Yes\" CL=ALL); will return Agresti-Coull, Clopper-pearson (Exact), Jeffreys, Wald(without continuity correction), Wilson (without continuity correction)\nBINOMIALc(LEVEL=\"Yes\" CL=ALL);will return Agresti-Coull, Clopper-pearson (Exact), Jeffreys, Wald (with continuity correction), Wilson(with continuity correction)\nBINOMIALc(LEVEL=\"Yes\" CL=WILSON(CORRECT)  WALD(CORRECT));will return Wilson(with continuity correction) and Wald (with continuity correction)\n\n\nproc freq data=adcibc;\n         table resp/ nopct nocol \n                     BINOMIAL(LEVEL=\"Yes\" \n                              CL= CLOPPERPEARSON WALD WILSON \n                                  AGRESTICOULL JEFFREYS MIDP \n                                  LIKELIHOODRATIO LOGIT BLAKER);\n  by trt; \nrun;\n\n\n\n\n\n\n\n\n\n\n\nproc freq data=adcibc;\n         table resp/ nopct nocol \n                     BINOMIAL(LEVEL=\"Yes\" \n                              CL= WILSON(CORRECT)  WALD(CORRECT));\n  by trt; \nrun;\n\n\n\n\n\n\n\n\n\n\nSAS output often rounds to 3 or 4 decimal places in the output window, however the full values can be obtained using SAS ODS statements. ods output binomialcls=bcl; and then using the bcl dataset, in a data step to put the variable out to the number of decimal places we require.\n10 decimal places shown here ! lowercl2=put(lowercl,12.10);"
       },
       {
    -    "objectID": "Comp/r-sas_correlation.html#comparison-results",
    -    "href": "Comp/r-sas_correlation.html#comparison-results",
    -    "title": "",
    -    "section": "Comparison Results",
    -    "text": "Comparison Results\nExample: Lung Cancer Data\nData source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601-7, 1994.\nSurvival in patients with advanced lung cancer from the North Central Cancer Treatment Group. Performance scores rate how well the patient can perform usual daily activities. Correlation was observed between age and meal.cal variables in the dataset.\n\n\n\n\n\n\n\n\n\n\nCorrelation coefficient\nSample estimates in R\np-value in R\nSample estimate in SAS\np-value in SAS\n\n\n\n\nPearson\n-0.2314107\n0.001722\n-0.23141\n0.0017\n\n\nSpearman\n-0.2073639\n0.005095\n-0.20736\n0.0051\n\n\nKendall\n-0.1443877\n0.00524\n-0.14439\n0.0052\n\n\n\nPlease note that the results in SAS are rounded at 5 decimals for sample estimates and 4 decimals for p-values."
    +    "objectID": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-matched-pair-proportion",
    +    "href": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-matched-pair-proportion",
    +    "title": "Confidence intervals for Proportions in SAS",
    +    "section": "Methods for Calculating Confidence Intervals for a matched pair proportion",
    +    "text": "Methods for Calculating Confidence Intervals for a matched pair proportion\nYou may experience paired data in any of the following types of situation:\n\nTumour assesssments classified as Progressive Disease or Not Progressive Disease performed by an Investigator and separately by an independent panel.\nA paired case-control study (each subject taking active treatment is matched to a patient taking control)\nA cross-over trial where the same subjects take both medications\n\nIn all these cases, the calculated proportions for the 2 groups are not independent.\nUsing a cross over study as our example, a 2 x 2 table can be formed as follows:\n\n\n\n\n\n\n\n\n\n\nPlacebo\nResponse= Yes\nPlacebo\nResponse = No\nTotal\n\n\n\n\nActive Response = Yes\nr\ns\nr+s\n\n\nActive Response = No\nt\nu\nt+u\n\n\nTotal\nr+t\ns+u\nN = r+s+t+u\n\n\n\nThe proportions of subjects responding on each treatment are:\nActive: \\(\\hat p_1 = (r+s)/n\\) and Placebo: \\(\\hat p_2= (r+t)/n\\)\nDifference between the proportions for each treatment are: \\(D=p1-p2=(s-t)/n\\)\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nIn large random samples from independent trials, the sampling distribution of the difference between two proportions approximately follows the normal distribution. Hence the SE for the difference and 95% confidence interval can be calculated using the following equations.\n\\(SE(D)=\\frac{1}{n} * sqrt(s+t-\\frac{(s-t)^2}{n})\\)\n\\(D-z_\\alpha * SE(D)\\) to \\(D+z_\\alpha * SE(D)\\)\nwhere \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\),\n\n\nWilson Method (Also known as the Score method or the Altman, Newcombe method7 )\nDerive the confidence intervals using the Wilson Method equations above for each of the individual single samples 1 and 2.\nLet l1 = Lower CI for sample 1, and u1 be the upper CI for sample 1.\nLet l2 = Lower CI for sample 2, and u2 be the upper CI for sample 2.\nWe then define \\(\\phi\\) which is used to correct for \\(\\hat p_1\\) and \\(\\hat p_2\\) not being independent. As the samples are related, \\(\\phi\\) is usually positive and thus makes the confidence interval smaller (narrower).\nIf any of r+s, t+u, r+t, s+u are zero, then set \\(\\phi\\) to be 0.\nOtherwise we calculate A, B and C, and \\(\\phi=C / sqrt A\\)\nIn the above: \\(A=(r+s)(t+u)(r+t)(s+u)\\) and \\(B=(ru-st)\\)\nTo calculate C follow the table below.\n\n\n\n\n\n\n\nCondition of B\nSet C equal to\n\n\n\n\nIf B is greater than n/2\nB - n/2\n\n\nIf B is between 0 and n/2\n0\n\n\nIf B is less than 0\nB\n\n\n\nLet D = p1-p2 (the difference between the observed proportions of responders)\nThe Confidence interval for the difference between two population proportions is: \\(D - sqrt((p_1-l_1)^2)-2\\phi(p_1-l_1)(u_2-p_2)+(u_2-p_2)^2 )\\) to\n\\(D + sqrt((p_2-l_2)^2)-2\\phi(p_2-l_2)(u_1-p_1)+(u_1-p_1)^2 )\\)"
       },
       {
    -    "objectID": "Comp/r-sas_correlation.html#summary",
    -    "href": "Comp/r-sas_correlation.html#summary",
    -    "title": "",
    -    "section": "Summary",
    -    "text": "Summary\nComparisons between SAS and R yield identical results for the tested dataset. R outputs test statistic values and p-values, whereas SAS offers descriptive statistics (N, mean, standard deviation, sum, minimum, maximum) for each variable, but does not display the test statistic values."
    +    "objectID": "SAS/ci_for_prop.html#example-code-using-proc-freq-1",
    +    "href": "SAS/ci_for_prop.html#example-code-using-proc-freq-1",
    +    "title": "Confidence intervals for Proportions in SAS",
    +    "section": "Example Code using PROC FREQ",
    +    "text": "Example Code using PROC FREQ\nSAS Proc Freq has 3 methods for analysis of paired data (Common risk difference).\nThe default method is Mantel-Haenszel confidence limits. SAS can also Score (Miettinen-Nurminen) CIs and Stratified Newcombe CIs (constructed from stratified Wilson Score CIs).\nSee here for equations.\n\nproc freq data=adcibc order=data; \ntable trt*resp/commonriskdiff(cl=MH NEWCOMBE); \nrun;"
       },
       {
    -    "objectID": "Comp/r-sas_correlation.html#references",
    -    "href": "Comp/r-sas_correlation.html#references",
    -    "title": "",
    -    "section": "References",
    -    "text": "References\nPROC CORR: The CORR Procedure (sas.com)\ncor.test function - RDocumentation"
    +    "objectID": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-2-independent-samples-proportion",
    +    "href": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-2-independent-samples-proportion",
    +    "title": "Confidence intervals for Proportions in SAS",
    +    "section": "Methods for Calculating Confidence Intervals for 2 independent samples proportion",
    +    "text": "Methods for Calculating Confidence Intervals for 2 independent samples proportion\nThis paper8 described many methods for the calculation of confidence intervals for 2 independent proportions. The most commonly used are: Wald with continuity correction and Wilson with continuity correction. The Wilson method may be more applicable when sample sizes are smaller and/or the proportion is closer to 0 or 1.\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nIn large random samples from independent trials, the sampling distribution of the difference between two proportions approximately follows the normal distribution.\nThe difference between two independent sample proportions is calculated as: \\(D= \\hat p_1-\\hat p_2\\)\nA confidence interval for the difference between two independent proportions \\(D\\) can be calculated using:\n\\(D\\approx \\hat D \\pm z_\\alpha * SE(\\hat p)\\),\nwhere \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\), and\n\\(SE (\\hat p) = sqrt{( \\frac{\\hat p_1 (1-\\hat p_1)}{n_1} + \\frac{\\hat p_2 (1-\\hat p_2)}{n_2})}\\)\nWith continuity correction, the equation becomes\n\\(D\\approx \\hat D \\pm (CC + z_\\alpha * SE(\\hat p))\\),\nwhere \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\),\nand \\(SE (\\hat p)\\) = \\(sqrt{( \\frac{\\hat p_1 (1-\\hat p_1)}{n_1} + \\frac{\\hat p_2 (1-\\hat p_2)}{n_2})}\\)\nand\n\\(CC = \\frac{1}{2} (\\frac{1}{n_1} + \\frac{1}{n_2})\\)\n\n\nWilson Method (Also known as the Score method or the Altman, Newcombe method7 )\nDerive the confidence intervals using the Wilson Method equations above for each of the individual single samples 1 and 2.\nLet l1 = Lower CI for sample 1, and u1 be the upper CI for sample 1.\nLet l2 = Lower CI for sample 2, and u2 be the upper CI for sample 2.\nLet D = p1-p2 (the difference between the observed proportions)\nThe Confidence interval for the difference between two population proportions is: \\[ D - sqrt((p_1-l_1)^2)+(u_2-p_2)^2 )\\quad to\\quad D + sqrt((p_2-l_2)^2)+(u_1-p_1)^2 )   \\]"
       },
       {
    -    "objectID": "Comp/r-sas-python_survey-stats-summary.html",
    -    "href": "Comp/r-sas-python_survey-stats-summary.html",
    -    "title": "R vs SAS vs Python Survey Summary Statistics",
    -    "section": "",
    -    "text": "This document will compare the survey summary statistics functionality in SAS (available through SAS/STAT), R (available from the {survey} package), and Python (available from the samplics package), highlighting differences in methods and results. Only the default Taylor series linearisation method for calculating variances is used in all languages. A more detailed comparison between R and SAS for specific methods and use-cases is available in (“Software for Analysis of YRBS Data” 2017), (So et al. 2020), or (Damico 2009). For a general guide to survey statistics, which has companion guides for both R and SAS, see (Lohr 2022)."
    +    "objectID": "SAS/ci_for_prop.html#example-code-using-proc-freq-2",
    +    "href": "SAS/ci_for_prop.html#example-code-using-proc-freq-2",
    +    "title": "Confidence intervals for Proportions in SAS",
    +    "section": "Example Code using PROC FREQ",
    +    "text": "Example Code using PROC FREQ\nIt is important to check the output to ensure that you are modelling Active - Placebo, and response = Yes (not Response=No). By default SAS sorts alphabetically and calculates CI’s for the first column. You can change this by using the COLUMN= Option on riskdiff or by sorting the dataset (here by trt, then descending resp), and then using order=data in the proc freq. This tells SAS to use the order you have sorted the data by. SAS confirms this by saying “Difference is (Row 1 - Row 2)” and “Column 1 (resp=Yes)”. Note how in the SAS output, it calls the requested ‘wilson’ method ‘Newcombe’ in the output.\nOptions for riskdiff(CL=XXX) consist of AC:Agresti-Caffo, EXACT=exact, HA:Hauck-Anderson, MN or SCORE:Miettinen-Nurminen (another type of Score CI), WILSON or NEWCOMBE: Wilson method described above, and WALD: normal approximation wald method described above. Examples using Wald and Wilson are shown below with and without continuity correction.\n\nproc sort data=adcibc;\n by  trt descending resp;\nrun;\n\n#without continuity correction\nproc freq data=adcibc order=data;\n  table trt*resp/riskdiff(CL=(wald wilson)); \nrun;\n\n#with continuity correction\n\nproc freq data=adcibc order=data;\n  table trt*resp/riskdiff(CORRECT CL=(wald wilson)); \nrun;"
       },
       {
    -    "objectID": "Comp/r-sas-python_survey-stats-summary.html#r",
    -    "href": "Comp/r-sas-python_survey-stats-summary.html#r",
    -    "title": "R vs SAS vs Python Survey Summary Statistics",
    -    "section": "R",
    -    "text": "R\n\nlibrary(survey)\n\ndata(\"nhanes\")\n\nnhanes_design <- svydesign(\n  data = nhanes,\n  id = ~SDMVPSU, # Specify the PSU/cluster column\n  strata = ~SDMVSTRA,  # The stratification column\n  weights = ~WTMEC2YR,  # The weighting column\n  nest = TRUE  # Allows for PSUs with the same name nested within different strata\n)\n\n# Mean of HI_CHOL\nhi_chol_mean <- svymean(~HI_CHOL, nhanes_design, na.rm=TRUE)\n\n# Sum of HI_CHOL\nhi_chol_sum <- svytotal(~HI_CHOL, nhanes_design, na.rm=TRUE)\n\n# Ratio of HI_CHOL / RIAGENDR\nhi_chol_ratio <- svyratio(\n  numerator = ~HI_CHOL,\n  denominator = ~RIAGENDR,\n  nhanes_design,\n  na.rm=TRUE,\n  ci=TRUE,\n  se=TRUE,\n  separate=FALSE\n)\n\n# Proportion of different AGECAT values\nagecat_props <- svymean(~agecat, nhanes_design, na.rm=TRUE)\n\n# Quantiles of HI_CHOL\nhi_chol_quart <- svyquantile(\n  ~HI_CHOL,\n  nhanes_design,\n  quantiles=c(0.025, 0.5, 0.975),\n  na.rm=TRUE,\n  ci=TRUE\n)\n\n# Domain analysis of mean of HI_CHOL by race, with design effect\nhi_chol_mean_by_race <- svyby(~HI_CHOL, ~race, nhanes_design, svymean, na.rm=TRUE, deff=\"replace\")\n\nprint(list(\n  \"Mean of HI_CHOL\" = coef(hi_chol_mean),\n  \"SE of Mean HI_CHOL\" = SE(hi_chol_mean),\n  \"CL of Mean HI_CHOL\" = confint(hi_chol_mean, df=degf(nhanes_design)),\n  \"Sum of HI_CHOL\" = coef(hi_chol_sum),\n  \"SE of Sum HI_CHOL\" = SE(hi_chol_sum),\n  \"CL of Sum HI_CHOL\" = confint(hi_chol_sum, df=degf(nhanes_design)),\n  \"Ratio of HI_CHOL / RIAGENDR\" = coef(hi_chol_ratio),\n  \"SE of Ratio HI_CHOL / RIAGENDR\" = SE(hi_chol_ratio),\n  \"CL of Ratio HI_CHOL / RIAGENDR\" = confint(hi_chol_ratio, df=degf(nhanes_design)),\n  \"Proportion of AGECAT\" = coef(agecat_props),\n  \"SE of Proportion AGECAT\" = SE(agecat_props),\n  \"CL of Proportion AGECAT\" = confint(agecat_props, df=degf(nhanes_design)),\n  \"Quantiles of HI_CHOL\" = coef(hi_chol_quart),\n  \"SE of Quantiles HI_CHOL\" = SE(hi_chol_quart),\n  \"CL of Quantiles HI_CHOL\" = confint(hi_chol_quart, df=degf(nhanes_design)),\n  \"Mean of HI_CHOL by race\" = coef(hi_chol_mean_by_race),\n  \"SE of HI_CHOL by race\" = SE(hi_chol_mean_by_race),\n  \"CL of HI_CHOL by race\" = confint(hi_chol_mean_by_race, df=degf(nhanes_design)),\n  \"Design Effect of HI_CHOL by race\" = hi_chol_mean_by_race$DEff.HI_CHOL\n))\n\n$`Mean of HI_CHOL`\n HI_CHOL \n0.112143 \n\n$`SE of Mean HI_CHOL`\n           HI_CHOL\nHI_CHOL 0.00544584\n\n$`CL of Mean HI_CHOL`\n            2.5 %    97.5 %\nHI_CHOL 0.1005983 0.1236876\n\n$`Sum of HI_CHOL`\n HI_CHOL \n28635245 \n\n$`SE of Sum HI_CHOL`\n        HI_CHOL\nHI_CHOL 2020711\n\n$`CL of Sum HI_CHOL`\n           2.5 %   97.5 %\nHI_CHOL 24351530 32918961\n\n$`Ratio of HI_CHOL / RIAGENDR`\nHI_CHOL/RIAGENDR \n      0.07422209 \n\n$`SE of Ratio HI_CHOL / RIAGENDR`\nHI_CHOL/RIAGENDR \n     0.003714728 \n\n$`CL of Ratio HI_CHOL / RIAGENDR`\n                      2.5 %     97.5 %\nHI_CHOL/RIAGENDR 0.06634722 0.08209696\n\n$`Proportion of AGECAT`\n  agecat(0,19]  agecat(19,39]  agecat(39,59] agecat(59,Inf] \n     0.2077495      0.2934079      0.3032896      0.1955530 \n\n$`SE of Proportion AGECAT`\n  agecat(0,19]  agecat(19,39]  agecat(39,59] agecat(59,Inf] \n   0.006129950    0.009560692    0.004519463    0.008092578 \n\n$`CL of Proportion AGECAT`\n                   2.5 %    97.5 %\nagecat(0,19]   0.1947546 0.2207444\nagecat(19,39]  0.2731401 0.3136756\nagecat(39,59]  0.2937088 0.3128704\nagecat(59,Inf] 0.1783975 0.2127085\n\n$`Quantiles of HI_CHOL`\nHI_CHOL.0.025   HI_CHOL.0.5 HI_CHOL.0.975 \n            0             0             1 \n\n$`SE of Quantiles HI_CHOL`\nHI_CHOL.0.025   HI_CHOL.0.5 HI_CHOL.0.975 \n    0.2358596     0.2358596     0.0000000 \n\n$`CL of Quantiles HI_CHOL`\n              l u\nHI_CHOL.0.025 0 1\nHI_CHOL.0.5   0 1\nHI_CHOL.0.975 1 1\n\n$`Mean of HI_CHOL by race`\n         1          2          3          4 \n0.10149167 0.12164921 0.07864006 0.09967861 \n\n$`SE of HI_CHOL by race`\n[1] 0.006245843 0.006604134 0.010384645 0.024666227\n\n$`CL of HI_CHOL by race`\n       2.5 %    97.5 %\n1 0.08825107 0.1147323\n2 0.10764907 0.1356493\n3 0.05662560 0.1006545\n4 0.04738854 0.1519687\n\n$`Design Effect of HI_CHOL by race`\n[1] 1.082734 1.407822 2.091156 3.098290"
    +    "objectID": "SAS/ci_for_prop.html#reference",
    +    "href": "SAS/ci_for_prop.html#reference",
    +    "title": "Confidence intervals for Proportions in SAS",
    +    "section": "Reference",
    +    "text": "Reference\n\nFive Confidence Intervals for Proportions That You Should Know about\nConfidence intervals for Binomial Proportion Using SAS\nSAS PROC FREQ here and here\nClopper,C.J.,and Pearson,E.S.(1934),“The Use of Confidence or Fiducial Limits Illustrated in the Case of the Binomial”, Biometrika 26, 404–413.\nKlaschka, J. and Reiczigel, J. (2021). “On matching confidence intervals and tests for some discrete distributions: Methodological and computational aspects,” Computational Statistics, 36, 1775–1790.\nBlaker, H. (2000). Confidence curves and improved exact confidence intervals for discrete distribu\u0002tions, Canadian Journal of Statistics 28 (4), 783–798\nD. Altman, D. Machin, T. Bryant, M. Gardner (eds). Statistics with Confidence: Confidence Intervals and Statistical Guidelines, 2nd edition. John Wiley and Sons 2000.\nhttps://www.lexjansen.com/wuss/2016/127_Final_Paper_PDF.pdf"
       },
       {
    -    "objectID": "Comp/r-sas-python_survey-stats-summary.html#sas",
    -    "href": "Comp/r-sas-python_survey-stats-summary.html#sas",
    -    "title": "R vs SAS vs Python Survey Summary Statistics",
    -    "section": "SAS",
    -    "text": "SAS\n* Mean, sum quantile of HI_CHOL;\nproc surveymeans data=nhanes mean sum clm quantile=(0.025 0.5 0.975);\n    cluster SDMVPSU;\n    strata SDMVSTRA;\n    weight WTMEC2YR;\n    var HI_CHOL;\nrun;\n\n* Ratio of HI_CHOL / RIAGENDR;\nproc surveymeans data=nhanes;\n    cluster SDMVPSU;\n    strata SDMVSTRA;\n    weight WTMEC2YR;\n    ratio HI_CHOL / RIAGENDR;\nrun;\n\n* Proportions of agecat;\nproc surveyfreq data=nhanes;\n    cluster SDMVPSU;\n    strata SDMVSTRA;\n    weight WTMEC2YR;\n    table agecat / cl;\nrun;\n\n* Mean and DEFF of HI_CHOL by race;\nproc surveymeans data=nhanes mean deff;\n    cluster SDMVPSU;\n    strata SDMVSTRA;\n    weight WTMEC2YR;\n    domain race;\n    var HI_CHOL;\nrun;\n\n                                                 The SURVEYMEANS Procedure\n\n                                                        Data Summary\n\n                                            Number of Strata                  15\n                                            Number of Clusters                31\n                                            Number of Observations          8591\n                                            Sum of Weights             276536446\n\n\n                                                         Statistics\n\n                                Std Error                                                Std Error\n Variable            Mean         of Mean       95% CL for Mean                Sum          of Sum        95% CL for Sum\n --------------------------------------------------------------------------------------------------------------------------\n HI_CHOL         0.112143        0.005446    0.10059829 0.12368762        28635245         2020711    24351529.8 32918960.7\n --------------------------------------------------------------------------------------------------------------------------\n\n\n                                                         Quantiles\n\n                                                                          Std\n                     Variable       Percentile       Estimate           Error    95% Confidence Limits\n                     ---------------------------------------------------------------------------------\n                     HI_CHOL          2.5                   0        0.024281    -0.0514730 0.05147298\n                                       50 Median            0        0.024281    -0.0514730 0.05147298\n                                     97.5            0.777070        0.024281     0.7255973 0.82854324\n                     ---------------------------------------------------------------------------------\n\n                                                 The SURVEYMEANS Procedure\n\n                                                        Data Summary\n\n                                            Number of Strata                  15\n                                            Number of Clusters                31\n                                            Number of Observations          8591\n                                            Sum of Weights             276536446\n\n\n                                                        Statistics\n\n                                                                    Std Error\n                     Variable               N            Mean         of Mean       95% CL for Mean\n                     ---------------------------------------------------------------------------------\n                     HI_CHOL             7846        0.112143        0.005446    0.10059829 0.12368762\n                     RIAGENDR            8591        1.512019        0.005302    1.50077977 1.52325807\n                     ---------------------------------------------------------------------------------\n\n\n                                                       Ratio Analysis\n\n                                                                              Std\n               Numerator Denominator            N           Ratio           Error        95% CL for Ratio\n               ----------------------------------------------------------------------------------------------\n               HI_CHOL   RIAGENDR            7846        0.074222        0.003715    0.06634722    0.08209696\n               ----------------------------------------------------------------------------------------------\n\n                                                  The SURVEYFREQ Procedure\n\n                                                        Data Summary\n\n                                            Number of Strata                  15\n                                            Number of Clusters                31\n                                            Number of Observations          8591\n                                            Sum of Weights             276536446\n\n\n                                                      Table of agecat\n\n                                        Weighted    Std Err of                Std Err of    95% Confidence Limits\n          agecat         Frequency     Frequency      Wgt Freq     Percent       Percent         for Percent\n          -------------------------------------------------------------------------------------------------------\n          (0,19]              2532      57450307       3043819     20.7749        0.6130     19.4755      22.0744\n          (19,39]             2033      81137975       3692818     29.3408        0.9561     27.3140      31.3676\n          (39,59]             2021      83870623       4853936     30.3290        0.4519     29.3709      31.2870\n          (59,Inf]            2005      54077541       4284296     19.5553        0.8093     17.8398      21.2709\n\n          Total               8591     276536446      13935730    100.0000                                       \n          -------------------------------------------------------------------------------------------------------\n\n                                                 The SURVEYMEANS Procedure\n\n                                                        Data Summary\n\n                                            Number of Strata                  15\n                                            Number of Clusters                31\n                                            Number of Observations          8591\n                                            Sum of Weights             276536446\n\n\n                                                         Statistics\n\n                                                                 Std Error          Design\n                                  Variable            Mean         of Mean          Effect\n                                  --------------------------------------------------------\n                                  HI_CHOL         0.112143        0.005446        2.336725\n                                  --------------------------------------------------------\n\n                                                 The SURVEYMEANS Procedure\n\n                                                 Statistics for race Domains\n\n                                                                         Std Error          Design\n                                  race    Variable            Mean         of Mean          Effect\n                          ------------------------------------------------------------------------\n                                     1    HI_CHOL         0.101492        0.006246        1.082734\n                                     2    HI_CHOL         0.121649        0.006604        1.407822\n                                     3    HI_CHOL         0.078640        0.010385        2.091156\n                                     4    HI_CHOL         0.099679        0.024666        3.098290\n                          ------------------------------------------------------------------------"
    +    "objectID": "SAS/cmh.html",
    +    "href": "SAS/cmh.html",
    +    "title": "CMH Test",
    +    "section": "",
    +    "text": "The CMH procedure tests for conditional independence in partial contingency tables for a 2 x 2 x K design. However, it can be generalized to tables of X x Y x K dimensions.\n\n\nThe cmh test is calculated in SAS using the PROC FREQ procedure. By default, it outputs the chi square statistic, degrees of freedom and p-value for each of the three alternative hypothesis: general association, row means differ, and nonzero correlation. It is up to the statistical analyst or statistician to know which result is appropriate for their analysis.\nWhen the design of the contingency table is 2 x 2 x K (i.e, X == 2 levels, Y == 2 levels, K >= 2 levels), the Mantel-Haenszel Common Odds Ratio (odds ratio estimate, 95% CI, P-value) and the Breslow-Day Test for Homogeneity of the Odds Ratios (chi-square statistic, degrees of freedom, P-value) are also output.\nBelow is the syntax to conduct a CMH analysis in SAS:\n\nProc freq data = filtered_data; \ntables K * X * Y / cmh; \n* the order of K, X, and Y appearing on the line is important!;\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas-python_survey-stats-summary.html#python",
    -    "href": "Comp/r-sas-python_survey-stats-summary.html#python",
    -    "title": "R vs SAS vs Python Survey Summary Statistics",
    -    "section": "Python",
    -    "text": "Python\n\nimport pandas as pd\nfrom samplics import TaylorEstimator\nfrom samplics.utils.types import PopParam\n\nnhanes = pd.read_csv(\"../data/nhanes.csv\")\n\nnhanes_design_kwargs = dict(\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    remove_nan=True,\n)\n\n# Mean of HI_CHOL\nmean_estimator = TaylorEstimator(PopParam.mean)\nmean_estimator.estimate(nhanes[\"HI_CHOL\"], **nhanes_design_kwargs)\nhi_chol_means = mean_estimator.to_dataframe()\n\n# Sum of HI_CHOL\ntotal_estimator = TaylorEstimator(PopParam.total)\ntotal_estimator.estimate(nhanes[\"HI_CHOL\"], **nhanes_design_kwargs)\nhi_chol_totals = total_estimator.to_dataframe()\n\n# Ratio of HI_CHOL / RIAGENDR\nratio_estimator = TaylorEstimator(PopParam.ratio)\nratio_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"], x=nhanes[\"RIAGENDR\"], **nhanes_design_kwargs\n)\nhi_chol_ratio = ratio_estimator.to_dataframe()\n\n# Proportion of different AGECAT values\nprop_estimator = TaylorEstimator(PopParam.prop)\nprop_estimator.estimate(nhanes[\"agecat\"], **nhanes_design_kwargs)\nagecat_prop = prop_estimator.to_dataframe()\n\n# Quantiles of HI_CHOL\n# NA\n\n# Domain analysis of mean of HI_CHOL by race, with design effect\nmean_estimator = TaylorEstimator(PopParam.mean)\nmean_estimator.estimate(\n    nhanes[\"HI_CHOL\"],\n    **nhanes_design_kwargs,\n    domain=nhanes[\"race\"],\n    deff=True,  # Design effect param currently has no effect\n)\nhi_chol_domain_means = mean_estimator.to_dataframe()\n\n\nag_dict = agecat_prop.set_index(\"_level\").to_dict()\nhc_dict = hi_chol_domain_means.set_index(\"_domain\").to_dict()\n\nprint(\n    f\"\"\"\n    Mean of HI_CHOL: {hi_chol_means[\"_estimate\"][0]}\n    SE of Mean HI_CHOL: {hi_chol_means[\"_stderror\"][0]}\n    CL of Mean HI_CHOL: {(hi_chol_means[\"_lci\"][0], hi_chol_means[\"_uci\"][0])}\n    Sum of HI_CHOL: {hi_chol_totals[\"_estimate\"][0]}\n    SE of Sum HI_CHOL: {hi_chol_totals[\"_stderror\"][0]}\n    CL of Sum HI_CHOL: {(hi_chol_totals[\"_lci\"][0], hi_chol_totals[\"_uci\"][0])}\n    Ratio of HI_CHOL / RIAGENDR: {hi_chol_ratio[\"_estimate\"][0]}\n    SE of Ratio HI_CHOL / RIAGENDR: {hi_chol_ratio[\"_stderror\"][0]}\n    CL of Ratio HI_CHOL / RIAGENDR: {(hi_chol_ratio[\"_lci\"][0], hi_chol_ratio[\"_uci\"][0])}\n    Proportion of AGECAT: {ag_dict[\"_estimate\"]}\n    SE of Proportion AGECAT: {ag_dict[\"_stderror\"]}\n    LCL of Proportion AGECAT: {ag_dict[\"_lci\"]}\n    UCL of Proportion AGECAT: {ag_dict[\"_uci\"]}\n    Quantiles of HI_CHOL: Not available\n    Mean of HI_CHOL by race: {hc_dict[\"_estimate\"]}\n    SE of HI_CHL by race: {hc_dict[\"_stderror\"]}\n    LCL of HI_CHOL by race: {hc_dict[\"_lci\"]}\n    UCL of HI_CHOL by race: {hc_dict[\"_uci\"]}\n    Design Effect of HI_CHOL by race: Not available\n    \"\"\"\n)\n\n\n    Mean of HI_CHOL: 0.11214295634969222\n    SE of Mean HI_CHOL: 0.005445839698954557\n    CL of Mean HI_CHOL: (np.float64(0.1005982919131703), np.float64(0.12368762078621415))\n    Sum of HI_CHOL: 28635245.254672\n    SE of Sum HI_CHOL: 2020710.7436996205\n    CL of Sum HI_CHOL: (np.float64(24351529.84091034), np.float64(32918960.668433655))\n    Ratio of HI_CHOL / RIAGENDR: 0.07422209323594066\n    SE of Ratio HI_CHOL / RIAGENDR: 0.0037147278931070065\n    CL of Ratio HI_CHOL / RIAGENDR: (np.float64(0.06634722189017901), np.float64(0.0820969645817023))\n    Proportion of AGECAT: {'(0,19]': 0.2077494937870972, '(19,39]': 0.29340788818591346, '(39,59]': 0.30328958320385285, '(59,Inf]': 0.19555303482313666}\n    SE of Proportion AGECAT: {'(0,19]': 0.006129950336419631, '(19,39]': 0.009560691634608896, '(39,59]': 0.004519462827363183, '(59,Inf]': 0.008092578243976422}\n    LCL of Proportion AGECAT: {'(0,19]': 0.19505410930097866, '(19,39]': 0.27355685874096586, '(39,59]': 0.2937950591158628, '(59,Inf]': 0.1789647230500222}\n    UCL of Proportion AGECAT: {'(0,19]': 0.2210442684297426, '(19,39]': 0.3140766293472951, '(39,59]': 0.31295496708023285, '(59,Inf]': 0.21327950895208636}\n    Quantiles of HI_CHOL: Not available\n    Mean of HI_CHOL by race: {1: 0.10149166545397208, 2: 0.12164920535593333, 3: 0.07864006039908408, 4: 0.09967860947712034}\n    SE of HI_CHL by race: {1: 0.006245843308749599, 2: 0.006604133623532979, 3: 0.010384645000548863, 4: 0.024666226871851268}\n    LCL of HI_CHOL by race: {1: 0.0882510691256497, 2: 0.10764906749064211, 3: 0.056625596431891564, 4: 0.04738854441969514}\n    UCL of HI_CHOL by race: {1: 0.11473226178229445, 2: 0.13564934322122454, 3: 0.1006545243662766, 4: 0.15196867453454554}\n    Design Effect of HI_CHOL by race: Not available"
    +    "objectID": "SAS/cmh.html#cmh-in-sas",
    +    "href": "SAS/cmh.html#cmh-in-sas",
    +    "title": "CMH Test",
    +    "section": "",
    +    "text": "The cmh test is calculated in SAS using the PROC FREQ procedure. By default, it outputs the chi square statistic, degrees of freedom and p-value for each of the three alternative hypothesis: general association, row means differ, and nonzero correlation. It is up to the statistical analyst or statistician to know which result is appropriate for their analysis.\nWhen the design of the contingency table is 2 x 2 x K (i.e, X == 2 levels, Y == 2 levels, K >= 2 levels), the Mantel-Haenszel Common Odds Ratio (odds ratio estimate, 95% CI, P-value) and the Breslow-Day Test for Homogeneity of the Odds Ratios (chi-square statistic, degrees of freedom, P-value) are also output.\nBelow is the syntax to conduct a CMH analysis in SAS:\n\nProc freq data = filtered_data; \ntables K * X * Y / cmh; \n* the order of K, X, and Y appearing on the line is important!;\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas-python_survey-stats-summary.html#quantiles",
    -    "href": "Comp/r-sas-python_survey-stats-summary.html#quantiles",
    -    "title": "R vs SAS vs Python Survey Summary Statistics",
    -    "section": "Quantiles",
    -    "text": "Quantiles\nsamplics in Python does not have a method for calculating quantiles, and in R and SAS the available methods lead to different results. To demonstrate the differences in calculating quantiles, we will use the apisrs dataset from the survey package in R (“API Data Files” 2006).\n\nlibrary(survey)\n\ndata(\"api\")\n\nhead(apisrs) |> gt::gt()\n\n\n\n\n\n\n\ncds\nstype\nname\nsname\nsnum\ndname\ndnum\ncname\ncnum\nflag\npcttest\napi00\napi99\ntarget\ngrowth\nsch.wide\ncomp.imp\nboth\nawards\nmeals\nell\nyr.rnd\nmobility\nacs.k3\nacs.46\nacs.core\npct.resp\nnot.hsg\nhsg\nsome.col\ncol.grad\ngrad.sch\navg.ed\nfull\nemer\nenroll\napi.stu\npw\nfpc\n\n\n\n\n15739081534155\nH\nMcFarland High\nMcFarland High\n1039\nMcFarland Unified\n432\nKern\n14\nNA\n98\n462\n448\n18\n14\nNo\nYes\nNo\nNo\n44\n31\nNA\n6\nNA\nNA\n24\n82\n44\n34\n12\n7\n3\n1.91\n71\n35\n477\n429\n30.97\n6194\n\n\n19642126066716\nE\nStowers (Cecil\nStowers (Cecil B.) Elementary\n1124\nABC Unified\n1\nLos Angeles\n18\nNA\n100\n878\n831\nNA\n47\nYes\nYes\nYes\nYes\n8\n25\nNA\n15\n19\n30\nNA\n97\n4\n10\n23\n43\n21\n3.66\n90\n10\n478\n420\n30.97\n6194\n\n\n30664493030640\nH\nBrea-Olinda Hig\nBrea-Olinda High\n2868\nBrea-Olinda Unified\n79\nOrange\n29\nNA\n98\n734\n742\n3\n-8\nNo\nNo\nNo\nNo\n10\n10\nNA\n7\nNA\nNA\n28\n95\n5\n9\n21\n41\n24\n3.71\n83\n18\n1410\n1287\n30.97\n6194\n\n\n19644516012744\nE\nAlameda Element\nAlameda Elementary\n1273\nDowney Unified\n187\nLos Angeles\n18\nNA\n99\n772\n657\n7\n115\nYes\nYes\nYes\nYes\n70\n25\nNA\n23\n23\nNA\nNA\n100\n37\n40\n14\n8\n1\n1.96\n85\n18\n342\n291\n30.97\n6194\n\n\n40688096043293\nE\nSunnyside Eleme\nSunnyside Elementary\n4926\nSan Luis Coastal Unified\n640\nSan Luis Obispo\n39\nNA\n99\n739\n719\n4\n20\nYes\nYes\nYes\nYes\n43\n12\nNA\n12\n20\n29\nNA\n91\n8\n21\n27\n34\n10\n3.17\n100\n0\n217\n189\n30.97\n6194\n\n\n19734456014278\nE\nLos Molinos Ele\nLos Molinos Elementary\n2463\nHacienda la Puente Unif\n284\nLos Angeles\n18\nNA\n93\n835\n822\nNA\n13\nYes\nYes\nYes\nNo\n16\n19\nNA\n13\n19\n29\nNA\n71\n1\n8\n20\n38\n34\n3.96\n75\n20\n258\n211\n30.97\n6194\n\n\n\n\n\n\n\nIn SAS, PROC SURVEYMEANS will calculate quantiles of specific probabilities as you request them, using Woodruff’s method for intervals and a custom quantile method (SAS/STAT® 15.1 User’s Guide 2018, 9834). The quantile method does not match any of the available qrules in R, and although the default interval.types in the R survey::svyquantile function also uses Woodruff’s method, it is a different implementation.\nThe method and results from SAS are as follows:\nproc surveymeans data=apisrs total=6194 quantile=(0.025 0.5 0.975);\n    var growth;\nrun;\n                             The SURVEYMEANS Procedure\n\n                                    Data Summary\n\n                        Number of Observations           200\n\n\n\n\n                                     Quantiles\n\n                                                      Std\n Variable       Percentile       Estimate           Error    95% Confidence Limits\n ---------------------------------------------------------------------------------\n growth           2.5          -16.500000        1.755916    -19.962591 -13.037409\n                   50 Median    26.500000        1.924351     22.705263  30.294737\n                 97.5           99.000000       16.133827     67.184794 130.815206\n ---------------------------------------------------------------------------------\nIf in R we use the default qrule=\"math\" (equivalent to qrule=\"hf1\" and matches type=1 in the quantile function for unweighted data) along with the default interval.type=\"mean\", we get the following results:\n\nsrs_design <- svydesign(data = apisrs,id = ~1,fpc = ~fpc,)\n\nsvyquantile(\n  ~growth,\n  srs_design,\n  quantiles = c(0.025, 0.5, 0.975),\n  ci=TRUE,\n  se=TRUE\n)\n\n$growth\n      quantile ci.2.5 ci.97.5        se\n0.025      -16    -21     -12  2.281998\n0.5         27     24      31  1.774887\n0.975       99     84     189 26.623305\n\nattr(,\"hasci\")\n[1] TRUE\nattr(,\"class\")\n[1] \"newsvyquantile\"\n\n\nHere we can see that the quantiles, confidence intervals, and standard errors do not match SAS. From testing, none of the available qrule methods match SAS for the quantile values, so it is recommended to use the default values unless you have need of some of the other properties of different quantile definitions - see vignette(\"qrule\", package=\"survey\") for more detail. If an exact match to SAS is required, then the svyquantile function allows for passing a custom function to the qrule argument to define your own method for calculating quantiles. Below is an example that will match SAS:\n\nsas_qrule <- function(x, w, p) {\n  # Custom qrule to match SAS, based on survey::oldsvyquantile's internal method\n  if (any(is.na(x))) \n    return(NA * p)\n  w <- rowsum(w, x, reorder = TRUE)\n  x <- sort(unique(x))\n  cum.w <- cumsum(w)/sum(w)\n  cdf <- approxfun(cum.w, x, method = \"linear\", f = 1, \n    yleft = min(x), yright = max(x), ties = min)\n  cdf(p)\n}\n\n\nsas_quants <- svyquantile(\n  ~growth,\n  srs_design,\n  quantiles = c(0.025, 0.5, 0.975),\n  qrule=sas_qrule,\n  ci=TRUE,\n  se=TRUE\n)\n\nsas_quants\n\n$growth\n      quantile    ci.2.5   ci.97.5        se\n0.025    -16.5 -22.00000 -15.07482  1.755916\n0.5       26.5  23.03563  30.62510  1.924351\n0.975     99.0  83.70616 147.33657 16.133827\n\nattr(,\"hasci\")\n[1] TRUE\nattr(,\"class\")\n[1] \"newsvyquantile\"\n\n\nNote that although the quantiles and standard errors match, the confidence intervals still do not match SAS. For this another custom calculation is required, based on the formula used in SAS:\n\nsas_quantile_confint <- function(newsvyquantile, level=0.05, df=Inf) {\n  q <- coef(newsvyquantile)\n  se <- SE(newsvyquantile)\n  ci <- cbind(\n    q,\n    q + se * qt(level/2, df),\n    q - se * qt(1 - level/2, df),\n    se\n  )\n  colnames(ci) <- c(\"quantile\", paste0(\"ci.\", c(100 * level / 2, 100 * (1 - level / 2))), \"se\")\n\n  ci\n}\n\nsas_quantile_confint(sas_quants, df=degf(srs_design))\n\n             quantile    ci.2.5   ci.97.5        se\ngrowth.0.025    -16.5 -19.96259 -19.96259  1.755916\ngrowth.0.5       26.5  22.70526  22.70526  1.924351\ngrowth.0.975     99.0  67.18479  67.18479 16.133827"
    +    "objectID": "SAS/association.html",
    +    "href": "SAS/association.html",
    +    "title": "Association Analysis for Count Data Using SAS",
    +    "section": "",
    +    "text": "In SAS, association analysis methods for count data/contingency tables is typically performed using the PROC FREQ procedure. This procedure has options for Chi-Square and Fisher’s Exact tests."
       },
       {
    -    "objectID": "Comp/r-sas-python_survey-stats-summary.html#other-considerations",
    -    "href": "Comp/r-sas-python_survey-stats-summary.html#other-considerations",
    -    "title": "R vs SAS vs Python Survey Summary Statistics",
    -    "section": "Other considerations",
    -    "text": "Other considerations\n\nDegrees of Freedom\nSome of the functions in R require the degrees of freedom to be specified when calculating confidence intervals, otherwise it assumes a normal distribution. This can be done easily by using the survey::degf function, which calculates the degrees of freedom for a survey design object.\n\n\nSingle PSU Strata\nAlthough it was not apparent with the examples used here, if there is only one PSU from a stratum then R will by default error, whereas SAS will remove that stratum from the variance calculation. This can be changed in R by setting the options(survey.lonely.psu=\"certainty\") to match SAS and have it make no contribution to the variance. In samplics, this behaviour can be configured using the single_psu argument to the estimate method, and can be set to to match SAS using SinglePSUEst.certainty. This should be considered carefully however, in R and Python there are additional methods of handling single PSUs that may be more appropriate for your use-case.\n\n\nDocumentation Differences\nOne key consideration when choosing a statistical package is the documentation available. In this case, both the survey package in R and the survey procedures in SAS have a much more comprehensive set of documentation and examples than samplics in Python. This includes both detailed examples, as well as the underlying theory and methods used in the calculations including references to the literature."
    +    "objectID": "SAS/association.html#tests-of-association",
    +    "href": "SAS/association.html#tests-of-association",
    +    "title": "Association Analysis for Count Data Using SAS",
    +    "section": "Tests of Association",
    +    "text": "Tests of Association\nThe following SAS code produces both the Chi-Square and Fisher’s Exact tests of association. Note that the results contain many statistics not produced by the corresponding R function. The relevant sections of the output have been outlined in red.\nproc freq data = test_case;\nweight Count;\ntables treatment * Weight / chisq fisher;\nexact or;\nrun;\nOutput:"
       },
       {
    -    "objectID": "Comp/r-sas_survival_cif.html",
    -    "href": "Comp/r-sas_survival_cif.html",
    -    "title": "R vs SAS - Estimating Cumulative Incidence Functions",
    +    "objectID": "SAS/anova.html",
    +    "href": "SAS/anova.html",
    +    "title": "linear-models",
         "section": "",
    -    "text": "Comparison of R and SAS\nThe following table shows the options available in R and SAS for estimating cumulative incidence functions (CIFs) in a competing risk analysis, especially the capabilities and whether the results match.\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R package tidycmprsk\nSupported in SAS PROC LIFETEST\nResults Match\n\n\n\n\nCIF estimates\nYes: with function cuminc()\nYes: with eventcode option in TIME statement\nYes\n\n\nGray’s test for equality across groups\nYes: default when the group variable (a factor) is on the right-hand side of the input formula\nYes: default with strata statement\nYes\n\n\nVariance estimates for the CIF estimates using Aalen (1978)\nYes: default\nYes (default)\nYes\n\n\nVariance estimates for the CIF estimates using the delta method\nNo\nYes: with option error=delta in PROC TEST statement\nN/A\n\n\nConfidence intervals for CIF estimates using log-log transformation\nYes: default\nYes: default\nYes\n\n\nConfidence intervals for CIF estimates using other transformations\nNo\nYes: with conftype option in LIFETEST statement\nN/A\n\n\nCIF estimates for specified time points\nYes: with times option when summarizing results, e.g., using tidy()\nYes: with timelist option in LIFETEST statement\nYes\n\n\nCIF plot by groups\nYes: with ggsurvfit::ggcumin()\nYes: with plots=cif option in LIFETEST statement\nN/A\n\n\n\nAdditional details for using tidycmprsk are given here and for SAS PROC LIFETEST here .\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 22.04.5 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-10\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n package    * version date (UTC) lib source\n cmprsk       2.2-12  2024-05-19 [1] RSPM (R 4.4.0)\n survival     3.7-0   2024-06-05 [1] RSPM (R 4.4.0)\n tidycmprsk   1.1.0   2024-08-17 [1] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n─ External software ──────────────────────────────────────────────────────────\n setting value\n SAS     9.04.01M7P080520\n\n──────────────────────────────────────────────────────────────────────────────\n\n\n\n\n\n\n\nReferences\nSAS PROC LIFETEST Documentation on CIF estimates\nR package ‘tidycmprsk’ Documentation"
    +    "text": "Getting Started\nTo demonstrate the various types of sums of squares, we’ll create a data frame called df_disease taken from the SAS documentation.\n\n\nThe Model\nFor this example, we’re testing for a significant difference in stem_length using ANOVA.\n\nproc glm;\n   class drug disease;\n   model y=drug disease drug*disease;\nrun;\n\n\n\nSums of Squares Tables\nSAS has four types of sums of squares calculations. To get these calculations, the sum of squares option needs to be added (/ ss1 ss2 ss3 ss4) to the model statement.\n\nproc glm;\n   class drug disease;\n   model y=drug disease drug*disease / ss1 ss2 ss3 ss4;\nrun;\n\n\nType I\n\n\n\n\n\n\n\n\n\n\n\nType II\n\n\n\n\n\n\n\n\n\n\n\nType III\n\n\n\n\n\n\n\n\n\n\n\nType IV"
       },
       {
    -    "objectID": "Comp/r-sas_summary_skew_kurt.html",
    -    "href": "Comp/r-sas_summary_skew_kurt.html",
    -    "title": "R vs SAS Skewness/Kurtosis",
    +    "objectID": "SAS/mi_mar_regression.html",
    +    "href": "SAS/mi_mar_regression.html",
    +    "title": "Multiple Imputaton: Linear Regression in SAS",
         "section": "",
    -    "text": "The following table shows the types of Skewness, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nSkewness, Type 1\nYes\nYes\nYes\nIn e1071, use type = 1.In SAS use vardef = N.\n\n\nSkewness, Type 2\nYes\nYes\nYes\nIn e1071, use type = 2.In SAS use vardef = DF.procs and sasLM use defaults.\n\n\nSkewness, Type 3\nYes\nNo\nNA\nIn e1071, use type = 3.Not supported in SAS.\n\n\n\nNote that the SAS default is Type 2."
    +    "text": "Prepare a subset of the analysis dummy dataset, details as below:\n\n\nUSUBJID (length 4): Subject ID.\nSEX1N: Sex A random integer between 0 and 1 representing a binary variable (perhaps gender).\nAVISITN: Visit number (1 to 5 for each subject).\nAVAL: A random value between 1 and 2, with a random 10% chance of being missing.\n\nAs PROC MI requires a horizontal, one record per subject data set. More often than not, the data we impute will come from a vertical ADaM BDS data set. So we need to first transpose the aval with the avisitn as ID (assuming avisitn = 1 to 5),creating transposed variable v1-v5.\n\ndata dummy;\n    length USUBJID $4;\n    do i=1 to 10;\n            sex1n=int(ranuni(0)*2);\n        do j=1 to 5;\n            USUBJID=strip(put(1000+i,best.));\n            AVISITN=j;\n            AVAL=round(1+ranuni(0),0.01);\n            if ranuni(0) <0.1 then aval=.;\n            output;\n        end;\n    end;\n    drop i j;\nrun;\nproc sort data=dummy; by usubjid sex1n;run;\nproc transpose data=dummy out=dummyt(drop=_name_) prefix=v;\n    by USUBJID sex1n;\n    id avisitn;\n    var aval;\nrun;\nproc print data=dummyt(obs=5);\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas_summary_skew_kurt.html#comparison-results",
    -    "href": "Comp/r-sas_summary_skew_kurt.html#comparison-results",
    -    "title": "R vs SAS Skewness/Kurtosis",
    -    "section": "Comparison Results",
    -    "text": "Comparison Results\n\nSkewness\nHere is a table of Skewness comparison values between the four R packages examined and SAS:\n\n\n\n\n\n\n\n\n\n\n\n\n\nStatistic\ne1071\nmoments\nprocs\nsasLM\nSAS\nMatch\nNotes\n\n\n\n\nSkewness, Type 1\n0.9054442\n0.9054442\nNA\nNA\n0.9054442\nYes\n\n\n\nSkewness, Type 2\n1.009318\nNA\n1.009318\n1.009318\n1.0093179\nYes\n\n\n\nSkewness, Type 3\n0.8164261\nNA\nNA\nNA\nNA\nNA\nType 3 not supported in SAS\n\n\n\n\n\nKurtosis\nHere is a table of Kurtosis comparison values between the four R packages examined and SAS:\n\n\n\n\n\n\n\n\n\n\n\n\n\nStatistic\ne1071\nmoments\nprocs\nsasLM\nSAS\nMatch\nNotes\n\n\n\n\nKurtosis, Type 1\n-0.5833411\nNA\nNA\nNA\n-0.5833411\nYes\n\n\n\nKurtosis, Type 2\n-0.2991564\nNA\n-0.2991564\n-0.2991564\n-0.2991564\nYes\n\n\n\nKurtosis, Type 3\n-0.8948216\nNA\nNA\nNA\nNA\nNA\nType 3 not supported in SAS\n\n\nKurtosis, Pearson’s\nNA\n2.416659\nNA\nNA\nNA\nNA\nPearson’s not supported in SAS"
    +    "objectID": "SAS/mi_mar_regression.html#input-dataset-preparation-before-multiple-imputation",
    +    "href": "SAS/mi_mar_regression.html#input-dataset-preparation-before-multiple-imputation",
    +    "title": "Multiple Imputaton: Linear Regression in SAS",
    +    "section": "",
    +    "text": "Prepare a subset of the analysis dummy dataset, details as below:\n\n\nUSUBJID (length 4): Subject ID.\nSEX1N: Sex A random integer between 0 and 1 representing a binary variable (perhaps gender).\nAVISITN: Visit number (1 to 5 for each subject).\nAVAL: A random value between 1 and 2, with a random 10% chance of being missing.\n\nAs PROC MI requires a horizontal, one record per subject data set. More often than not, the data we impute will come from a vertical ADaM BDS data set. So we need to first transpose the aval with the avisitn as ID (assuming avisitn = 1 to 5),creating transposed variable v1-v5.\n\ndata dummy;\n    length USUBJID $4;\n    do i=1 to 10;\n            sex1n=int(ranuni(0)*2);\n        do j=1 to 5;\n            USUBJID=strip(put(1000+i,best.));\n            AVISITN=j;\n            AVAL=round(1+ranuni(0),0.01);\n            if ranuni(0) <0.1 then aval=.;\n            output;\n        end;\n    end;\n    drop i j;\nrun;\nproc sort data=dummy; by usubjid sex1n;run;\nproc transpose data=dummy out=dummyt(drop=_name_) prefix=v;\n    by USUBJID sex1n;\n    id avisitn;\n    var aval;\nrun;\nproc print data=dummyt(obs=5);\nrun;"
       },
       {
    -    "objectID": "Comp/r-sas_mcnemar.html",
    -    "href": "Comp/r-sas_mcnemar.html",
    -    "title": "R v SAS McNemar’s test",
    -    "section": "",
    -    "text": "McNemar’s test; R and SAS\nIn R, the mcNemar function from the epibasix package can be used to perform McNemar’s test.\n\nX<-table(colds$age12,colds$age14)\nsummary(mcNemar(X))\n\nThe FREQ procedure can be used in SAS with the AGREE option to run the McNemar test, with OR, and RISKDIFF options stated for production of odds ratios and risk difference. These options were added as epibasix::mcNemar outputs the odds ratio and risk difference with confidence limits as default. In contrast to R, SAS outputs the Kappa coefficients with confident limits as default.\n\nproc freq data=colds;\n    tables age12*age14 / agree or riskdiff;\nrun;\n\nWhen calculating the odds ratio and risk difference confidence limits, SAS is not treating the data as matched-pairs. There is advice on the SAS blog and SAS support page to amend this, which requires a lot of additional coding.\nR is using Edward’s continuity correction with no option to remove this. In contrast, there is no option to include Edward’s continuity correction in SAS, but this can be manually coded to agree with R. However, its use is controversial due to being seen as overly conservative.\nR’s use of the continuity correction is consistent with other functions within the epibasix package, which was categorised as ‘High Risk’ by the Risk Assessment Shiny App created by the R Validation Hub. Risk is quantified by the app through a number of metrics relating to maintenance and community usage. It was found that the author is no longer maintaining the package and there was no documentation available for certain methods used. Therefore, the use of the epibasix package is advised against and other packages may be more suitable.\nThe mcnemar.test function in the stats package provides the option to remove continuity corrections which results in a match with SAS. This function does not output any other coefficients for agreement/difference in proportions etc. but (if required) these can be achieved within other functions and/or packages.\n\nmcnemar.test(X, correct = FALSE)"
    +    "objectID": "SAS/mi_mar_regression.html#check-missing-data-patterns",
    +    "href": "SAS/mi_mar_regression.html#check-missing-data-patterns",
    +    "title": "Multiple Imputaton: Linear Regression in SAS",
    +    "section": "Check missing data patterns",
    +    "text": "Check missing data patterns\nThe pattern can be checked using the following code, missing data pattern could be classified as “Monotone” or “Arbitrary”\n\n“Monotone” : The missingness of data follows a specific order such that if a certain variable is missing for a particular observation, all subsequent variables are also missing for that observation. If a dataset has columns X1,X2,…,Xk a monotone missing pattern appears when: If Xj is missing, then Xj+1, Xj+2,…,Xj+3 are missing.\n“Arbitrary” : The missingness of data does not follow any specific order or predictable sequence. Data can be missing at random points without a discernible pattern.\n\n\nods select MissPattern;\nproc mi data=dummyt nimpute=0;\nvar v1 - v5;\nrun;\n\nAs below figure shows the missingness dose not follow any specific order, obviously the missing pattern is arbitrary and non-monotone missing pattern."
       },
       {
    -    "objectID": "SAS/summary_skew_kurt.html",
    -    "href": "SAS/summary_skew_kurt.html",
    -    "title": "Skewness/Kurtosis",
    -    "section": "",
    -    "text": "In SAS, Skewness and Kurtosis are usually calculated using PROC MEANS. The procedures can produce both statistics in the same call. The procedure provides options for different methodologies.\n\n\nThe following data was used in this example.\n  data dat;\n      input team $ points assists;\n      datalines;\n  A 10 2\n  A 17 5\n  A 17 6\n  A 18 3\n  A 15 0\n  B 10 2\n  B 14 5\n  B 13 4\n  B 29 0\n  B 25 2\n  C 12 1\n  C 30 1\n  C 34 3\n  C 12 4\n  C 11 7\n  ;\n  run;\n\n\n\nBy default, SAS PROC MEANS uses VARDEF option “DF”. The other options are “N”, “WEIGHT”, and “WDF. Note that the WEIGHT and WDF options produce no results, as weighted calculations are not supported in PROC MEANS for Skewness and Kurtosis.\nThe following shows the SAS documentation for the two measures.\n\n\nThe SAS documentation for Skewness is provided here for convenience:\n\n\n\n\n\n\n\n\n\n\n\n\nThe SAS documentation for Kurtosis is as follows:\n\n\n\n\n\n\n\n\n\n\n\n\nSkewness and Kurtosis are commonly calculated in SAS as follows:\n  proc means data=dat SKEWNESS KURTOSIS;\n  var points;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nThe above results correspond to the Type 2 methodology in R.\n\n\n\nThe N option produces the following results\n  proc means data=dat SKEWNESS KURTOSIS vardef = N;\n  var points;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nThe above results correspond to the Type 1 methodology in R.\n\n\n\n\nSAS options provide for Type 1 and Type 2 Skewness and Kurtosis. Skewness Type 3 and Kurtosis Type 3 are not supported. Also Pearson’s Kurtosis is not supported."
    +    "objectID": "SAS/mi_mar_regression.html#fcs-regression-for-non-monotone-missing-pattern",
    +    "href": "SAS/mi_mar_regression.html#fcs-regression-for-non-monotone-missing-pattern",
    +    "title": "Multiple Imputaton: Linear Regression in SAS",
    +    "section": "FCS Regression for non-monotone missing pattern",
    +    "text": "FCS Regression for non-monotone missing pattern\n\nproc mi data=dummyt out=outdata nimpute=10 seed=123;\n  class sex1n;\n  var sex1n v1 - v5;\n  fcs reg (v1-v5 /details);\nrun;\n\n\nThe VAR statement above listing the variables to be analyzed, should match the statistical models for efficacy analysis per SAP, which may include TRTPN, necessary grouping variable (for eg AGEGR1/AGEGR1N), and all outcome variables coming from repeated assessments\nNIMPUTE : the number of imputations\nSEED : the seed to begin random number generator\nNote that depending on the SAS Proc MI algorithm, if there are more factors, the ordering of factors, for example SEX1N, RACE1N, may have an effect on the generation of the imputed values for the missing values, i.e., different orderings of these factors will generate different imputed values (e.g may happen in case of monotone missing pattern) from PROC MI procedure. The ordering of subjects in the dataset may also have an effect on the generation of the imputed values for the missing values.\nThe CLASS statement specifies the classification variables in the VAR statement.\nFCS is displayed as the method, if not specified then MCMC will be the default method.\nREG is the specified model which in this example is linear regression)\nThe DETAILS option displays the regression coefficients in the regression model used in each imputation."
       },
       {
    -    "objectID": "SAS/summary_skew_kurt.html#sas",
    -    "href": "SAS/summary_skew_kurt.html#sas",
    -    "title": "Skewness/Kurtosis",
    -    "section": "",
    -    "text": "By default, SAS PROC MEANS uses VARDEF option “DF”. The other options are “N”, “WEIGHT”, and “WDF. Note that the WEIGHT and WDF options produce no results, as weighted calculations are not supported in PROC MEANS for Skewness and Kurtosis.\nThe following shows the SAS documentation for the two measures.\n\n\nThe SAS documentation for Skewness is provided here for convenience:\n\n\n\n\n\n\n\n\n\n\n\n\nThe SAS documentation for Kurtosis is as follows:\n\n\n\n\n\n\n\n\n\n\n\n\nSkewness and Kurtosis are commonly calculated in SAS as follows:\n  proc means data=dat SKEWNESS KURTOSIS;\n  var points;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nThe above results correspond to the Type 2 methodology in R.\n\n\n\nThe N option produces the following results\n  proc means data=dat SKEWNESS KURTOSIS vardef = N;\n  var points;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nThe above results correspond to the Type 1 methodology in R."
    +    "objectID": "SAS/mi_mar_regression.html#monotone-regression-for-monotone-missing-pattern",
    +    "href": "SAS/mi_mar_regression.html#monotone-regression-for-monotone-missing-pattern",
    +    "title": "Multiple Imputaton: Linear Regression in SAS",
    +    "section": "Monotone Regression for monotone missing pattern",
    +    "text": "Monotone Regression for monotone missing pattern\nLet’s update above SAS code to generate a dummy dataset with monotone missing pattern\n\ndata dummy;\n    length USUBJID $4;\n    do i=1 to 10; \n        sex1n=int(ranuni(0)*2); \n        USUBJID = strip(put(1000+i, best.));\n        miss_start = ceil(ranuni(0) * 5); /* Randomly decide the start point for missing data (1 to 5) */\n        do j=1 to 5; \n            AVISITN = j;\n            if j >= miss_start then AVAL = .; /* If the visit number is greater than or equal to miss_start, make AVAL missing */\n            else AVAL = round(1 + ranuni(0), 0.01);\n            output; \n        end;\n    end;\n    drop i miss_start j;\nrun;\nproc sort data=dummy; by usubjid sex1n;run;\nproc transpose data=dummy out=dummyt(drop=_name_) prefix=v;\n    by USUBJID sex1n;\n    id avisitn;\n    var aval;\nrun;\nproc print data=dummyt(obs=5);\nrun;\nods select MissPattern;\nproc mi data=dummyt nimpute=0;\nvar v1 - v5;\nrun;\n\n\n\n\n\n\n\n\n\n\nIn this case we will use monotone statement instead of FCS for the imputation, example code as below:\n\nproc mi data=dummyt out=outdata nimpute=10 seed=123;\n  class sex1n;\n  var sex1n v1 - v5;\n  monotone reg (v1-v5 /details);\nrun;"
       },
       {
    -    "objectID": "SAS/summary_skew_kurt.html#summary",
    -    "href": "SAS/summary_skew_kurt.html#summary",
    -    "title": "Skewness/Kurtosis",
    +    "objectID": "SAS/mi_mar_regression.html#reference",
    +    "href": "SAS/mi_mar_regression.html#reference",
    +    "title": "Multiple Imputaton: Linear Regression in SAS",
    +    "section": "Reference",
    +    "text": "Reference\n\nUser’s Guide The MI Procedure\nMultiple Imputation: A Statistical Programming Story\nExamine patterns of missing data in SAS"
    +  },
    +  {
    +    "objectID": "SAS/ttest_2Sample.html",
    +    "href": "SAS/ttest_2Sample.html",
    +    "title": "Independant Two-Sample t-test",
         "section": "",
    -    "text": "SAS options provide for Type 1 and Type 2 Skewness and Kurtosis. Skewness Type 3 and Kurtosis Type 3 are not supported. Also Pearson’s Kurtosis is not supported."
    +    "text": "Data Used\nThe following data was used in this example.\ndata d1;\n  length trt_grp $ 9;\n  input trt_grp $ WtGain @@;\n  datalines;\nplacebo    94 placebo    12 placebo    26 placebo    89 \nplacebo    88 placebo    96 placebo    85 placebo   130 \nplacebo    75 placebo    54 placebo   112 placebo    69 \nplacebo   104 placebo    95 placebo    53 placebo    21 \ntreatment  45 treatment  62 treatment  96 treatment 128 \ntreatment 120 treatment  99 treatment  28 treatment  50 \ntreatment 109 treatment 115 treatment  39 treatment  96 \ntreatment  87 treatment 100 treatment  76 treatment  80 \n;\nrun;\n\n\n\nIndependent Two-Sample t-test in SAS\nThe null hypothesis of the Independent Samples t-test is, the means for the two populations are equal.\nIn SAS the following code was used to test the mean comparison (mean of Weight Gain) of two independent treatment groups (Treatment and Placebo).\nFor this example, we’re testing the significant difference in mean of Weight gain (WtGain) between treatment and placebo (trt_grp) using PROC TTEST procedure in SAS.\n\n  proc ttest data=d1; \n     class trt_grp; \n     var WtGain; \n  run; \n\nOutput:\n             Figure 1: Test results for independent t-test using PROC TTEST in SAS\n\n\n\n\n\n\n\n\n\nHere the t-value is –0.70, degrees of freedom is 30 and P value is 0.4912 which is greater than 0.05, so we accept the null hypothesis that there is no evidence of a significant difference between the means of treatment groups. The mean in placebo group is 75.1875 and mean in Treatment group is 83.1250. The mean difference the treatment groups (Treatment-Placebo) is –7.9375 and the 95% CI for the mean difference is [–31.1984, 15.3234]. The 95% confidence interval includes a treatment difference of 0, which supports the conclusion that the data fail to provide any evidence of a difference between the treatment groups.\nNote: Before entering straight into the t-test we need to check whether the assumptions (like the equality of variance, the observations should be independent, observations should be normally distributed) are met or not. If normality is not satisfied, we may consider using a suitable non-parametric test.\n\nNormality: You can check for data to be normally distributed by plotting a histogram of the data by treatment. Alternatively, you can use the Shapiro-Wilk test or the Kolmogorov-Smirnov test. If the test is <0.05 and your sample is quite small then this suggests you should not use the t-test. However, if your sample in each treatment group is large (say >30 in each group), then you do not need to rely so heavily on the assumption that the data have an underlying normal distribution in order to apply the two-sample t-test. This is where plotting the data using histograms can help to support investigation into the normality assumption. We have checked the normality of the observations using the code below. Here for both the treatment groups we have P value greater than 0.05 (Shapiro-Wilk test is used), therefore the normality assumption is there for our data.\n\n\n    proc univariate data=d1 normal;  \n      qqplot WtGain; \n      by trt_grp; \n    run; \n\nOutput:\n        Figure 2: The results of normality test for Treatment group\n\n\n\n\n\n\n\n\n\n       Figure 3: The results of normality test for Placebo group\n\n\n\n\n\n\n\n\n\n\nHomogeneity of variance (or Equality of variance): Homogeniety of variance will be tested by default in PROC TTEST itself by Folded F-test. In our case the P values is 0.6981 which is greater than 0.05. So we accept the null hypothesis of F-test, i.e. variances are same. Then we will consider the pooled method for t-test. If the F test is statistically significant (p<0.05), then the pooled t-test may give erroneous results. In this instance, if it is believed that the population variances may truly differ, then the Satterthwaite (unequal variances) analysis results should be used. These are provided in the SAS output alongside the Pooled results as default.\n\nOutput:\n                    Figure 4: Folded F-test result in PROC TTEST"
       },
       {
         "objectID": "SAS/jonchkheere_terpstra.html",
    @@ -1302,1907 +1190,2019 @@
         "text": "Reference\n[1] SAS Institute Inc. (n.d.). SAS Help Center. Retrieved August 7, 2024, from https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/statug/statug_freq_details77.htm\n[2] Pennsylvania State University. (n.d.). 11.4 - Safety and Efficacy (Phase II) Studies: Trend Analysis. In STAT 509: Advanced Statistics for the Health Sciences. Retrieved August 7, 2024, from https://online.stat.psu.edu/stat509/lesson/11/11.4\n[3] SAS Institute Inc. (n.d.). FREQ Procedure: Syntax. In SAS/STAT 14.2 User’s Guide. Retrieved August 7, 2024, from https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/statug/statug_freq_syntax08.htm\n[4] Park, C., Hsiung, J.-T., Soohoo, M., & Streja, E. (2019). Choosing Wisely: Using the Appropriate Statistical Test for Trend in SAS\n[5] Bewick V, Cheek L, Ball J. Statistics review 10: Further nonparametric methods. Crit Care. 2004;8(4):R131-R139. doi:10.1186/cc468904. PMCID: PMC468904.PubMed Central."
       },
       {
    -    "objectID": "SAS/ancova.html",
    -    "href": "SAS/ancova.html",
    -    "title": "Ancova",
    -    "section": "",
    -    "text": "ANCOVA in SAS\nIn SAS, there are several ways to perform ANCOVA analysis. One common way is to use PROC GLM with the LSMEANS option. The below example will use this method.\n\nData Used\nThe following data was used in this example.\n  data DrugTest;\n     input Drug $ PreTreatment PostTreatment @@;\n     datalines;\n  A 11  6   A  8  0   A  5  2   A 14  8   A 19 11\n  A  6  4   A 10 13   A  6  1   A 11  8   A  3  0\n  D  6  0   D  6  2   D  7  3   D  8  1   D 18 18\n  D  8  4   D 19 14   D  8  9   D  5  1   D 15  9\n  F 16 13   F 13 10   F 11 18   F  9  5   F 21 23\n  F 16 12   F 12  5   F 12 16   F  7  1   F 12 20\n  ;\n\n\nCode\nThe following code was used to test the effects of a drug pre and post treatment:\n  proc glm data=DrugTest;\n     class Drug;\n     model PostTreatment = Drug PreTreatment / solution;\n     lsmeans Drug / stderr pdiff cov out=adjmeans;\n  run;\n  proc print data=adjmeans;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAs can be seen in the images above, the GLM procedure provides multiple types of analysis to determine the relationship between the dependent and independent variables. The last step produces a table of LSMEANS and coefficient of variation values for each of the three different drugs in the dataset."
    -  },
    -  {
    -    "objectID": "SAS/survival_cif.html",
    -    "href": "SAS/survival_cif.html",
    -    "title": "Estimating Cumulative Incidence Functions Using SAS",
    +    "objectID": "SAS/kruskal_wallis.html",
    +    "href": "SAS/kruskal_wallis.html",
    +    "title": "Kruskal Wallis SAS",
         "section": "",
    -    "text": "In this document we present how to estimate the cumulative incidence function (CIF) in SAS (version 9.4). We focus on the competing risks model where each subject experiences only one out of k possible events as depicted in the figure below.\n\n\n\n\n\n\n\n\n\n\n\nThe bone marrow transplant (BTM) dataset as presented by Guo & So (2018) is used. The dataset has the following variables:\n\nGroup has three levels, indicating three disease groups: ALL, AML-Low Risk, AML-High Risk.\nT is the disease-free survival time in days. A derived variable TYears = T/365.25 is used in the analysis.\nStatus has value 0 if T is censored; 1 if T is time to relapse; 2 if T is time to death.\nWaitTime is the waiting time to transplant in days. This variable is not used here.\nA new variable ID is created.\n\nSAS code to prepare the data:\n\nproc format;\n  value DiseaseGroup 1='ALL'\n                     2='AML-Low Risk'\n                     3='AML-High Risk';\n  value EventStatus  0='Censored'\n                     1='Relapse'\n                     2='Death';\nrun;\nlibname datalib \"..\\data\";\ndata bmt;\n  set datalib.bmt;\n  TYears = T / 365.25;\n  ID = _n_;\n  format Group DiseaseGroup.;\n  format Status EventStatus.;\nrun;"
    +    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of R’s datasets::iris, testing for difference in sepal width between species of flower. This data was subset in R and input manually to SAS with a data step.\n\ndata iris_sub;\n    input Species $ Sepal_Width;\n    datalines;\nsetosa 3.4\nsetosa 3.0\nsetosa 3.4\nsetosa 3.2\nsetosa 3.5\nsetosa 3.1\nversicolor 2.7\nversicolor 2.9\nversicolor 2.7\nversicolor 2.6\nversicolor 2.5\nversicolor 2.5\nvirginica 3.0\nvirginica 3.0\nvirginica 3.1\nvirginica 3.8\nvirginica 2.7\nvirginica 3.3\n;\nrun;"
       },
       {
    -    "objectID": "SAS/survival_cif.html#objective",
    -    "href": "SAS/survival_cif.html#objective",
    -    "title": "Estimating Cumulative Incidence Functions Using SAS",
    +    "objectID": "SAS/kruskal_wallis.html#introduction",
    +    "href": "SAS/kruskal_wallis.html#introduction",
    +    "title": "Kruskal Wallis SAS",
         "section": "",
    -    "text": "In this document we present how to estimate the cumulative incidence function (CIF) in SAS (version 9.4). We focus on the competing risks model where each subject experiences only one out of k possible events as depicted in the figure below.\n\n\n\n\n\n\n\n\n\n\n\nThe bone marrow transplant (BTM) dataset as presented by Guo & So (2018) is used. The dataset has the following variables:\n\nGroup has three levels, indicating three disease groups: ALL, AML-Low Risk, AML-High Risk.\nT is the disease-free survival time in days. A derived variable TYears = T/365.25 is used in the analysis.\nStatus has value 0 if T is censored; 1 if T is time to relapse; 2 if T is time to death.\nWaitTime is the waiting time to transplant in days. This variable is not used here.\nA new variable ID is created.\n\nSAS code to prepare the data:\n\nproc format;\n  value DiseaseGroup 1='ALL'\n                     2='AML-Low Risk'\n                     3='AML-High Risk';\n  value EventStatus  0='Censored'\n                     1='Relapse'\n                     2='Death';\nrun;\nlibname datalib \"..\\data\";\ndata bmt;\n  set datalib.bmt;\n  TYears = T / 365.25;\n  ID = _n_;\n  format Group DiseaseGroup.;\n  format Status EventStatus.;\nrun;"
    +    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of R’s datasets::iris, testing for difference in sepal width between species of flower. This data was subset in R and input manually to SAS with a data step.\n\ndata iris_sub;\n    input Species $ Sepal_Width;\n    datalines;\nsetosa 3.4\nsetosa 3.0\nsetosa 3.4\nsetosa 3.2\nsetosa 3.5\nsetosa 3.1\nversicolor 2.7\nversicolor 2.9\nversicolor 2.7\nversicolor 2.6\nversicolor 2.5\nversicolor 2.5\nvirginica 3.0\nvirginica 3.0\nvirginica 3.1\nvirginica 3.8\nvirginica 2.7\nvirginica 3.3\n;\nrun;"
       },
       {
    -    "objectID": "SAS/survival_cif.html#estimating-cifs-in-sas",
    -    "href": "SAS/survival_cif.html#estimating-cifs-in-sas",
    -    "title": "Estimating Cumulative Incidence Functions Using SAS",
    -    "section": "Estimating CIFs in SAS",
    -    "text": "Estimating CIFs in SAS\nPROC LIFETEST is used to estimate the CIFs in SAS. For illustration, we model the time to relapse.\n\nods graphics on;\nproc lifetest data=bmt \n              plots=cif(test) \n              error=aalen\n              conftype=loglog\n              outcif=cif1 \n              timelist=0.5 1 1.5 2 3; \n  time Tyears * Status(0) / eventcode=1; \n  strata Group / order=internal; \n  format Group DiseaseGroup.;\nrun; \nods graphics off;\n\nBelow are selected outputs for comparison with the R outputs in the companion document.\nCIF estimates for time to relapse at selected timepoints for ‘AML-Low Risk’ patients:\n\n\n\n\n\n\n\n\n\nCIF estimates for time to relapses:\n\n\n\n\n\n\n\n\n\nTwo points to note:\n\nBy default the variance of the estimated CIF are estimated with Aalen’s asymptotic method. This can be changed to the delta method by setting error=delta in the PROC LIFETEST statement.\nBy default the log-log transformation is used to produce the pointwise confidence intervals (CIs) for the estimated CIFs. To select other methods, for instance log, set conftype=log."
    +    "objectID": "SAS/kruskal_wallis.html#implementing-kruskal-wallis-in-sas",
    +    "href": "SAS/kruskal_wallis.html#implementing-kruskal-wallis-in-sas",
    +    "title": "Kruskal Wallis SAS",
    +    "section": "Implementing Kruskal-Wallis in SAS",
    +    "text": "Implementing Kruskal-Wallis in SAS\nThe Kruskal-Wallis test can be implemented in SAS using the NPAR1WAY procedure with WILCOXON option. Below, the test is defined with the indicator variable (Species) by the CLASS statement, and the response variable (Sepal_Width) by the VAR statement. Adding the EXACT statement outputs the exact p-value in addition to the asymptotic result. The null hypothesis is that the samples are from identical populations.\n\nproc npar1way data=iris_sub wilcoxon;\nclass Species;\nvar Sepal_Width;\nexact;\nrun;"
       },
       {
    -    "objectID": "SAS/survival_cif.html#reference",
    -    "href": "SAS/survival_cif.html#reference",
    -    "title": "Estimating Cumulative Incidence Functions Using SAS",
    -    "section": "Reference",
    -    "text": "Reference\nAalen O. (1978). Nonparametric Estimation of Partial Transition Probabilities in Multiple Decrement Models, Annals of Statistics, 6:534-545.\nGray R. (1988). A Class of K-Sample Tests for Comparing the Cumulative Incidence of a Competing Risk, Annals of Statistics, 16:1141-1154.\nGray R. (2024). cmprsk: Subdistribution Analysis of Competing Risks. https://cran.r-project.org/web/packages/cmprsk/cmprsk.pdf\nGuo C and So Y. (2018). Cause-Specific Analysis of Competing Risks Using the PHREG Procedure. In Proceedings of the SAS Global Forum 2018 Conference. Cary, NC: SAS Institute Inc. https://support.sas.com/resources/papers/proceedings18/2159-2018.pdf.\nSAS (2019). Statistical Analysis Software. Users’ Guide Statistics Version 9.4. SAS Institute Inc., Cary."
    +    "objectID": "SAS/kruskal_wallis.html#results",
    +    "href": "SAS/kruskal_wallis.html#results",
    +    "title": "Kruskal Wallis SAS",
    +    "section": "Results",
    +    "text": "Results\n\n\n\n\n\n\n\n\n\nAs seen above, SAS outputs a table of Wilcoxon Scores for Sepal_Width by each Species including (per group): the number (N); the sum of scores; the expected sum of scores under the null hypothesis; the standard deviation under the null hypothesis, and the observed mean score. The table also includes a footnote to specify that ties were handled by using the average score.\nA table of the test results gives the Kruskal-Wallis rank sum statistic (10.922), the degrees of freedom (2), and the asymptotic p-value of the test (0.0042), and the exact p-value (0.0008). Therefore, the difference in population medians is statistically significant at the 5% level."
       },
       {
    -    "objectID": "SAS/ci_for_prop.html",
    -    "href": "SAS/ci_for_prop.html",
    -    "title": "Confidence intervals for Proportions in SAS",
    +    "objectID": "SAS/mcnemar.html",
    +    "href": "SAS/mcnemar.html",
    +    "title": "McNemar’s test in SAS",
         "section": "",
    -    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (e.g 1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (e.g different subjects in each of the 2 groups), or can be matched (e.g the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more information about these methods in R & SAS, including which performs better in different scenarios see Five Confidence Intervals for Proportions That You Should Know about1 and Confidence Intervals for Binomial Proportion Using SAS2"
    +    "text": "Performing McNemar’s test in SAS\nTo demonstrate McNemar’s test in SAS, data concerning the presence or absence of cold symptoms was used. The symptoms were recorded by the same children at the age of 12 and 14. A total of 2638 participants were involved.\n\nUsing PROC FREQ\nTesting for a significant difference in cold symptoms between ages, using McNemar’s test in SAS, can be performed as below. The AGREE option is stated within the FREQ procedure to produce agreement tests and measures, including McNemar’s test.\n\nproc freq data=colds;\n  tables age12*age14 / agree;\nrun;\n\n\n\nResults\n\n\n\n\n\n\n\n\n\nSAS outputs the tabulated data for proportions, the McNemar’s Chi-square statistic, and the Kappa coefficient with 95% confidence limits. There is no continuity correction used and no option to include this."
       },
       {
    -    "objectID": "SAS/ci_for_prop.html#introduction",
    -    "href": "SAS/ci_for_prop.html#introduction",
    -    "title": "Confidence intervals for Proportions in SAS",
    +    "objectID": "contribution/hackathon/contribution_guide_ssh.html",
    +    "href": "contribution/hackathon/contribution_guide_ssh.html",
    +    "title": "Contribution Guide: connect RStudio with GitHub",
         "section": "",
    -    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (e.g 1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (e.g different subjects in each of the 2 groups), or can be matched (e.g the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more information about these methods in R & SAS, including which performs better in different scenarios see Five Confidence Intervals for Proportions That You Should Know about1 and Confidence Intervals for Binomial Proportion Using SAS2"
    -  },
    -  {
    -    "objectID": "SAS/ci_for_prop.html#data-used",
    -    "href": "SAS/ci_for_prop.html#data-used",
    -    "title": "Confidence intervals for Proportions in SAS",
    -    "section": "Data used",
    -    "text": "Data used\nThe adcibc data stored here was used in this example, creating a binary treatment variable trt taking the values of Act or PBO and a binary response variable resp taking the values of Yes or No. For this example, a response is defined as a score greater than 4.\n\ndata adcibc2 (keep=trt resp) ;\n    set adcibc;     \n    if aval gt 4 then resp=\"Yes\";\n    else resp=\"No\";     \n    if trtp=\"Placebo\" then trt=\"PBO\";\n    else trt=\"Act\"; \nrun;\n\nThe below shows that for the Actual Treatment, there are 36 responders out of 154 subjects = 0.2338 (23.38% responders).\n\nproc freq data=adcibc;\n  table trt*resp/ nopct nocol;\nrun;"
    -  },
    -  {
    -    "objectID": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-single-proportion",
    -    "href": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-single-proportion",
    -    "title": "Confidence intervals for Proportions in SAS",
    -    "section": "Methods for Calculating Confidence Intervals for a single proportion",
    -    "text": "Methods for Calculating Confidence Intervals for a single proportion\nSAS PROC FREQ in Version 9.4 can compute 11 methods to calculate CIs for a single proportion, an explanation of these methods and the code is shown below. See BINOMIAL3 for more information on SAS parameterization. It is recommended to always sort your data prior to doing a PROC FREQ.\nHere we are calculating a 95% confidence interval for the proportion of responders in the active treatment group.\n\nClopper-Pearson (Exact or binomial CI) Method\nWith Binary endpoint data (response/non-response), we make the assumption that the proportion of responders, has been derived from a series of Bernoulli trials. Trials (Subjects) are independent and we have a fixed number of repeated trials with an outcome of respond or not respond. This type of data follows the discrete binomial probability distribution, and the Clopper-Pearson4 (Exact) method uses this distribution to calculate the CIs. However, for large numbers of trials (subjects), the probability distribution becomes difficult to calculate and hence a variety of approximations were developed all with their pros and cons (depending on your data distribution). This method can also be too conservative, implying that the interval returned is too wide an interval compared to the interval containing the true population proportion 95% of the time.\nClopper-Pearson method is output by SAS as the default method, but you can also specify it using BINOMIAL(LEVEL=\"Yes\" CL=CLOPPERPEARSON);\n\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nThe most commonly used alternative to the Clopper-Pearson (Exact) method is the asymptotic Normal Approximation (Wald) CI. In large random samples from independent trials, the sampling distribution of proportions approximately follows the normal distribution. The expectation of a sample proportion is the corresponding population proportion. Therefore, based on a sample of size \\(n\\), a \\((1-\\alpha)\\%\\) confidence interval for population proportion can be calculated using normal approximation as follows:\n\\(p\\approx \\hat p \\pm z_\\alpha \\sqrt{\\hat p(1-\\hat p)}/{n}\\), where \\(\\hat p\\) is the sample proportion, \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\), and \\(\\sqrt{\\hat p(1-\\hat p)}/{n}\\) is the standard error.\nOne should note that the approximation can become unreliable as the proportion of responders gets close to 0 or 1 (e.g. 0 or 100% responding), and alternative methods may be more suitable. In this scenario, common issues consist of:\n\nit does not respect the 0 and 1 proportion boundary (so you can get a lower CI of -0.1 or an upper CI of 1.1%!)\nthe derived 95% CI may not cover the true proportion 95% of the time\n\nWald method can be derived with or without a Yate’s continuity correction. Applying the continuity correction is recommended when you have a small sample size or the estimated proportion is close to the tail ends (0 or 1). Applying Yate’s correction is considered more conservative but it’s not as conservative as Clopper-Pearson approach.\nNormal approximation method is output by SAS as the default method, but you can also specify it using BINOMIAL(LEVEL=\"Yes\" CL=WALD);\nSAS also produces a continuity correction version of the Wald method, you can specify it using BINOMIAL(LEVEL=\"Yes\" CL=WALD(CORRECT));\n\n\nWilson Method (Also known as the Score method or the Newcombe method)7\nThe Wilson (Score) method is an extension to the normal approximation, but commonly used where the proportion is close to 0 or 1 (i.e. 0% or 100% responding). This is because the normal approximation can be unreliable at the tail ends of the distribution, and as such the Wilson method can provide more reliable CIs. The method can be derived with or without a Yate’s continuity correction. Applying the continuity correction is recommended when you have a small sample size or the estimated proportion is close to the tail ends (0 or 1). Applying Yate’s correction is considered more conservative (sometimes too conservative), but it’s not as conservative as Clopper-Pearson approach. Not that the Wilson method is not boundary-respecting so you can get confidence interval <0 or >1.\nLet p=r/n, where r= number of responses, and n=number of subjects, q=1-p, and z= the appropriate value from standard normal distribution:\n\\[ z{_1-\\alpha/2} \\]For example, for 95% confidence intervals, alpha=0.05, using standard normal tables, z in the equations below will take the value =1.96. Calculate 3 quantities\n\\[ A= 2r+z^2\\]\n\\[ B=z\\sqrt(z^2 + 4rq) \\] \\[ C=2(n+z^2) \\]The method calculates the confidence interval (Low to High) as: (A-B)/C to (A+B)/C\nA = 2 * 36 + 1.96^2 = 75.8416\nB = 1.96 * sqrt (1.96^2 + 4 x 36 x 0.7662) = 20.9435\nC = 2* (154+1.96^2) = 315.6832\nLower interval = A-B/C = 75.8416 - 20.9435 / 315.6832 = 0.17390\nUpper interval = A+B/C = 75.8416 + 20.9435 / 315.6832 = 0.30659\nCI = 0.17390 to 0.30659\nWilson (score) method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=Wilson);\nSAS also produces a continuity correction version of the Wilson method, you can specify it using BINOMIAL(LEVEL=\"Yes\" CL=WILSON(CORRECT));\nThe only differences in the equations to calculate the Wilson score with continuity correction is that the equations for A and B are changed as follows:\n\\[ A= 2r+z^2 -1\\]\n\\[ B=z\\sqrt(z^2 - 2 -\\frac{1}{n} + 4rq) \\]\n\n\nAgresti-Coull Method\nAgresti-Coull Method is a ‘simple solution’ designed to improve coverage compared to the Wald method and still perform better than Clopper-Pearson particularly when the probability isn’t in the mid-range (0.5). It is less conservative whilst still having good coverage. The only difference compared to the Wald method is that it adds two successes and two failures to the original observations (increasing the sample by 4 observations). In practice it is not often used.\nAgresti-Coull method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=AGRESTICOULL);\n\n\nBinomial based MidP Method\nThe MidP method is similar to the Clopper-Pearson method, but aims to reduce the conservatism. It’s quite a complex method compared to the methods above and rarely used in practice.\nMidP method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=MIDP);\n\n\nJeffreys Method\nJeffreys method is a particular type of Bayesian Highest Probability Density (HPD) Method. For proportions, the beta distribution is generally used for the prior, which consists of two parameters alpha and beta. Setting alpha=beta=0.5 is called Jeffrey’s prior. This is considered as non-informative for a binomial proportion.\n\\[\n(Beta (^k/_2 + ^1/_{2}, ^{(n-k)}/_2+^1/_2)_{\\alpha}, Beta (^k/_2 + ^1/_{2}, ^{(n-k)}/_2+^1/_2)_{1-\\alpha}\n\\] Jeffreys method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=Jeffreys);\n\n\nBlaker Method6\nThe Blaker method is a less conservative alternative to the Clopper-pearson exact test. It is also an exact method, but derives the CI by inverting the p-value function of an exact test.\nThe Clopper-pearson CI’s are always wider and contain the Blaker CI limits. It’s adoption has been limited due to the numerical algorithm taking longer to compute compared to some of the other methods especially when the sample size is large. NOTE: Klaschka and Reiczigel5 is yet another adaptation of this method.\nBLAKER method is output by SAS using BINOMIAL(LEVEL=\"Yes\" CL=BLAKER);"
    +    "text": "Do you have RStudio locally? If so, this should be straight forward. If on a remote server it may be more complex!\nHave you connected your RStudio to GitHub? If not, complete Steps 1 to 3 below. \nNOTE: You will need the following to proceed:\n\nR Studio\nGit software and\na GitHub account\n\n\nStep 1: Ensure that your RStudio has a SSH Key\nGo to:  Tools – Global Options – Git/SVN.\n\n\n\n\n\nClick to Create SSH Key - This allows communication between Github & R.\n\n\n\n\n\nWhere is asks if you want to add a password, you do not need any password adding.\nClick to View Public Key & Copy it to the clipboard.\n\n\nStep 2: Add the R Studio SSH key to your github account.\nNOTE: you may need to come off your Company VPN in order for the connection to be accepted\nLog into your GitHub account.\nIf you don’t know your github ID, then you could check to see if you contributed to the CSRMLW project and find it from there, then reset your account. Otherwise, set up a new github account. https://github.com/phuse-org/CSRMLW\nOnce logged in, Within Github - go to settings (the blue widget below)\n\n\n\n\n\nGo to the SSH and GPG keys tab.\n\n\n\n\n\nSelect “New SSH Key”\nGive it a title (Company X account) and “Add SSH Key”.\nPaste in the SSH Code that you copied in step 1 and click “Add SSH Key”.\n\n\nStep 3: Tell R Studio the project you want to work on: the CAMIS github repo\nNavigate to the Git hub repo you want to work in: https://github.com/PSIAIMS/CAMIS\nClick on the Green “Code” button and select the tab: Local – SSH as shown below Copy the SSH key.\n\n\n\n\n\nGo into R Studio. Select: File New Project - Version Control - Git : In the repository URL paste the SSH key from Github. Click Ok.\nThis will set up the link between Github & your R studio.\nThe console will show you where files will be stored locally, before/after doing pull requests to the repo\n\n\n\n\n\nNow you can create new RMD files - edit them locally and save them back to github using the Git tab as shown below (on the right Environment, History, Connections, Git, Tutorial)\n\n\n\n\n\nWhen you save a file, It will appear in the GIT tab.\nCommit - will push it back to the repo.\nMake sure you pull down (Blue down arrow) before starting changes so you are editing the latest version of things from the repo. After you commit, click the Green up arrow to do a pull request back to the repo.\n If you have problems with the new project and what packages it has available. It is a good idea go into: Tools - Project Options - Environments - and select “Use RENV with this project”. This then saves the packages more locally & they should be there when you go back in.\nIf you get the following message, then run “renv::restore()” in the console."
       },
       {
    -    "objectID": "SAS/ci_for_prop.html#example-code-using-proc-freq",
    -    "href": "SAS/ci_for_prop.html#example-code-using-proc-freq",
    -    "title": "Confidence intervals for Proportions in SAS",
    -    "section": "Example Code using PROC FREQ",
    -    "text": "Example Code using PROC FREQ\nBy adding the option BINOMIAL(LEVEL=\"Yes\") to your ‘PROC FREQ’, SAS outputs the Normal Approximation (Wald) and Clopper-Pearson (Exact) confidence intervals as two default methods, derived for the Responders = Yes. If you do not specify the LEVEL you want to model, then SAS assumes you want to model the first level that appears in the output (alphabetically).\nIt is very important to ensure you are calculating the CI for the correct level! Check your output to confirm, you will see below it states resp=Yes !\nThe output consists of the proportion of resp=Yes, the Asymptotic SE, 95% CIs using normal-approximation method, 95% CI using the Clopper-Pearson method (Exact), and then a Binomial test statistic and p-value for the null hypothesis of H0: Proportion = 0.5.\n\nproc sort data=adcibc;\nby trt; \nrun; \n\nproc freq data=adcibc ; \ntable resp/ nopct nocol BINOMIAL(LEVEL=\"Yes\");\nby trt;\nrun;\n\n\n\n\n\n\n\n\n\n\nBy adding the option BINOMIAL(LEVEL=\"Yes\" CL=<name of CI method>), the other CIs are output as shown below. You can list any number of the available methods within the BINOMIAL option CL=XXXX separated by a space. However, SAS will only calculate the WILSON and WALD or the WILSON(CORRECT) and WALD(CORRECT). SAS wont output them both from the same procedure.\n\nBINOMIAL(LEVEL=\"Yes\" CL=CLOPPERPEARSON WALD WILSON AGRESTICOULL JEFFREYS MIDP LIKELIHOODRATIO LOGIT BLAKER) will return Agresti-Coull, BLAKER, Clopper-pearson(Exact), WALD(without continuity correction) WILSON(without continuity correction), JEFFREYS, MIDP, LIKELIHOODRATIO, and LOGIT\nBINOMIAL(LEVEL=\"Yes\" CL=ALL); will return Agresti-Coull, Clopper-pearson (Exact), Jeffreys, Wald(without continuity correction), Wilson (without continuity correction)\nBINOMIALc(LEVEL=\"Yes\" CL=ALL);will return Agresti-Coull, Clopper-pearson (Exact), Jeffreys, Wald (with continuity correction), Wilson(with continuity correction)\nBINOMIALc(LEVEL=\"Yes\" CL=WILSON(CORRECT)  WALD(CORRECT));will return Wilson(with continuity correction) and Wald (with continuity correction)\n\n\nproc freq data=adcibc;\n         table resp/ nopct nocol \n                     BINOMIAL(LEVEL=\"Yes\" \n                              CL= CLOPPERPEARSON WALD WILSON \n                                  AGRESTICOULL JEFFREYS MIDP \n                                  LIKELIHOODRATIO LOGIT BLAKER);\n  by trt; \nrun;\n\n\n\n\n\n\n\n\n\n\n\nproc freq data=adcibc;\n         table resp/ nopct nocol \n                     BINOMIAL(LEVEL=\"Yes\" \n                              CL= WILSON(CORRECT)  WALD(CORRECT));\n  by trt; \nrun;\n\n\n\n\n\n\n\n\n\n\nSAS output often rounds to 3 or 4 decimal places in the output window, however the full values can be obtained using SAS ODS statements. ods output binomialcls=bcl; and then using the bcl dataset, in a data step to put the variable out to the number of decimal places we require.\n10 decimal places shown here ! lowercl2=put(lowercl,12.10);"
    +    "objectID": "non_website_content/Conferences 2023 archive.html",
    +    "href": "non_website_content/Conferences 2023 archive.html",
    +    "title": "Conferences",
    +    "section": "",
    +    "text": "Conference Programme\nWe plan to showcase the CAMIS project at a number of conferences throughout 2023 and 2024. See below the list of conferences the CAMIS team will be at and please come say hello to us !\n\n\n\n\n\n\n\n\n\n\n\nConference\n2023/2024 Planning dates\n2023 Date & Location\n2023 Main Contact\nAlso attending\nDetails\n\n\n\n\nJSM (ASA conference)\nAbstract Feb 2024\n\nLeon Shih\n\n\n\n\nPHUSE US Connect\nTBC for 2024\n5-8 March 2023 Orlando, Florida\nSoma Sekhar\n\nPresentation\n\n\nDISS (Duke industry statistics symposium)\nTBC for 2024\n29-31st March 2023 Virtual\nMolly MacDiarmid (2023)\n\nPoster\n\n\nPSDM(Pharmaceutical statistics and data management)\n\n19 Apr 2023 Netherlands\n\n\n\n\n\nIASCT (ConSPIC - conference for statistics and programming in clinical research)\nAbstract submission 14 Mar-3rd Apr\n4-6 May 2023 Bengaluru, India\nHarshal Khanolkar\n\nTalk. and/or poster\n\n\nSociety of Clinical Trials (SCT\n\n21-24 May 2023\nMichael Kane\n\n\n\n\nuse R\nTBC\nJune 2024?\n\n\n\n\n\nPSI 2023 Conference\nTalk submission Nov.\nPoster submission Feb.\n11-14 June 2023 Hammersmith London West, England\nMartin Brown\nChristina Fillmore\nLyn Taylor\nMolly Macdiarmid\nMartin Brown\nAiming Yang\nOral & poster submission completed\n\n\nDIA 2023 Global Annual Meeting\n\n25-29 June 2023 Boston MA, USA\n\n\n\n\n\nJoint statistical meeting (JSM)\nFeb 2024 submission for next year\n5-10 Aug 2023 Toronto, Ontario, Canada\n\n\n\n\n\nISCB Conference\n\n27-31 Aug 2023 Milan-Italy\n\n\n\n\n\nRSS conference\nAbstract by 6th April\n4-7 sept 2023 Harrogate, England\nLyn Taylor\n\nConfirmed oral presentation\n\n\nPHUSE/FDA Quarterly meeting\nSeptember 13 (10:00 EDT/15:00 BST)\nWG can present their work, share their progress, and request any FDA \nsupport\nLyn Taylor\n\n30 min presentation\n\n\nPHUSE CSS\n15th June Abstract open, register by 30th june\n(TBC 2024 DVOST breakout sessions)\nSept 18-20, Maryland USA\nSoma Sekhar\nVikash Jain\nAditee Dani\nPoster\n\n\nASA Bio pharmaceutical Section Regulatory-industry Statistics Workshop\n\n27-29 Sept 2023 Rockville, Maryland, USA\n\n\n\n\n\nEASD 2023 - European Association for study of diabetes\n\n02-06 Oct 2023 Hamberg Germany\n\n\n\n\n\nSESUG (South East SAS user group)\n\n17-19 Oct 2023\nBrian Varney\n\n\n\n\nPHUSE EU Connect 2023\n\n5-8 November 2023 ICC Birmingham, England\nJayashree vendanayagam\n\nPresenting on shiny App for regulatory submission (will include CAMIS advert)\n\n\nR in Pharma\n\n\nNov Virtual\nBrian Varney/ Christina Fillmore?\n\nForm open. Christina to speak to Brian.\n\n\nPOSIT conf.\nInvite only\nSeptember - Chicago\nJulianne Manitz & Doug Kelkhoff\n\nR Validation Hub team will include a slide for us. (Juliane Manitz/Doug Kelkhoff)\n\n\nPHUSE (Single day events) SDEs\n\nMississauga\nJune 8th\nJayashree vendanayagam\n\nPresenting on shiny App for regulatory submission (will include CAMIS advert)\n\n\nPHUSE (Single day events) SDEs\n\nNew York (Oct 16th)\nAiming Yang\n\nEmailed host to have poster/ talk/ advert"
       },
       {
    -    "objectID": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-matched-pair-proportion",
    -    "href": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-matched-pair-proportion",
    -    "title": "Confidence intervals for Proportions in SAS",
    -    "section": "Methods for Calculating Confidence Intervals for a matched pair proportion",
    -    "text": "Methods for Calculating Confidence Intervals for a matched pair proportion\nYou may experience paired data in any of the following types of situation:\n\nTumour assesssments classified as Progressive Disease or Not Progressive Disease performed by an Investigator and separately by an independent panel.\nA paired case-control study (each subject taking active treatment is matched to a patient taking control)\nA cross-over trial where the same subjects take both medications\n\nIn all these cases, the calculated proportions for the 2 groups are not independent.\nUsing a cross over study as our example, a 2 x 2 table can be formed as follows:\n\n\n\n\n\n\n\n\n\n\nPlacebo\nResponse= Yes\nPlacebo\nResponse = No\nTotal\n\n\n\n\nActive Response = Yes\nr\ns\nr+s\n\n\nActive Response = No\nt\nu\nt+u\n\n\nTotal\nr+t\ns+u\nN = r+s+t+u\n\n\n\nThe proportions of subjects responding on each treatment are:\nActive: \\(\\hat p_1 = (r+s)/n\\) and Placebo: \\(\\hat p_2= (r+t)/n\\)\nDifference between the proportions for each treatment are: \\(D=p1-p2=(s-t)/n\\)\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nIn large random samples from independent trials, the sampling distribution of the difference between two proportions approximately follows the normal distribution. Hence the SE for the difference and 95% confidence interval can be calculated using the following equations.\n\\(SE(D)=\\frac{1}{n} * sqrt(s+t-\\frac{(s-t)^2}{n})\\)\n\\(D-z_\\alpha * SE(D)\\) to \\(D+z_\\alpha * SE(D)\\)\nwhere \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\),\n\n\nWilson Method (Also known as the Score method or the Altman, Newcombe method7 )\nDerive the confidence intervals using the Wilson Method equations above for each of the individual single samples 1 and 2.\nLet l1 = Lower CI for sample 1, and u1 be the upper CI for sample 1.\nLet l2 = Lower CI for sample 2, and u2 be the upper CI for sample 2.\nWe then define \\(\\phi\\) which is used to correct for \\(\\hat p_1\\) and \\(\\hat p_2\\) not being independent. As the samples are related, \\(\\phi\\) is usually positive and thus makes the confidence interval smaller (narrower).\nIf any of r+s, t+u, r+t, s+u are zero, then set \\(\\phi\\) to be 0.\nOtherwise we calculate A, B and C, and \\(\\phi=C / sqrt A\\)\nIn the above: \\(A=(r+s)(t+u)(r+t)(s+u)\\) and \\(B=(ru-st)\\)\nTo calculate C follow the table below.\n\n\n\n\n\n\n\nCondition of B\nSet C equal to\n\n\n\n\nIf B is greater than n/2\nB - n/2\n\n\nIf B is between 0 and n/2\n0\n\n\nIf B is less than 0\nB\n\n\n\nLet D = p1-p2 (the difference between the observed proportions of responders)\nThe Confidence interval for the difference between two population proportions is: \\(D - sqrt((p_1-l_1)^2)-2\\phi(p_1-l_1)(u_2-p_2)+(u_2-p_2)^2 )\\) to\n\\(D + sqrt((p_2-l_2)^2)-2\\phi(p_2-l_2)(u_1-p_1)+(u_1-p_1)^2 )\\)"
    +    "objectID": "non_website_content/dissertations/202406_MMRM.html",
    +    "href": "non_website_content/dissertations/202406_MMRM.html",
    +    "title": "A comparison of MMRM methodology in SAS and R software",
    +    "section": "",
    +    "text": "NOTE: This project is no longer available for selection.\nAbstract:\nThe mixed model for repeated measures (MMRM) is commonly used in individual clinical trials due to its suitability to model longitudinal continuous data outcomes measured at set timepoints over time. However, there is much complexity in this methodology such that replication of analysis methods and results produced in SAS vs open source software such as R may not be straight forward.\nThe primary objective of this project is to build on the information already documented here CAMIS - A PHUSE DVOST Working Group (psiaims.github.io) under Repeated Measures (Linear Mixed Model (MMRM) section) and provide both PAREXEL and the wider pharmaceutical industry with a comprehensive guide for how to implement and replicate MMRMs analysis methods in SAS and R.\nIt is expected that the project will consist of performing a thorough comparison of MMRM analysis methods in SAS (using Proc Mixed and Proc GLIMMIX) versus in R (nlme::gls, lme4::lmer, and glmmTMB::glmmTMB and mmrm::mmrm). The project will discuss and document the options available in each, detailing similarities and differences in default options, available options and analysis results.\nThe project plan for this study is expected to consist of\n1 Self teaching in the MMRM methodology to understand how to apply the methods, the common options available when model fitting, their strengths and limitations in clinical research\n2 Literature search to investigate\n\nLatest advance in current methods and guidance\nR packages available for use to apply these methods\nSAS procedures available to apply these methods\nAny current research or evidence of researchers comparing methods in SAS vs R.\n\n3 Using one or more datasets (simulated or existing in open source, testing both small and large datasets), fit a selection of MMRM modelling methods using various software/package and options to see if SAS and R return the same results. Investigate and document the reasons for any differences. \nPossible extensions (if time permits):\n\nInvestigate Categorical MMRMs\nInvestigate the Bayesian MMRM options available in both software and document any differences.\nInvestigate pythons application of such methods with comparison to SAS and R"
       },
       {
    -    "objectID": "SAS/ci_for_prop.html#example-code-using-proc-freq-1",
    -    "href": "SAS/ci_for_prop.html#example-code-using-proc-freq-1",
    -    "title": "Confidence intervals for Proportions in SAS",
    -    "section": "Example Code using PROC FREQ",
    -    "text": "Example Code using PROC FREQ\nSAS Proc Freq has 3 methods for analysis of paired data (Common risk difference).\nThe default method is Mantel-Haenszel confidence limits. SAS can also Score (Miettinen-Nurminen) CIs and Stratified Newcombe CIs (constructed from stratified Wilson Score CIs).\nSee here for equations.\n\nproc freq data=adcibc order=data; \ntable trt*resp/commonriskdiff(cl=MH NEWCOMBE); \nrun;"
    +    "objectID": "R/mi_mar_predictive_mean_match.html",
    +    "href": "R/mi_mar_predictive_mean_match.html",
    +    "title": "Multiple Imputation: Predictive Mean Matching",
    +    "section": "",
    +    "text": "Predictive mean matching is a technique for missing value imputation. It calculates the predicted value of the missing variable based on a regression model from complete data, then selects one value (from the observed) that produces the closest prediction. PMM is robust to transformation, less vulnerable to model misspecification. More theoretical details for PMM can be found here.\nAssumption for PMM: distribution of missing is the same aas obsereved data of the candidates that produce the closest values to the predicted value by the missing entry."
       },
       {
    -    "objectID": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-2-independent-samples-proportion",
    -    "href": "SAS/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-2-independent-samples-proportion",
    -    "title": "Confidence intervals for Proportions in SAS",
    -    "section": "Methods for Calculating Confidence Intervals for 2 independent samples proportion",
    -    "text": "Methods for Calculating Confidence Intervals for 2 independent samples proportion\nThis paper8 described many methods for the calculation of confidence intervals for 2 independent proportions. The most commonly used are: Wald with continuity correction and Wilson with continuity correction. The Wilson method may be more applicable when sample sizes are smaller and/or the proportion is closer to 0 or 1.\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nIn large random samples from independent trials, the sampling distribution of the difference between two proportions approximately follows the normal distribution.\nThe difference between two independent sample proportions is calculated as: \\(D= \\hat p_1-\\hat p_2\\)\nA confidence interval for the difference between two independent proportions \\(D\\) can be calculated using:\n\\(D\\approx \\hat D \\pm z_\\alpha * SE(\\hat p)\\),\nwhere \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\), and\n\\(SE (\\hat p) = sqrt{( \\frac{\\hat p_1 (1-\\hat p_1)}{n_1} + \\frac{\\hat p_2 (1-\\hat p_2)}{n_2})}\\)\nWith continuity correction, the equation becomes\n\\(D\\approx \\hat D \\pm (CC + z_\\alpha * SE(\\hat p))\\),\nwhere \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\),\nand \\(SE (\\hat p)\\) = \\(sqrt{( \\frac{\\hat p_1 (1-\\hat p_1)}{n_1} + \\frac{\\hat p_2 (1-\\hat p_2)}{n_2})}\\)\nand\n\\(CC = \\frac{1}{2} (\\frac{1}{n_1} + \\frac{1}{n_2})\\)\n\n\nWilson Method (Also known as the Score method or the Altman, Newcombe method7 )\nDerive the confidence intervals using the Wilson Method equations above for each of the individual single samples 1 and 2.\nLet l1 = Lower CI for sample 1, and u1 be the upper CI for sample 1.\nLet l2 = Lower CI for sample 2, and u2 be the upper CI for sample 2.\nLet D = p1-p2 (the difference between the observed proportions)\nThe Confidence interval for the difference between two population proportions is: \\[ D - sqrt((p_1-l_1)^2)+(u_2-p_2)^2 )\\quad to\\quad D + sqrt((p_2-l_2)^2)+(u_1-p_1)^2 )   \\]"
    +    "objectID": "R/mi_mar_predictive_mean_match.html#overview",
    +    "href": "R/mi_mar_predictive_mean_match.html#overview",
    +    "title": "Multiple Imputation: Predictive Mean Matching",
    +    "section": "",
    +    "text": "Predictive mean matching is a technique for missing value imputation. It calculates the predicted value of the missing variable based on a regression model from complete data, then selects one value (from the observed) that produces the closest prediction. PMM is robust to transformation, less vulnerable to model misspecification. More theoretical details for PMM can be found here.\nAssumption for PMM: distribution of missing is the same aas obsereved data of the candidates that produce the closest values to the predicted value by the missing entry."
       },
       {
    -    "objectID": "SAS/ci_for_prop.html#example-code-using-proc-freq-2",
    -    "href": "SAS/ci_for_prop.html#example-code-using-proc-freq-2",
    -    "title": "Confidence intervals for Proportions in SAS",
    -    "section": "Example Code using PROC FREQ",
    -    "text": "Example Code using PROC FREQ\nIt is important to check the output to ensure that you are modelling Active - Placebo, and response = Yes (not Response=No). By default SAS sorts alphabetically and calculates CI’s for the first column. You can change this by using the COLUMN= Option on riskdiff or by sorting the dataset (here by trt, then descending resp), and then using order=data in the proc freq. This tells SAS to use the order you have sorted the data by. SAS confirms this by saying “Difference is (Row 1 - Row 2)” and “Column 1 (resp=Yes)”. Note how in the SAS output, it calls the requested ‘wilson’ method ‘Newcombe’ in the output.\nOptions for riskdiff(CL=XXX) consist of AC:Agresti-Caffo, EXACT=exact, HA:Hauck-Anderson, MN or SCORE:Miettinen-Nurminen (another type of Score CI), WILSON or NEWCOMBE: Wilson method described above, and WALD: normal approximation wald method described above. Examples using Wald and Wilson are shown below with and without continuity correction.\n\nproc sort data=adcibc;\n by  trt descending resp;\nrun;\n\n#without continuity correction\nproc freq data=adcibc order=data;\n  table trt*resp/riskdiff(CL=(wald wilson)); \nrun;\n\n#with continuity correction\n\nproc freq data=adcibc order=data;\n  table trt*resp/riskdiff(CORRECT CL=(wald wilson)); \nrun;"
    +    "objectID": "R/mi_mar_predictive_mean_match.html#available-r-package",
    +    "href": "R/mi_mar_predictive_mean_match.html#available-r-package",
    +    "title": "Multiple Imputation: Predictive Mean Matching",
    +    "section": "Available R package",
    +    "text": "Available R package\nmice is a powerful R package developed by Stef van Buuren, Karin Groothuis-Oudshoorn and other contributors.\nImplementation of PMM in mice:\n\nPredictive mean matching, mice.impute.pmm\nWeighted predictive mean matching, mice.impute.midastouch\nMultivariate predictive mean matching, mice.impute.mpmm"
       },
       {
    -    "objectID": "SAS/ci_for_prop.html#reference",
    -    "href": "SAS/ci_for_prop.html#reference",
    -    "title": "Confidence intervals for Proportions in SAS",
    -    "section": "Reference",
    -    "text": "Reference\n\nFive Confidence Intervals for Proportions That You Should Know about\nConfidence intervals for Binomial Proportion Using SAS\nSAS PROC FREQ here and here\nClopper,C.J.,and Pearson,E.S.(1934),“The Use of Confidence or Fiducial Limits Illustrated in the Case of the Binomial”, Biometrika 26, 404–413.\nKlaschka, J. and Reiczigel, J. (2021). “On matching confidence intervals and tests for some discrete distributions: Methodological and computational aspects,” Computational Statistics, 36, 1775–1790.\nBlaker, H. (2000). Confidence curves and improved exact confidence intervals for discrete distribu\u0002tions, Canadian Journal of Statistics 28 (4), 783–798\nD. Altman, D. Machin, T. Bryant, M. Gardner (eds). Statistics with Confidence: Confidence Intervals and Statistical Guidelines, 2nd edition. John Wiley and Sons 2000.\nhttps://www.lexjansen.com/wuss/2016/127_Final_Paper_PDF.pdf"
    +    "objectID": "R/mi_mar_predictive_mean_match.html#example",
    +    "href": "R/mi_mar_predictive_mean_match.html#example",
    +    "title": "Multiple Imputation: Predictive Mean Matching",
    +    "section": "Example",
    +    "text": "Example\nWe use the small dataset nhanes included in mice package. It has 25 rows, and three out of four variables have missings.\nThe original NHANES data is a large national level survey, some are publicly available via R package nhanes.\n\nlibrary(mice)\n\n\nAttaching package: 'mice'\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\nThe following objects are masked from 'package:base':\n\n    cbind, rbind\n\n# load example dataset from mice\nhead(nhanes)\n\n  age  bmi hyp chl\n1   1   NA  NA  NA\n2   2 22.7   1 187\n3   1   NA   1 187\n4   3   NA  NA  NA\n5   1 20.4   1 113\n6   3   NA  NA 184\n\nsummary(nhanes)\n\n      age            bmi             hyp             chl       \n Min.   :1.00   Min.   :20.40   Min.   :1.000   Min.   :113.0  \n 1st Qu.:1.00   1st Qu.:22.65   1st Qu.:1.000   1st Qu.:185.0  \n Median :2.00   Median :26.75   Median :1.000   Median :187.0  \n Mean   :1.76   Mean   :26.56   Mean   :1.235   Mean   :191.4  \n 3rd Qu.:2.00   3rd Qu.:28.93   3rd Qu.:1.000   3rd Qu.:212.0  \n Max.   :3.00   Max.   :35.30   Max.   :2.000   Max.   :284.0  \n                NA's   :9       NA's   :8       NA's   :10     \n\n\n\nImpute with PMM\nTo impute with PMM is straightforward: specify the method, method = pmm.\n\nimp_pmm <- mice(nhanes, method = 'pmm', m=5, maxit=10)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n  1   2  bmi  hyp  chl\n  1   3  bmi  hyp  chl\n  1   4  bmi  hyp  chl\n  1   5  bmi  hyp  chl\n  2   1  bmi  hyp  chl\n  2   2  bmi  hyp  chl\n  2   3  bmi  hyp  chl\n  2   4  bmi  hyp  chl\n  2   5  bmi  hyp  chl\n  3   1  bmi  hyp  chl\n  3   2  bmi  hyp  chl\n  3   3  bmi  hyp  chl\n  3   4  bmi  hyp  chl\n  3   5  bmi  hyp  chl\n  4   1  bmi  hyp  chl\n  4   2  bmi  hyp  chl\n  4   3  bmi  hyp  chl\n  4   4  bmi  hyp  chl\n  4   5  bmi  hyp  chl\n  5   1  bmi  hyp  chl\n  5   2  bmi  hyp  chl\n  5   3  bmi  hyp  chl\n  5   4  bmi  hyp  chl\n  5   5  bmi  hyp  chl\n  6   1  bmi  hyp  chl\n  6   2  bmi  hyp  chl\n  6   3  bmi  hyp  chl\n  6   4  bmi  hyp  chl\n  6   5  bmi  hyp  chl\n  7   1  bmi  hyp  chl\n  7   2  bmi  hyp  chl\n  7   3  bmi  hyp  chl\n  7   4  bmi  hyp  chl\n  7   5  bmi  hyp  chl\n  8   1  bmi  hyp  chl\n  8   2  bmi  hyp  chl\n  8   3  bmi  hyp  chl\n  8   4  bmi  hyp  chl\n  8   5  bmi  hyp  chl\n  9   1  bmi  hyp  chl\n  9   2  bmi  hyp  chl\n  9   3  bmi  hyp  chl\n  9   4  bmi  hyp  chl\n  9   5  bmi  hyp  chl\n  10   1  bmi  hyp  chl\n  10   2  bmi  hyp  chl\n  10   3  bmi  hyp  chl\n  10   4  bmi  hyp  chl\n  10   5  bmi  hyp  chl\n\nimp_pmm\n\nClass: mids\nNumber of multiple imputations:  5 \nImputation methods:\n  age   bmi   hyp   chl \n   \"\" \"pmm\" \"pmm\" \"pmm\" \nPredictorMatrix:\n    age bmi hyp chl\nage   0   1   1   1\nbmi   1   0   1   1\nhyp   1   1   0   1\nchl   1   1   1   0\n\n# imputations for bmi\nimp_pmm$imp$bmi\n\n      1    2    3    4    5\n1  27.2 30.1 27.2 35.3 27.4\n3  30.1 33.2 22.0 27.2 35.3\n4  22.0 20.4 25.5 22.5 21.7\n6  22.7 22.7 24.9 22.5 20.4\n10 27.4 22.0 28.7 22.7 22.5\n11 22.0 35.3 30.1 30.1 20.4\n12 27.4 28.7 27.2 28.7 22.7\n16 28.7 33.2 20.4 35.3 20.4\n21 26.3 33.2 22.0 27.2 20.4\n\n\nAn alternative to the standard PMM is midastouch.\n\nimp_pmms <- mice(nhanes, method = 'midastouch', m=5, maxit=10)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n  1   2  bmi  hyp  chl\n  1   3  bmi  hyp  chl\n  1   4  bmi  hyp  chl\n  1   5  bmi  hyp  chl\n  2   1  bmi  hyp  chl\n  2   2  bmi  hyp  chl\n  2   3  bmi  hyp  chl\n  2   4  bmi  hyp  chl\n  2   5  bmi  hyp  chl\n  3   1  bmi  hyp  chl\n  3   2  bmi  hyp  chl\n  3   3  bmi  hyp  chl\n  3   4  bmi  hyp  chl\n  3   5  bmi  hyp  chl\n  4   1  bmi  hyp  chl\n  4   2  bmi  hyp  chl\n  4   3  bmi  hyp  chl\n  4   4  bmi  hyp  chl\n  4   5  bmi  hyp  chl\n  5   1  bmi  hyp  chl\n  5   2  bmi  hyp  chl\n  5   3  bmi  hyp  chl\n  5   4  bmi  hyp  chl\n  5   5  bmi  hyp  chl\n  6   1  bmi  hyp  chl\n  6   2  bmi  hyp  chl\n  6   3  bmi  hyp  chl\n  6   4  bmi  hyp  chl\n  6   5  bmi  hyp  chl\n  7   1  bmi  hyp  chl\n  7   2  bmi  hyp  chl\n  7   3  bmi  hyp  chl\n  7   4  bmi  hyp  chl\n  7   5  bmi  hyp  chl\n  8   1  bmi  hyp  chl\n  8   2  bmi  hyp  chl\n  8   3  bmi  hyp  chl\n  8   4  bmi  hyp  chl\n  8   5  bmi  hyp  chl\n  9   1  bmi  hyp  chl\n  9   2  bmi  hyp  chl\n  9   3  bmi  hyp  chl\n  9   4  bmi  hyp  chl\n  9   5  bmi  hyp  chl\n  10   1  bmi  hyp  chl\n  10   2  bmi  hyp  chl\n  10   3  bmi  hyp  chl\n  10   4  bmi  hyp  chl\n  10   5  bmi  hyp  chl\n\nimp_pmm\n\nClass: mids\nNumber of multiple imputations:  5 \nImputation methods:\n  age   bmi   hyp   chl \n   \"\" \"pmm\" \"pmm\" \"pmm\" \nPredictorMatrix:\n    age bmi hyp chl\nage   0   1   1   1\nbmi   1   0   1   1\nhyp   1   1   0   1\nchl   1   1   1   0\n\nimp_pmms$imp$bmi\n\n      1    2    3    4    5\n1  22.5 30.1 30.1 22.0 29.6\n3  30.1 30.1 30.1 22.0 29.6\n4  25.5 25.5 30.1 24.9 27.4\n6  25.5 21.7 28.7 33.2 27.4\n10 21.7 29.6 22.7 22.7 26.3\n11 28.7 29.6 30.1 33.2 29.6\n12 21.7 29.6 22.7 20.4 22.7\n16 27.2 30.1 35.3 33.2 30.1\n21 27.2 29.6 30.1 33.2 29.6"
       },
       {
    -    "objectID": "SAS/ttest_1Sample.html",
    -    "href": "SAS/ttest_1Sample.html",
    -    "title": "One Sample t-test",
    +    "objectID": "R/linear-regression.html",
    +    "href": "R/linear-regression.html",
    +    "title": "Linear Regression",
         "section": "",
    -    "text": "In SAS, a one sample t-test is usually performed using PROC TTEST. The one sample t-test compares the mean of the sample to a provided null hypothesis, called “h0”. The h0 value is provided as an option. By default, the h0 value is zero (0). Running the procedure produces a set of results that suggest whether or not the null hypothesis should be rejected.\n\n\nThe following data was used in this example.\n  data read;\n     input score count @@;\n     datalines;\n  40 2   47 2   52 2   26 1   19 2\n  25 2   35 4   39 1   26 1   48 1\n  14 2   22 1   42 1   34 2   33 2\n  18 1   15 1   29 1   41 2   44 1\n  51 1   43 1   27 2   46 2   28 1\n  49 1   31 1   28 1   54 1   45 1\n  ;\n\n\n\nBy default, SAS PROC TTEST t-test assumes normality in the data and uses a classic Student’s t-test.\n\n\nThe following code was used to test the comparison of a reading scores against a baseline hypothesis value of 30:\n  proc ttest data=read h0=30;\n     var score;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe SAS one sample t-test also supports lognormal analysis for a one sample t-test.\n\n\nUsing the same data as above, we will set the “DIST” option to “lognormal” to perform this analysis:\n  proc ttest data=read h0=30 dist=lognormal;\n     var score;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nAs can be seen in the figure above, the lognormal variation of the one sample TTEST provides results for geometric mean, coefficient of variation, and 95% confidence limits for the coefficient of variation."
    +    "text": "To demonstrate the use of linear regression we examine a dataset that illustrates the relationship between Height and Weight in a group of 237 teen-aged boys and girls. The dataset is available here and is imported to the workspace.\n\nDescriptive Statistics\nThe first step is to obtain the simple descriptive statistics for the numeric variables of htwt data, and one-way frequencies for categorical variables. This is accomplished by employing summary function. There are 237 participants who are from 13.9 to 25 years old. It is a cross-sectional study, with each participant having one observation. We can use this data set to examine the relationship of participants’ height to their age and sex.\n\nknitr::opts_chunk$set(echo = TRUE)\nhtwt<-read.csv(\"../data/htwt.csv\")\nsummary(htwt)\n\n      ROW          SEX                 AGE            HEIGHT     \n Min.   :  1   Length:237         Min.   :13.90   Min.   :50.50  \n 1st Qu.: 60   Class :character   1st Qu.:14.80   1st Qu.:58.80  \n Median :119   Mode  :character   Median :16.30   Median :61.50  \n Mean   :119                      Mean   :16.44   Mean   :61.36  \n 3rd Qu.:178                      3rd Qu.:17.80   3rd Qu.:64.30  \n Max.   :237                      Max.   :25.00   Max.   :72.00  \n     WEIGHT     \n Min.   : 50.5  \n 1st Qu.: 85.0  \n Median :101.0  \n Mean   :101.3  \n 3rd Qu.:112.0  \n Max.   :171.5  \n\n\nIn order to create a regression model to demonstrate the relationship between age and height for females, we first need to create a flag variable identifying females and an interaction variable between age and female gender flag.\n\nhtwt$female <- ifelse(htwt$SEX=='f',1,0)\nhtwt$fem_age <- htwt$AGE * htwt$female\nhead(htwt)\n\n  ROW SEX  AGE HEIGHT WEIGHT female fem_age\n1   1   f 14.3   56.3   85.0      1    14.3\n2   2   f 15.5   62.3  105.0      1    15.5\n3   3   f 15.3   63.3  108.0      1    15.3\n4   4   f 16.1   59.0   92.0      1    16.1\n5   5   f 19.1   62.5  112.5      1    19.1\n6   6   f 17.1   62.5  112.0      1    17.1\n\n\n\n\nRegression Analysis\nNext, we fit a regression model, representing the relationships between gender, age, height and the interaction variable created in the datastep above. We again use a where statement to restrict the analysis to those who are less than or equal to 19 years old. We use the clb option to get a 95% confidence interval for each of the parameters in the model. The model that we are fitting is height = b0 + b1 x female + b2 x age + b3 x fem_age + e\n\nregression<-lm(HEIGHT~female+AGE+fem_age, data=htwt, AGE<=19)\nsummary(regression)\n\n\nCall:\nlm(formula = HEIGHT ~ female + AGE + fem_age, data = htwt, subset = AGE <= \n    19)\n\nResiduals:\n    Min      1Q  Median      3Q     Max \n-8.2429 -1.7351  0.0383  1.6518  7.9289 \n\nCoefficients:\n            Estimate Std. Error t value Pr(>|t|)    \n(Intercept)  28.8828     2.8734  10.052  < 2e-16 ***\nfemale       13.6123     4.0192   3.387 0.000841 ***\nAGE           2.0313     0.1776  11.435  < 2e-16 ***\nfem_age      -0.9294     0.2478  -3.750 0.000227 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\nResidual standard error: 2.799 on 215 degrees of freedom\nMultiple R-squared:  0.4595,    Adjusted R-squared:  0.452 \nF-statistic: 60.93 on 3 and 215 DF,  p-value: < 2.2e-16\n\n\nFrom the coefficients table b0,b1,b2,b3 are estimated as b0=28.88 b1=13.61 b2=2.03 b3=-0.92942\nThe resulting regression model for height, age and gender based on the available data is height=28.8828 + 13.6123 x female + 2.0313 x age -0.9294 x fem_age"
       },
       {
    -    "objectID": "SAS/ttest_1Sample.html#normal",
    -    "href": "SAS/ttest_1Sample.html#normal",
    -    "title": "One Sample t-test",
    +    "objectID": "R/Accelerated_Failure_time_model.html",
    +    "href": "R/Accelerated_Failure_time_model.html",
    +    "title": "Accelerated Failure Time Model",
         "section": "",
    -    "text": "By default, SAS PROC TTEST t-test assumes normality in the data and uses a classic Student’s t-test.\n\n\nThe following code was used to test the comparison of a reading scores against a baseline hypothesis value of 30:\n  proc ttest data=read h0=30;\n     var score;\n  run;\nOutput:"
    +    "text": "The accelerated failure time model is a parametric survival analysis technique used to model the relationship between the time to event of interest (e.g., time to failure) and a set of predictor variables. It assumes that the covariates have a multiplicative effect on the time to the event. In other words, the time to event is accelerated or decelerated by a factor that depends on the values of the covariates.This differs from the Cox proportional hazards model, which assumes that covariates have a multiplicative effect on the hazard rate, not the time to the event."
       },
       {
    -    "objectID": "SAS/ttest_1Sample.html#lognormal",
    -    "href": "SAS/ttest_1Sample.html#lognormal",
    -    "title": "One Sample t-test",
    -    "section": "",
    -    "text": "The SAS one sample t-test also supports lognormal analysis for a one sample t-test.\n\n\nUsing the same data as above, we will set the “DIST” option to “lognormal” to perform this analysis:\n  proc ttest data=read h0=30 dist=lognormal;\n     var score;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nAs can be seen in the figure above, the lognormal variation of the one sample TTEST provides results for geometric mean, coefficient of variation, and 95% confidence limits for the coefficient of variation."
    +    "objectID": "R/Accelerated_Failure_time_model.html#mathematical-expression",
    +    "href": "R/Accelerated_Failure_time_model.html#mathematical-expression",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Mathematical Expression",
    +    "text": "Mathematical Expression\nMathematically, the AFT model can be expressed as:\n\\(\\log(T) = X\\beta + \\sigma\\varepsilon\\)\nWhere:\n\nT is the survival time\nlog(T) is the logarithm of the survival time\nX is a matrix of predictor variables\nβ is a vector of coefficients representing the effects of the predictor variables on the logarithm of the survival time\nσ is a scaler quantity representing the scale parameter, which influences the variability of the error term ε in the model.\nε is the error term assumed to follow a specific distribution (e.g., normal distribution for log-normal, extreme value distribution for Weibull) that corresponds to the chosen parametric form of the model."
       },
       {
    -    "objectID": "SAS/wilcoxonsr_HL.html",
    -    "href": "SAS/wilcoxonsr_HL.html",
    -    "title": "Wilcoxon signed-rank test in SAS & StatXact®",
    -    "section": "",
    -    "text": "Similarily to what has been presented in R, we will explore the options of Wilcoxon Signed-Rank test that are avialable in SAS & StatXact.We will consider case with N>=20 or N<20 and without or with ties. For more information how to perform this analysis in R go here"
    +    "objectID": "R/Accelerated_Failure_time_model.html#example-of-aft-model-using-log-normal-distribution",
    +    "href": "R/Accelerated_Failure_time_model.html#example-of-aft-model-using-log-normal-distribution",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Example of AFT model using “Log-Normal Distribution”",
    +    "text": "Example of AFT model using “Log-Normal Distribution”\n\nlibrary(survival)\nattach(lung)\n# Fit an AFT model using lognormal distribution\nmodel_aft <- survreg(Surv(time, status) ~ age + sex + ph.ecog, data = lung, dist = \"lognormal\")\n# Model summary\nsummary(model_aft)\n\n\nCall:\nsurvreg(formula = Surv(time, status) ~ age + sex + ph.ecog, data = lung, \n    dist = \"lognormal\")\n               Value Std. Error     z       p\n(Intercept)  6.49479    0.58276 11.14 < 2e-16\nage         -0.01918    0.00833 -2.30 0.02126\nsex          0.52195    0.15278  3.42 0.00063\nph.ecog     -0.35557    0.10331 -3.44 0.00058\nLog(scale)   0.02823    0.05596  0.50 0.61391\n\nScale= 1.03 \n\nLog Normal distribution\nLoglik(model)= -1146.9   Loglik(intercept only)= -1163.2\n    Chisq= 32.59 on 3 degrees of freedom, p= 3.9e-07 \nNumber of Newton-Raphson Iterations: 3 \nn=227 (1 observation deleted due to missingness)\n\n\nThe summary output will provide the estimated coefficients, standard errors, and p-values for each predictor variable."
       },
       {
    -    "objectID": "SAS/wilcoxonsr_HL.html#analysis-in-sas",
    -    "href": "SAS/wilcoxonsr_HL.html#analysis-in-sas",
    -    "title": "Wilcoxon signed-rank test in SAS & StatXact®",
    -    "section": "Analysis in SAS",
    -    "text": "Analysis in SAS\n\nDataset without ties and N > 20\nLet’s consider a case where the dataset has no ties and N (number of observations) = 240.\n\ndata TTR;\n  set TTR;\n  diff = TRT_B - TRT_A;\nrun;\n\n\n\n\n\n\n\n\n\n\nIn SAS Wilcoxon Signed-Rank test is available using PROC UNIVARIATE.\n\nproc univariate data=TTR\n    alpha=0.1;\n    var diff;\nrun;\n\n\n\n\n\n\n\n\n\n\n\n\nDataset without ties and N≤20\nNow let’s consider a smaller dataset, created by selecting first 19 observations from our main data.\n\ndata TTR_19;\n    set TTR;\n    if _N_ <= 19;\nrun;\n\n\nproc univariate data=TTR_19\n    alpha=0.1;\n    var diff;\nrun;\n\n\n\n\n\n\n\n\n\n\n\n\nImportant notes on SAS\n\nOnly PROC UNIVARIATE can be used in SAS to perform Wilcoxon Signed-Rank test. SAS documentation details are here.\nIn regards to Wilcoxon S-R test, SAS provides only p value\nHodges-Lehmann estimator or CI are not available and have to be implemented manually\nProvided p value is based on Signed Rank (S) statistic (modification of a common T+). Details are here\nSAS computes exact p values only for N ≤ 20. For larger samples uses an asymptotic t-Student distribution of the test statistic. For more information how the p value is calculated go here\nPROC UNIVARIATE apart from performing Wilcoxon S-R test presents as well basic statistical measures of variability and location, e.g median. The given median is not a “pseudo-median” (median of the Walsh averages), it is a “normal” median of the considered variable.\nUsing CIQUANTNORMAL option we can get confidence limits for quantiles based on normal distribution. There are 5 different definitions for calculation quantiles available. See details from the SAS documentation here. It is important to note, those are not confidence intervals of estimator.\n\n\n\nApproach to 0s and ties in SAS\n\nIn SAS all the 0 differences are disregarded (Hollander and Wolfe, 1973). The sample size N is reduced to reflect the number of discarded zeros.\nTied differences are given an average of the ranks. Statistic S is updated accordingly following Sprent algorythm (Sprent, 1993)."
    +    "objectID": "R/Accelerated_Failure_time_model.html#acceleration-factor-calculation",
    +    "href": "R/Accelerated_Failure_time_model.html#acceleration-factor-calculation",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Acceleration Factor Calculation",
    +    "text": "Acceleration Factor Calculation\n\n# Compute acceleration factor (exponentiated coefficients)\nacceleration_factor <- exp(coef(model_aft))\nacceleration_factor\n\n(Intercept)         age         sex     ph.ecog \n661.6830913   0.9810009   1.6853157   0.7007762"
       },
       {
    -    "objectID": "SAS/wilcoxonsr_HL.html#analysis-in-statxact",
    -    "href": "SAS/wilcoxonsr_HL.html#analysis-in-statxact",
    -    "title": "Wilcoxon signed-rank test in SAS & StatXact®",
    -    "section": "Analysis in StatXact®",
    -    "text": "Analysis in StatXact®\nStatXact® PROCs for SAS users is a clinical trial analysis software from Cytel for exact statistics. Package includes more than 150 procedures for exact inference statistical data and power analysis.\n\nDataset without ties and N > 20\n\n/* Wilxocon S-R test - p values */\nPROC PAIRED DATA=WilcoxonSignedRank_TTR\nALPHA=0.9;\nWI/EX;\nPOPS TRT_B - TRT_A;\nRUN;\n\n\n\n\n\n\n\n\n\n\n\n/* Wilcoxon S-R - H-L estimator and CI */\nPROC PAIRED DATA=WilcoxonSignedRank_TTR \nALPHA=0.9;\nHL/EX;\nPOPS TRT_B - TRT_A;\nRUN;\n\n\n\n\n\n\n\n\n\n\n\n\nImportant notes on StatXact®\n\nOnly PROC PAIRED can be used in StatXact to perform Wilcoxon Signed-Rank test\nFollows Sprent (1993) approach for Wilcoxon Signed-Rank test and Lehmann (1975) for H-L estimate and CI\nProvides exact/non-exact p values, (exact) H-L estimator and exact/non-exact CIs\np value is based on a common T+ statistic (sum of ranks of the positive differences)\n\n\n\nApproach to 0s and ties in StatXact®\n\nUsing ZEROS option we can compute H-L estimate including all differences, but by default 0s are excluded.\nTied differences are given an average of the ranks. Statistic S is updated accordingly following Sprent algorythm (Sprent, 1993)."
    +    "objectID": "R/Accelerated_Failure_time_model.html#interpretation",
    +    "href": "R/Accelerated_Failure_time_model.html#interpretation",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Interpretation",
    +    "text": "Interpretation\n\nFor age,acceleration factor \\(< 1\\) indicates that for each one-unit increase in age, the survival time is slowed down by a factor of 0.98 (or a 2% decreasein survival time).\nFor sex, acceleration factor \\(> 1\\) indicates that males have 68% accelerated survival time.\nAn acceleration factor of ph.ecog \\(< 1\\) suggests a 30% decelerated survival time associated with ph.ecog."
       },
       {
    -    "objectID": "SAS/kruskal_wallis.html",
    -    "href": "SAS/kruskal_wallis.html",
    -    "title": "Kruskal Wallis SAS",
    -    "section": "",
    -    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of R’s datasets::iris, testing for difference in sepal width between species of flower. This data was subset in R and input manually to SAS with a data step.\n\ndata iris_sub;\n    input Species $ Sepal_Width;\n    datalines;\nsetosa 3.4\nsetosa 3.0\nsetosa 3.4\nsetosa 3.2\nsetosa 3.5\nsetosa 3.1\nversicolor 2.7\nversicolor 2.9\nversicolor 2.7\nversicolor 2.6\nversicolor 2.5\nversicolor 2.5\nvirginica 3.0\nvirginica 3.0\nvirginica 3.1\nvirginica 3.8\nvirginica 2.7\nvirginica 3.3\n;\nrun;"
    +    "objectID": "R/Accelerated_Failure_time_model.html#plotting-aft-model-graphically",
    +    "href": "R/Accelerated_Failure_time_model.html#plotting-aft-model-graphically",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Plotting AFT Model Graphically",
    +    "text": "Plotting AFT Model Graphically\n\nsuppressPackageStartupMessages({\nlibrary(survival)\nlibrary(survminer)\nlibrary(ggplot2)\n})\n\n# Fit the AFT model on the lung dataset\naft_model <- survreg(Surv(time, status) ~ age + sex + ph.ecog, data = lung, dist = \"lognormal\")\n\n# Create a new data frame with predicted survival times\ndf <- data.frame(time = lung$time, age = lung$age, sex = lung$sex, ph.ecog = lung$ph.ecog, status=lung$status)\ndf$surv_times <- predict(aft_model, newdata = df)\n\n# Plot the survival curves based on the AFT model\nggsurvplot(survfit(Surv(surv_times, status) ~ 1, data = df),\n           data = df, xlab = \"Time\", ylab = \"Survival Probability\")\n\n\n\n\n\n\n\n\nThe survival curve plotted based on the AFT model for the lung dataset illustrates how the probability of survival changes as time progresses, showing the impact of different covariate levels on survival probabilities."
       },
       {
    -    "objectID": "SAS/kruskal_wallis.html#introduction",
    -    "href": "SAS/kruskal_wallis.html#introduction",
    -    "title": "Kruskal Wallis SAS",
    -    "section": "",
    -    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of R’s datasets::iris, testing for difference in sepal width between species of flower. This data was subset in R and input manually to SAS with a data step.\n\ndata iris_sub;\n    input Species $ Sepal_Width;\n    datalines;\nsetosa 3.4\nsetosa 3.0\nsetosa 3.4\nsetosa 3.2\nsetosa 3.5\nsetosa 3.1\nversicolor 2.7\nversicolor 2.9\nversicolor 2.7\nversicolor 2.6\nversicolor 2.5\nversicolor 2.5\nvirginica 3.0\nvirginica 3.0\nvirginica 3.1\nvirginica 3.8\nvirginica 2.7\nvirginica 3.3\n;\nrun;"
    +    "objectID": "R/Accelerated_Failure_time_model.html#example-of-aft-model-using-weibull-distribution",
    +    "href": "R/Accelerated_Failure_time_model.html#example-of-aft-model-using-weibull-distribution",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Example of AFT model using “Weibull Distribution”",
    +    "text": "Example of AFT model using “Weibull Distribution”\n\n# Fit an AFT model using weibull distribution\nmodel_aft_wb <- survreg(Surv(futime, fustat) ~ age + resid.ds + rx, data = ovarian, dist = \"weibull\")\n# Model summary\nsummary(model_aft_wb)\n\n\nCall:\nsurvreg(formula = Surv(futime, fustat) ~ age + resid.ds + rx, \n    data = ovarian, dist = \"weibull\")\n              Value Std. Error     z      p\n(Intercept) 10.5634     1.3810  7.65  2e-14\nage         -0.0661     0.0190 -3.48 0.0005\nresid.ds    -0.5002     0.3799 -1.32 0.1879\nrx           0.5152     0.3236  1.59 0.1114\nLog(scale)  -0.6577     0.2384 -2.76 0.0058\n\nScale= 0.518 \n\nWeibull distribution\nLoglik(model)= -87.9   Loglik(intercept only)= -98\n    Chisq= 20.17 on 3 degrees of freedom, p= 0.00016 \nNumber of Newton-Raphson Iterations: 6 \nn= 26"
       },
       {
    -    "objectID": "SAS/kruskal_wallis.html#implementing-kruskal-wallis-in-sas",
    -    "href": "SAS/kruskal_wallis.html#implementing-kruskal-wallis-in-sas",
    -    "title": "Kruskal Wallis SAS",
    -    "section": "Implementing Kruskal-Wallis in SAS",
    -    "text": "Implementing Kruskal-Wallis in SAS\nThe Kruskal-Wallis test can be implemented in SAS using the NPAR1WAY procedure with WILCOXON option. Below, the test is defined with the indicator variable (Species) by the CLASS statement, and the response variable (Sepal_Width) by the VAR statement. Adding the EXACT statement outputs the exact p-value in addition to the asymptotic result. The null hypothesis is that the samples are from identical populations.\n\nproc npar1way data=iris_sub wilcoxon;\nclass Species;\nvar Sepal_Width;\nexact;\nrun;"
    +    "objectID": "R/Accelerated_Failure_time_model.html#acceleration-factor-calculation-1",
    +    "href": "R/Accelerated_Failure_time_model.html#acceleration-factor-calculation-1",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Acceleration Factor Calculation",
    +    "text": "Acceleration Factor Calculation\n\n# Compute acceleration factor (exponentiated coefficients)\nacceleration_factor_wb <- exp(coef(model_aft_wb))\nacceleration_factor_wb\n\n (Intercept)          age     resid.ds           rx \n3.869157e+04 9.360366e-01 6.063911e-01 1.673914e+00"
       },
       {
    -    "objectID": "SAS/kruskal_wallis.html#results",
    -    "href": "SAS/kruskal_wallis.html#results",
    -    "title": "Kruskal Wallis SAS",
    -    "section": "Results",
    -    "text": "Results\n\n\n\n\n\n\n\n\n\nAs seen above, SAS outputs a table of Wilcoxon Scores for Sepal_Width by each Species including (per group): the number (N); the sum of scores; the expected sum of scores under the null hypothesis; the standard deviation under the null hypothesis, and the observed mean score. The table also includes a footnote to specify that ties were handled by using the average score.\nA table of the test results gives the Kruskal-Wallis rank sum statistic (10.922), the degrees of freedom (2), and the asymptotic p-value of the test (0.0042), and the exact p-value (0.0008). Therefore, the difference in population medians is statistically significant at the 5% level."
    +    "objectID": "R/Accelerated_Failure_time_model.html#interpretation-1",
    +    "href": "R/Accelerated_Failure_time_model.html#interpretation-1",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Interpretation",
    +    "text": "Interpretation\n\nFor age, an acceleration factor of 0.93 indicates that for each one-unit increase in age, the survival time is decelerated by a factor of 0.93(or a 7% decrease in the survival time)\nFor residual disease status, an acceleration factor of 0.60 suggests that a decrease in residual disease status is associated with a 40% decelerated survival time.\nan acceleration factor of 1.67 suggests a 67% accelerated survival time for patients receiving a different type of radiation therapy (rx = 2) compared to the reference group (rx = 1)."
       },
       {
    -    "objectID": "SAS/ttest_Paired.html",
    -    "href": "SAS/ttest_Paired.html",
    -    "title": "Paired t-test",
    -    "section": "",
    -    "text": "The Paired t-test is used when two samples are naturally correlated. In the Paired t-test, the difference of the means between the two samples is compared to a given number that represents the null hypothesis. For a Paired t-test, the number of observations in each sample must be equal.\nIn SAS, a Paired t-test is typically performed using PROC TTEST.\n\n\nBy default, SAS PROC TTEST t-test assumes normality in the data and uses a classic Student’s t-test.\n\n\nThe following data was used in this example.\n  data pressure;\n     input SBPbefore SBPafter @@;\n     datalines;\n  120 128   124 131   130 131   118 127\n  140 132   128 125   140 141   135 137\n  126 118   130 132   126 129   127 135\n  ;\n\n\n\nThe following code was used to test the comparison of two paired samples of Systolic Blood Pressure before and after a procedure.\n  proc ttest data=pressure;\n     paired SBPbefore*SBPafter;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe SAS paired t-test also supports analysis of lognormal data. Here is the data used for the lognormal analysis.\n\n\n  data auc;\n     input TestAUC RefAUC @@;\n     datalines;\n  103.4 90.11  59.92 77.71  68.17 77.71  94.54 97.51\n  69.48 58.21  72.17 101.3  74.37 79.84  84.44 96.06\n  96.74 89.30  94.26 97.22  48.52 61.62  95.68 85.80\n  ;\n\n\n\nFor cases when the data is lognormal, SAS offers the “DIST” option to chose between a normal and lognormal distribution. The procedure also offers the TOST option to specify the equivalence bounds.\n  proc ttest data=auc dist=lognormal tost(0.8, 1.25);\n     paired TestAUC*RefAUC;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nAs can be seen in the figure above, the lognormal variation of the TTEST procedure offers additional results for geometric mean, coefficient of variation, and TOST equivalence analysis. The output also includes multiple p-values."
    +    "objectID": "R/Accelerated_Failure_time_model.html#survival-curve-plotting-on-ovarian-dataset",
    +    "href": "R/Accelerated_Failure_time_model.html#survival-curve-plotting-on-ovarian-dataset",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Survival Curve Plotting on ‘Ovarian’ Dataset",
    +    "text": "Survival Curve Plotting on ‘Ovarian’ Dataset\n\n# Fit the AFT model (weibull distribution) on your data\nmodel_aft <- survreg(Surv(futime, fustat) ~ age + resid.ds + rx, data = ovarian, dist = \"weibull\")\n\n# Create survival curves for different levels of predictor variables\nplot_data <- with(ovarian, data.frame(age = seq(min(age), max(age), length.out = 100),\n                                      resid.ds = mean(resid.ds),\n                                      rx = mean(rx)))\n\n# Predict survival times based on the AFT model\nplot_data$survival <- predict(model_aft, newdata = plot_data)\n\n# Plot the survival curves\nggplot(plot_data, aes(x = age, y = survival, color = factor(rx), linetype = factor(rx))) +\n  geom_line() +\n  labs(x = \"Age\", y = \"Survival Probability\", color = \"Radiation Therapy\", linetype = \"Radiation Therapy\") +\n  scale_linetype_manual(values = c(\"solid\", \"dashed\", \"dotted\")) +\n  scale_color_manual(values = c(\"blue\", \"red\", \"green\"))\n\n\n\n\n\n\n\n\nThe survival curve plotted based on the AFT model for the ovarian dataset how the probability of survival changes as age increases."
       },
       {
    -    "objectID": "SAS/ttest_Paired.html#normal",
    -    "href": "SAS/ttest_Paired.html#normal",
    -    "title": "Paired t-test",
    -    "section": "",
    -    "text": "By default, SAS PROC TTEST t-test assumes normality in the data and uses a classic Student’s t-test.\n\n\nThe following data was used in this example.\n  data pressure;\n     input SBPbefore SBPafter @@;\n     datalines;\n  120 128   124 131   130 131   118 127\n  140 132   128 125   140 141   135 137\n  126 118   130 132   126 129   127 135\n  ;\n\n\n\nThe following code was used to test the comparison of two paired samples of Systolic Blood Pressure before and after a procedure.\n  proc ttest data=pressure;\n     paired SBPbefore*SBPafter;\n  run;\nOutput:"
    +    "objectID": "R/Accelerated_Failure_time_model.html#conclusion",
    +    "href": "R/Accelerated_Failure_time_model.html#conclusion",
    +    "title": "Accelerated Failure Time Model",
    +    "section": "Conclusion",
    +    "text": "Conclusion\nIn AFT models, unlike Cox proportional hazards models, survival times follow an assumed parametric distribution (e.g., Weibull, log-logistic, log-normal), directly modelling the effect of covariates on the time scale."
       },
       {
    -    "objectID": "SAS/ttest_Paired.html#lognormal",
    -    "href": "SAS/ttest_Paired.html#lognormal",
    -    "title": "Paired t-test",
    +    "objectID": "R/R_Friedmantest.html",
    +    "href": "R/R_Friedmantest.html",
    +    "title": "Friedman Chi-Square test using R package rstatix",
         "section": "",
    -    "text": "The SAS paired t-test also supports analysis of lognormal data. Here is the data used for the lognormal analysis.\n\n\n  data auc;\n     input TestAUC RefAUC @@;\n     datalines;\n  103.4 90.11  59.92 77.71  68.17 77.71  94.54 97.51\n  69.48 58.21  72.17 101.3  74.37 79.84  84.44 96.06\n  96.74 89.30  94.26 97.22  48.52 61.62  95.68 85.80\n  ;\n\n\n\nFor cases when the data is lognormal, SAS offers the “DIST” option to chose between a normal and lognormal distribution. The procedure also offers the TOST option to specify the equivalence bounds.\n  proc ttest data=auc dist=lognormal tost(0.8, 1.25);\n     paired TestAUC*RefAUC;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nAs can be seen in the figure above, the lognormal variation of the TTEST procedure offers additional results for geometric mean, coefficient of variation, and TOST equivalence analysis. The output also includes multiple p-values."
    +    "text": "R 4.3.1\nrstatix 0.7.2"
       },
       {
    -    "objectID": "SAS/survey-stats-summary.html",
    -    "href": "SAS/survey-stats-summary.html",
    -    "title": "Survey Summary Statistics using SAS",
    +    "objectID": "R/R_Friedmantest.html#r-package-version",
    +    "href": "R/R_Friedmantest.html#r-package-version",
    +    "title": "Friedman Chi-Square test using R package rstatix",
         "section": "",
    -    "text": "When conducting large-scale trials on samples of the population, it can be necessary to use a more complex sampling design than a simple random sample.\nAll of these designs need to be taken into account when calculating statistics, and when producing models. Only summary statistics are discussed in this document, and variances are calculated using the default Taylor series linearisation methods. For a more detailed introduction to survey statistics in SAS, see (Lohr 2022) or (SAS/STAT® 15.1 User’s Guide 2018).\nFor survey summary statistics in SAS, we can use the SURVEYMEANS and SURVEYFREQ procedures."
    +    "text": "R 4.3.1\nrstatix 0.7.2"
       },
       {
    -    "objectID": "SAS/survey-stats-summary.html#mean",
    -    "href": "SAS/survey-stats-summary.html#mean",
    -    "title": "Survey Summary Statistics using SAS",
    -    "section": "Mean",
    -    "text": "Mean\nIf we want to calculate a mean of a variable in a dataset which has been obtained from a simple random sample such as apisrs, in SAS we can do the following (nb. here total=6194 is obtained from the constant fpc column, and provides the finite population correction):\nproc surveymeans data=apisrs total=6194 mean;\n    var growth;\nrun;\n                             The SURVEYMEANS Procedure\n\n                                    Data Summary\n\n                        Number of Observations           200\n\n\n                                    Statistics\n\n                                                Std Error\n Variable               N            Mean         of Mean       95% CL for Mean\n ---------------------------------------------------------------------------------\n growth               200       31.900000        2.090493    27.7776382 36.0223618\n ---------------------------------------------------------------------------------"
    +    "objectID": "R/R_Friedmantest.html#data-used",
    +    "href": "R/R_Friedmantest.html#data-used",
    +    "title": "Friedman Chi-Square test using R package rstatix",
    +    "section": "Data used",
    +    "text": "Data used\nSimulated dataset of 10 subjects(blocks) with continuous endpoints are generated for single-drug repeated measurements to check whether any significance exists between the responses(y) at different time points(4 time points simulated)(groups). The p-value will indicate whether differences in response for different time points are significant."
       },
       {
    -    "objectID": "SAS/survey-stats-summary.html#total",
    -    "href": "SAS/survey-stats-summary.html#total",
    -    "title": "Survey Summary Statistics using SAS",
    -    "section": "Total",
    -    "text": "Total\nTo calculate population totals, we can request the sum. However SAS requires the user to specify the weights, otherwise the totals will be incorrect. These weights in this case are equivalent to the total population size divided by the sample size:\ndata apisrs;\n    set apisrs nobs=n;\n    weight = fpc / n;\nrun;\n\nproc surveymeans data=apisrs total=6194 sum;\n    var growth;\n    weight weight;\nrun;\n       The SURVEYMEANS Procedure\n\n              Data Summary\n\n  Number of Observations           200\n  Sum of Weights                  6194\n\n\n               Statistics\n\n                               Std Error\nVariable             Sum          of Sum\n----------------------------------------\ngrowth            197589           12949\n----------------------------------------"
    +    "objectID": "R/R_Friedmantest.html#data-source",
    +    "href": "R/R_Friedmantest.html#data-source",
    +    "title": "Friedman Chi-Square test using R package rstatix",
    +    "section": "Data source",
    +    "text": "Data source\n\nlibrary(dplyr)\n\n\nAttaching package: 'dplyr'\n\n\nThe following objects are masked from 'package:stats':\n\n    filter, lag\n\n\nThe following objects are masked from 'package:base':\n\n    intersect, setdiff, setequal, union\n\nlibrary(rstatix) \n\n\nAttaching package: 'rstatix'\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\n\nset.seed(123)\n\none_way_repeat <- data.frame(subject = rep(1:10, each=4),\n                          timepoint = rep(c(1, 2, 3, 4), times=10),\n                          response =round(runif(n = 40, 10, 50)))\n\nhead(one_way_repeat)\n\n  subject timepoint response\n1       1         1       22\n2       1         2       42\n3       1         3       26\n4       1         4       45\n5       2         1       48\n6       2         2       12"
       },
       {
    -    "objectID": "SAS/survey-stats-summary.html#ratios",
    -    "href": "SAS/survey-stats-summary.html#ratios",
    -    "title": "Survey Summary Statistics using SAS",
    -    "section": "Ratios",
    -    "text": "Ratios\nTo perform ratio analysis for means or proportions of analysis variables in SAS, we can use the following:\nproc surveymeans data=apisrs total=6194;\n    ratio api00 / api99;\nrun;\n                             The SURVEYMEANS Procedure\n\n                                    Data Summary\n\n                        Number of Observations           200\n\n\n                                    Statistics\n\n                                                Std Error\n Variable               N            Mean         of Mean       95% CL for Mean\n ---------------------------------------------------------------------------------\n api00                200      656.585000        9.249722    638.344950 674.825050\n api99                200      624.685000        9.500304    605.950813 643.419187\n ---------------------------------------------------------------------------------\n\n\n                                   Ratio Analysis\n\n                                                          Std\nNumerator Denominator            N           Ratio           Error        95% CL for Ratio\n----------------------------------------------------------------------------------------------\napi00     api99                200        1.051066        0.003604    1.04395882    1.05817265\n----------------------------------------------------------------------------------------------"
    +    "objectID": "R/R_Friedmantest.html#overview",
    +    "href": "R/R_Friedmantest.html#overview",
    +    "title": "Friedman Chi-Square test using R package rstatix",
    +    "section": "Overview",
    +    "text": "Overview\nThe friedman.test() function from the R package ‘rstatix’ computes the following:\n\nFriedman chi-squared statistic\nits degrees of freedom and\np-value for checking whether the mean response is the same for all the time points."
       },
       {
    -    "objectID": "SAS/survey-stats-summary.html#proportions",
    -    "href": "SAS/survey-stats-summary.html#proportions",
    -    "title": "Survey Summary Statistics using SAS",
    -    "section": "Proportions",
    -    "text": "Proportions\nTo calculate a proportion in SAS, we use the PROC SURVEYFREQ, in the simplest case below:\nproc surveyfreq data=apisrs total=6194;\ntable 'sch.wide'n / cl;\nrun;\n                          The SURVEYFREQ Procedure\n\n                                Data Summary\n\n                    Number of Observations           200\n\n\n                             Table of sch.wide\n\n                                       Std Err of    95% Confidence Limits\n sch.wide     Frequency     Percent       Percent         for Percent\n -------------------------------------------------------------------------\n No                  37     18.5000        2.7078     13.1604      23.8396\n Yes                163     81.5000        2.7078     76.1604      86.8396\n\n Total              200    100.0000"
    +    "objectID": "R/R_Friedmantest.html#handling-missing-values",
    +    "href": "R/R_Friedmantest.html#handling-missing-values",
    +    "title": "Friedman Chi-Square test using R package rstatix",
    +    "section": "Handling missing Values",
    +    "text": "Handling missing Values\nWhen the data contain NAs, the function Defaults to getOption(“na.action”) which discards the row with NAs."
       },
       {
    -    "objectID": "SAS/survey-stats-summary.html#quantiles",
    -    "href": "SAS/survey-stats-summary.html#quantiles",
    -    "title": "Survey Summary Statistics using SAS",
    -    "section": "Quantiles",
    -    "text": "Quantiles\nTo calculate quantiles in SAS, we can use the quantile option to request specific quantiles, or can use keywords to request common quantiles (e.g. quartiles or the median). This will use Woodruff’s method for confidence intervals, and a custom quantile method (SAS/STAT® 15.1 User’s Guide 2018, 9834).\nproc surveymeans data=apisrs total=6194 quantile=(0.025 0.5 0.975);\n    var growth;\nrun;\n                             The SURVEYMEANS Procedure\n\n                                    Data Summary\n\n                        Number of Observations           200\n\n\n\n\n                                     Quantiles\n\n                                                      Std\n Variable       Percentile       Estimate           Error    95% Confidence Limits\n ---------------------------------------------------------------------------------\n growth           2.5          -16.500000        1.755916    -19.962591 -13.037409\n                   50 Median    26.500000        1.924351     22.705263  30.294737\n                 97.5           99.000000       16.133827     67.184794 130.815206\n ---------------------------------------------------------------------------------"
    +    "objectID": "R/R_Friedmantest.html#example-code-for-friedman-chi-square-test",
    +    "href": "R/R_Friedmantest.html#example-code-for-friedman-chi-square-test",
    +    "title": "Friedman Chi-Square test using R package rstatix",
    +    "section": "Example Code for Friedman Chi-square test",
    +    "text": "Example Code for Friedman Chi-square test\n\nfriedman.test(y=one_way_repeat$response, groups=one_way_repeat$timepoint, blocks=one_way_repeat$subject)\n\n\n    Friedman rank sum test\n\ndata:  one_way_repeat$response, one_way_repeat$timepoint and one_way_repeat$subject\nFriedman chi-squared = 3.0612, df = 3, p-value = 0.3823\n\n\nwhere:\n\ny - a vector of response values.\ngroups - a vector of values indicating the “group” an observation belongs in.\nblocks - a vector of values indicating the “blocking” variable."
       },
       {
    -    "objectID": "SAS/ranksum.html",
    -    "href": "SAS/ranksum.html",
    -    "title": "Mann-Whitney U/Wilcoxon rank sum test",
    -    "section": "",
    -    "text": "The Mann-Whitney U test, also known as the Wilcoxon rank-sum test, is a nonparametric test used to compare differences between two independent samples. It’s particularly useful when the sample distributions are not normally distributed and the sample sizes are small (typically less than 30).\n\n\nTo perform a Mann-Whitney U test (also known as the Wilcoxon rank-sum test) in SAS, you can use the PROC NPAR1WAY procedure. Here’s a step-by-step guide:\n\nCreate the Dataset: If there are two groups (smoker and non-smoker) with their respective measurements birth weight, you can input the data as follows:\n\n/* Create dataset */\ndata bw;\n    input bw  grp $;\n    datalines;\n3.99    ns\n3.89    ns\n3.6     ns\n3.73    ns\n3.31    ns\n3.7     ns\n4.08    ns\n3.61    ns\n3.83    ns\n3.41    ns\n4.13    ns\n3.36    ns\n3.54    ns\n3.51    ns\n2.71    ns\n3.18    s\n2.74    s\n2.9     s\n3.27    s\n3.65    s\n3.42    s\n3.23    s\n2.86    s\n3.6     s\n3.65    s\n3.69    s\n3.53    s\n2.38    s\n2.34    s\n;\nrun;\n\nPerform the Mann-Whitney U Test: Use the PROC NPAR1WAY procedure to perform the test. The wilcoxon option specifies that you want to perform the Wilcoxon rank-sum test. When computing the asymptotic Wilcoxon two-sample test, PROC NPAR1WAY uses a continuity correction by default. If specify the CORRECT=NO option in the PROC NPAR1WAY statement, the procedure does not use a continuity correction.\n\n/* Perform Mann-Whitney U test - with continuity correction by default*/\nproc npar1way data=BW wilcoxon;\n    class grp;\n    var bw;\nrun;\n\n/* Perform Mann-Whitney U test - without continuity correction*/\nproc npar1way data=BW wilcoxon CORRECT=NO;\n    class grp;\n    var bw;\nrun;\n\n\n\n\n\n\nAs seen above, SAS outputs a table of Wilcoxon Scores for birth weight by non-smoker and smoker: the number (N); the sum of scores; the expected sum of scores under the null hypothesis; the standard deviation under the null hypothesis, and the observed mean score. The table also includes a footnote to specify that ties were handled by using the average score.\nSAS also outputs a table of Wilcoxon Two-sample Test. This table includes a footnote to specify that a continuiity correction of 0.5 is used.\nStatistic: 150.5000\nZ: -2.5756 (This is the test statistic after applying a continuity correction of 0.5)\nPr < Z: 0.0050 (This is the one-tailed p-value). The one-tailed p-value (Pr< Z) of 0.0050 suggests that there is a 0.5% chance of observing a test statistic as extreme as 1.2498 under the null hypothesis.\nPr > |Z|: 0.0100 (This is the two-tailed p-value). The two-tailed p-value (Pr > |Z|) of 0.0100 suggests that there is a 1.00 % chance of observing a test statistic as extreme as 1.2498 in either direction under the null hypothesis.\nThe t-distribution approximations provide similar p-values, indicating the robustness of the results.\nt Approximation Pr < Z: 0.0078 (This is the one-tailed p-value using a t-distribution approximation)\nt Approximation Pr > |Z|: 0.0156 (This is the two-tailed p-value using a t-distribution approximation)\nSince the p-values (both one-tailed and two-tailed) are less than the common significance level (e.g., 0.05), we can reject the null hypothesis. This means there is a significant difference between the two groups (ns and s) for the variable BW.\n\n\n\n\nAs seen above, Wilcoxon Two-Sample Test results are changed because No continuity correction is used."
    +    "objectID": "R/R_Friedmantest.html#references",
    +    "href": "R/R_Friedmantest.html#references",
    +    "title": "Friedman Chi-Square test using R package rstatix",
    +    "section": "References",
    +    "text": "References\nR friedman_test() documentation"
       },
       {
    -    "objectID": "SAS/ranksum.html#mann-whitney-uwilcoxon-rank-sum-test-in-sas",
    -    "href": "SAS/ranksum.html#mann-whitney-uwilcoxon-rank-sum-test-in-sas",
    -    "title": "Mann-Whitney U/Wilcoxon rank sum test",
    +    "objectID": "R/nparestimate.html",
    +    "href": "R/nparestimate.html",
    +    "title": "Non-parametric point estimation",
         "section": "",
    -    "text": "To perform a Mann-Whitney U test (also known as the Wilcoxon rank-sum test) in SAS, you can use the PROC NPAR1WAY procedure. Here’s a step-by-step guide:\n\nCreate the Dataset: If there are two groups (smoker and non-smoker) with their respective measurements birth weight, you can input the data as follows:\n\n/* Create dataset */\ndata bw;\n    input bw  grp $;\n    datalines;\n3.99    ns\n3.89    ns\n3.6     ns\n3.73    ns\n3.31    ns\n3.7     ns\n4.08    ns\n3.61    ns\n3.83    ns\n3.41    ns\n4.13    ns\n3.36    ns\n3.54    ns\n3.51    ns\n2.71    ns\n3.18    s\n2.74    s\n2.9     s\n3.27    s\n3.65    s\n3.42    s\n3.23    s\n2.86    s\n3.6     s\n3.65    s\n3.69    s\n3.53    s\n2.38    s\n2.34    s\n;\nrun;\n\nPerform the Mann-Whitney U Test: Use the PROC NPAR1WAY procedure to perform the test. The wilcoxon option specifies that you want to perform the Wilcoxon rank-sum test. When computing the asymptotic Wilcoxon two-sample test, PROC NPAR1WAY uses a continuity correction by default. If specify the CORRECT=NO option in the PROC NPAR1WAY statement, the procedure does not use a continuity correction.\n\n/* Perform Mann-Whitney U test - with continuity correction by default*/\nproc npar1way data=BW wilcoxon;\n    class grp;\n    var bw;\nrun;\n\n/* Perform Mann-Whitney U test - without continuity correction*/\nproc npar1way data=BW wilcoxon CORRECT=NO;\n    class grp;\n    var bw;\nrun;"
    +    "text": "The Hodges-Lehman estimator (Hodges and Lehmann 1962) provides a point estimate which is associated with the Wilcoxon rank sum statistics based on location shift. This is typically used for the 2-sample comparison with small sample size. Note: The Hodges-Lehman estimates the median of the difference and not the difference of the medians. The corresponding distribution-free confidence interval is also based on the Wilcoxon rank sum statistics (Moses).\nThere are several packages covering this functionality. However, we will focus on the wilcox.test function implemented in R base. The {pairwiseCI} package provides further resources to derive various types of confidence intervals for the pairwise comparison case. This package is very flexible and uses the functions of related packages.\nHodges, J. L. and Lehmann, E. L. (1962) Rank methods for combination of independent experiments in analysis of variance. Annals of Mathematical Statistics, 33, 482-4."
       },
       {
    -    "objectID": "SAS/ranksum.html#results",
    -    "href": "SAS/ranksum.html#results",
    -    "title": "Mann-Whitney U/Wilcoxon rank sum test",
    -    "section": "",
    -    "text": "As seen above, SAS outputs a table of Wilcoxon Scores for birth weight by non-smoker and smoker: the number (N); the sum of scores; the expected sum of scores under the null hypothesis; the standard deviation under the null hypothesis, and the observed mean score. The table also includes a footnote to specify that ties were handled by using the average score.\nSAS also outputs a table of Wilcoxon Two-sample Test. This table includes a footnote to specify that a continuiity correction of 0.5 is used.\nStatistic: 150.5000\nZ: -2.5756 (This is the test statistic after applying a continuity correction of 0.5)\nPr < Z: 0.0050 (This is the one-tailed p-value). The one-tailed p-value (Pr< Z) of 0.0050 suggests that there is a 0.5% chance of observing a test statistic as extreme as 1.2498 under the null hypothesis.\nPr > |Z|: 0.0100 (This is the two-tailed p-value). The two-tailed p-value (Pr > |Z|) of 0.0100 suggests that there is a 1.00 % chance of observing a test statistic as extreme as 1.2498 in either direction under the null hypothesis.\nThe t-distribution approximations provide similar p-values, indicating the robustness of the results.\nt Approximation Pr < Z: 0.0078 (This is the one-tailed p-value using a t-distribution approximation)\nt Approximation Pr > |Z|: 0.0156 (This is the two-tailed p-value using a t-distribution approximation)\nSince the p-values (both one-tailed and two-tailed) are less than the common significance level (e.g., 0.05), we can reject the null hypothesis. This means there is a significant difference between the two groups (ns and s) for the variable BW.\n\n\n\n\nAs seen above, Wilcoxon Two-Sample Test results are changed because No continuity correction is used."
    +    "objectID": "R/nparestimate.html#base",
    +    "href": "R/nparestimate.html#base",
    +    "title": "Non-parametric point estimation",
    +    "section": "{base}",
    +    "text": "{base}\nThe base function provides the Hodges-Lehmann estimate and the Moses confidence interval. The function will provide warnings in case of ties in the data and will not provide the exact confidence interval.\n\nwt <- wilcox.test(x, y, exact = TRUE, conf.int = TRUE)\n\nWarning in wilcox.test.default(x, y, exact = TRUE, conf.int = TRUE): cannot\ncompute exact p-value with ties\n\n\nWarning in wilcox.test.default(x, y, exact = TRUE, conf.int = TRUE): cannot\ncompute exact confidence intervals with ties\n\n# Hodges-Lehmann estimator\nwt$estimate\n\ndifference in location \n             0.5600562 \n\n# Moses confidence interval\nwt$conf.int\n\n[1] -0.3699774  1.1829708\nattr(,\"conf.level\")\n[1] 0.95\n\n\nNote: You can process the long format also for wilcox.test using the formula structure:\n\nwilcox.test(all$value ~ all$treat, exact = TRUE, conf.int = TRUE)\n\nWarning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): cannot\ncompute exact p-value with ties\n\n\nWarning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): cannot\ncompute exact confidence intervals with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  all$value by all$treat\nW = 58, p-value = 0.1329\nalternative hypothesis: true location shift is not equal to 0\n95 percent confidence interval:\n -0.3699774  1.1829708\nsample estimates:\ndifference in location \n             0.5600562"
       },
       {
    -    "objectID": "SAS/SAS_Friedmantest.html",
    -    "href": "SAS/SAS_Friedmantest.html",
    -    "title": "Friedman Chi-Square test using SAS",
    -    "section": "",
    -    "text": "The Friedman test is a non-parametric statistical test developed by Milton Friedman similar to the parametric repeated measures ANOVA. It is used to detect differences in groups across multiple blocks. The procedure involves ranking each row (or block) together, then considering the values of ranks by columns. Applicable to complete block designs, it is thus a special case of the Durbin test.\nThe Friedman test is used for one-way repeated measures analysis of variance by ranks. In its use of ranks it is similar to the Kruskal–Wallis one-way analysis of variance by ranks.\n\n\nSAS 9.4\n\n\n\nSimulated dataset of 10 subjects(blocks) with continuous endpoints are generated for single-drug repeated measurements to check whether any significance exists between the responses(y) at different time points(4 time points simulated)(groups). The p-value will indicate whether differences in response for different time points are significant.\n\n\n\n\ndata one_way_repeat;\n   do subject = 1 to 10;\n    do timepoint = 1 to 4;\n      response = round(rand('Uniform',10,50));\n      output;\n    end;\n   end;\nrun;\n\nproc print;\nrun;\n\n\n\n\nThe FREQ procedure computes CMH statistic, Friedman’s test is identical to the ANOVA (row means scores) CMH statistic when the analysis uses rank scores (SCORES=RANK). The TABLES statement creates a three-way table i.e., timepoint and response stratified by subject. The output produces following statistics along with its degrees of freedom and p-value(Prob):\n\nNonzero Correlation\nRow Mean Scores Differ\n\nThe row corresponding to ‘Row Mean Scores Differ’ gives the required statistic and p-value for Friedman’s test.\n\n\n\nWhen the data contains missing response, the procedure discards the corresponding row and calculates the required statistic with a message about number of missing responses below the test statisitc output.\n\n\n\n\nproc freq data=one_way_repeat;\n      tables subject*timepoint*response / \n             cmh2 scores=rank noprint;\nrun;\n\n\n\n\n                                               The FREQ Procedure\n\n                                  Summary Statistics for timepoint by response\n                                            Controlling for subject\n\n                           Cochran-Mantel-Haenszel Statistics (Based on Rank Scores)\n\n                        Statistic    Alternative Hypothesis    DF       Value      Prob\n                        ---------------------------------------------------------------\n                            1        Nonzero Correlation        1      0.0276    0.8682\n                            2        Row Mean Scores Differ     3      3.6429    0.3027\n\n\n                                             Total Sample Size = 40\n\n\n\nExamples: FREQ Procedure (sas.com)"
    +    "objectID": "R/nparestimate.html#pairwiseci",
    +    "href": "R/nparestimate.html#pairwiseci",
    +    "title": "Non-parametric point estimation",
    +    "section": "{pairwiseCI}",
    +    "text": "{pairwiseCI}\nThe pairwiseCI package requires data to be in a long format to use the formula structure. Via the control parameter the direction can be defined. Setting method to “HL.diff” provides exact confidence intervals together with the Hodges-Lehmann point estimate.\n\n# pairwiseCI is using the formula structure \npairwiseCI(value ~ treat, data = all, \n           method=\"HL.diff\", control=\"B\",\n           conf.level = .95)\n\n  \n95 %-confidence intervals \n Method:  Difference in location (Hodges-Lehmann estimator) \n  \n  \n      estimate lower upper\nA - B     0.56 -0.22 1.082"
       },
       {
    -    "objectID": "SAS/SAS_Friedmantest.html#sas-version",
    -    "href": "SAS/SAS_Friedmantest.html#sas-version",
    -    "title": "Friedman Chi-Square test using SAS",
    +    "objectID": "R/rounding.html",
    +    "href": "R/rounding.html",
    +    "title": "Rounding in R",
         "section": "",
    -    "text": "SAS 9.4"
    +    "text": "Attaching package: 'janitor'\n\n\nThe following objects are masked from 'package:stats':\n\n    chisq.test, fisher.test\n\n\n\nAttaching package: 'dplyr'\n\n\nThe following objects are masked from 'package:stats':\n\n    filter, lag\n\n\nThe following objects are masked from 'package:base':\n\n    intersect, setdiff, setequal, union"
       },
       {
    -    "objectID": "SAS/SAS_Friedmantest.html#data-used",
    -    "href": "SAS/SAS_Friedmantest.html#data-used",
    -    "title": "Friedman Chi-Square test using SAS",
    -    "section": "",
    -    "text": "Simulated dataset of 10 subjects(blocks) with continuous endpoints are generated for single-drug repeated measurements to check whether any significance exists between the responses(y) at different time points(4 time points simulated)(groups). The p-value will indicate whether differences in response for different time points are significant."
    +    "objectID": "R/rounding.html#round-from-r-base",
    +    "href": "R/rounding.html#round-from-r-base",
    +    "title": "Rounding in R",
    +    "section": "round from R base",
    +    "text": "round from R base\nThe round() function in Base R will round to the nearest whole number and ‘rounding to the even number’ when equidistant, meaning that exactly 12.5 rounds to the integer 12. However, this is dependent on OS services and on representation error (since e.g. 0.15 is not represented exactly, the rounding rule applies to the represented number and not to the printed number, and so round(0.15, 1) could be either 0.1 or 0.2).\n\nround(1:9/10+0.05,1)\n\n[1] 0.2 0.2 0.3 0.4 0.6 0.7 0.8 0.9 1.0"
       },
       {
    -    "objectID": "SAS/SAS_Friedmantest.html#data-source",
    -    "href": "SAS/SAS_Friedmantest.html#data-source",
    -    "title": "Friedman Chi-Square test using SAS",
    -    "section": "",
    -    "text": "data one_way_repeat;\n   do subject = 1 to 10;\n    do timepoint = 1 to 4;\n      response = round(rand('Uniform',10,50));\n      output;\n    end;\n   end;\nrun;\n\nproc print;\nrun;"
    +    "objectID": "R/rounding.html#round_half_up-from-package-janitor",
    +    "href": "R/rounding.html#round_half_up-from-package-janitor",
    +    "title": "Rounding in R",
    +    "section": "round_half_up from package janitor",
    +    "text": "round_half_up from package janitor\nNote that the janitor package in R contains a function round_half_up() that rounds away from zero. In this case it rounds to the nearest whole number and ‘away from zero’ or ‘rounding up’ when equidistant, meaning that exactly 12.5 rounds to the integer 13.\n\n#Example code\nmy_number <-c(2.2,3.99,1.2345,7.876,13.8739)\n\nr_0_dec <- round(my_number, digits=0);\nr_1_dec <- round(my_number, digits=1);\nr_2_dec <- round(my_number, digits=2);\nr_3_dec <- round(my_number, digits=3);\n\nr_0_dec\n\n[1]  2  4  1  8 14\n\nr_1_dec\n\n[1]  2.2  4.0  1.2  7.9 13.9\n\nr_2_dec\n\n[1]  2.20  3.99  1.23  7.88 13.87\n\nr_3_dec\n\n[1]  2.200  3.990  1.234  7.876 13.874\n\n\nIf using the janitor package in R, and the function round_half_up(), the results would be the same with the exception of rounding 1.2345 to 3 decimal places where a result of 1.235 would be obtained instead of 1.234. However, in some rare cases, round_half_up() does not return result as expected. There are two kinds of cases for it. 1. Round down for positive decimal like 0.xx5.\n\nround_half_up(524288.1255, digits = 3)\n\n[1] 524288.1\n\n\nThe cause is that when the decimal is stored in binary, the value usually does not exactly the same with the original number. In the example above, 524288.1255 is stored as a value a little less than the original value. Then round_half_up() rounds it down.\n\noptions(digits=22)\n524288.1255\n\n[1] 524288.1254999999655411\n\n\nIn round_half_up(), a small decimal sqrt(.Machine$double.eps) is added before rounding. It avoids some incorrect rounding due to the stored numeric value is a little less than the original value, but does not cover all conditions.\n\nround_half_up <- function (x, digits = 0) \n{\n    posneg <- sign(x)\n    z <- abs(x) * 10^digits\n    z <- z + 0.5 + sqrt(.Machine$double.eps)\n    z <- trunc(z)\n    z <- z/10^digits\n    z * posneg\n}\n\nMore examples can be found from the code below. It creates numeric values containing different digit numbers of integer part and decimal part, and all ending with 5 for rounding.\n\noptions(digits=15) #set digit number to display \nint1 <- c(0,2^(1:19)) #create values of integer part\nround_digits <- 1:7 #define values of rounding digits\ndec1 <- 2^(-round_digits)+10^(-round_digits-1)*5 #create values of decimal part\ndf1 <- cross_join(tibble(int1),tibble(dec1,round_digits)) |>\n  mutate(num1=int1+dec1) #combine integer part and decimal part\ndf1 |> mutate(rounded_num=round_half_up(num1,round_digits)) |> #round the numbers\n  filter(rounded_num<num1) |>  #incorrect if rounded result is less than the original number\n  print.data.frame()\n\n    int1       dec1 round_digits            num1    rounded_num\n1  32768 0.01562550            6  32768.01562550  32768.0156250\n2  65536 0.03125500            5  65536.03125500  65536.0312500\n3 262144 0.06255000            4 262144.06255000 262144.0625000\n4 262144 0.03125500            5 262144.03125500 262144.0312500\n5 524288 0.12550000            3 524288.12550000 524288.1250000\n6 524288 0.00781255            7 524288.00781255 524288.0078125\n\n\n6 of 140 numbers have incorrect results. Most of them are big numbers or long decimals to round.\n\nRound up for positive decimal like 0.4999….\n\n\noptions(digits=16)\nround_half_up(1.4999999851,0)\n\n[1] 2\n\n\nIt occurs when the number is smaller than but so closed to 0.xx5. As described in point 1 above, in round_half_up(), a small decimal sqrt(.Machine$double.eps) is added before rounding, which causes a number bigger than 0.xx5 to be rounded. It occurs only when the decimal is long, so round_half_up() is still reliable.\nAnd the added decimal sqrt(.Machine$double.eps) is necessary. Without it, or even replace it to a smaller decimal, there will be more incorrect results under point 1, as the example below. Some of them are common, e.g. rounding 16.1255 to 3 decimals.\n\n#a new function to round away from zero, by replacing sqrt(.Machine$double.eps) in round_half_up to a smaller number\nround_half_up_test <- function (x, digits = 0){\n  posneg <- sign(x)\n  z <- abs(x) * 10^digits\n  z <- z + 0.5 + .Machine$double.eps *100\n  z <- trunc(z)\n  z <- z/10^digits\n  z * posneg\n}\n\noptions(digits=15) #set digit number to display \ndf1 |> mutate(rounded_num=round_half_up_test(num1,round_digits)) |> #round the numbers\n  filter(rounded_num<num1) |>  #incorrect if rounded result is less than the original number\n  print.data.frame()\n\n     int1       dec1 round_digits            num1    rounded_num\n1       2 0.03125500            5      2.03125500      2.0312500\n2       4 0.01562550            6      4.01562550      4.0156250\n3      16 0.12550000            3     16.12550000     16.1250000\n4      16 0.01562550            6     16.01562550     16.0156250\n5     128 0.12550000            3    128.12550000    128.1250000\n6     128 0.06255000            4    128.06255000    128.0625000\n7     128 0.03125500            5    128.03125500    128.0312500\n8    8192 0.25500000            2   8192.25500000   8192.2500000\n9   16384 0.12550000            3  16384.12550000  16384.1250000\n10  32768 0.25500000            2  32768.25500000  32768.2500000\n11  32768 0.01562550            6  32768.01562550  32768.0156250\n12  65536 0.12550000            3  65536.12550000  65536.1250000\n13  65536 0.03125500            5  65536.03125500  65536.0312500\n14 262144 0.06255000            4 262144.06255000 262144.0625000\n15 262144 0.03125500            5 262144.03125500 262144.0312500\n16 524288 0.12550000            3 524288.12550000 524288.1250000\n17 524288 0.00781255            7 524288.00781255 524288.0078125"
       },
       {
    -    "objectID": "SAS/SAS_Friedmantest.html#overview",
    -    "href": "SAS/SAS_Friedmantest.html#overview",
    -    "title": "Friedman Chi-Square test using SAS",
    -    "section": "",
    -    "text": "The FREQ procedure computes CMH statistic, Friedman’s test is identical to the ANOVA (row means scores) CMH statistic when the analysis uses rank scores (SCORES=RANK). The TABLES statement creates a three-way table i.e., timepoint and response stratified by subject. The output produces following statistics along with its degrees of freedom and p-value(Prob):\n\nNonzero Correlation\nRow Mean Scores Differ\n\nThe row corresponding to ‘Row Mean Scores Differ’ gives the required statistic and p-value for Friedman’s test."
    +    "objectID": "R/rounding.html#other-methods",
    +    "href": "R/rounding.html#other-methods",
    +    "title": "Rounding in R",
    +    "section": "Other methods",
    +    "text": "Other methods\nhttps://stackoverflow.com/a/12688836 discussed multiple algorithms to round away from zero, including the one implemented in round_half_up(). Below is another algorithm modified from it.\n\nround_v2 <- function(x, digits = 0, eps = .Machine$double.eps) round(x + x * eps, digits = digits)\n\nLike round_half_up(), it also contains the two kinds of incorrect results. And like round_half_up(), a small decimal is added to make 0.xx5 round up. The parameter eps is provided to let user decide which small decimal to add.\nTo avoid the rounding issue totally, the only way is to increase precision, e.g. using package Rmpfr. It will need CPU resource. And it’s not always necessary considering the accuracy of current functions."
       },
       {
    -    "objectID": "SAS/SAS_Friedmantest.html#handling-missing-values",
    -    "href": "SAS/SAS_Friedmantest.html#handling-missing-values",
    -    "title": "Friedman Chi-Square test using SAS",
    -    "section": "",
    -    "text": "When the data contains missing response, the procedure discards the corresponding row and calculates the required statistic with a message about number of missing responses below the test statisitc output."
    +    "objectID": "R/rounding.html#conclusion",
    +    "href": "R/rounding.html#conclusion",
    +    "title": "Rounding in R",
    +    "section": "Conclusion",
    +    "text": "Conclusion\nSo far, round_half_up() from package janitor is still one of the best solutions to round away from zero, though users may meet incorrect results in rare cases when the numbers are big or the decimal is long.\n\noptions(digits = 7) #This just returns the number of displayed digits back to the default"
       },
       {
    -    "objectID": "SAS/SAS_Friedmantest.html#example-code-for-friedman-chi-square-test",
    -    "href": "SAS/SAS_Friedmantest.html#example-code-for-friedman-chi-square-test",
    -    "title": "Friedman Chi-Square test using SAS",
    +    "objectID": "R/ancova.html",
    +    "href": "R/ancova.html",
    +    "title": "Ancova",
         "section": "",
    -    "text": "proc freq data=one_way_repeat;\n      tables subject*timepoint*response / \n             cmh2 scores=rank noprint;\nrun;"
    +    "text": "In this example, we’re looking at Analysis of Covariance. ANCOVA is typically used to analyse treatment differences, to see examples of prediction models go to the simple linear regression page."
       },
       {
    -    "objectID": "SAS/SAS_Friedmantest.html#results",
    -    "href": "SAS/SAS_Friedmantest.html#results",
    -    "title": "Friedman Chi-Square test using SAS",
    +    "objectID": "R/ancova.html#introduction",
    +    "href": "R/ancova.html#introduction",
    +    "title": "Ancova",
         "section": "",
    -    "text": "The FREQ Procedure\n\n                                  Summary Statistics for timepoint by response\n                                            Controlling for subject\n\n                           Cochran-Mantel-Haenszel Statistics (Based on Rank Scores)\n\n                        Statistic    Alternative Hypothesis    DF       Value      Prob\n                        ---------------------------------------------------------------\n                            1        Nonzero Correlation        1      0.0276    0.8682\n                            2        Row Mean Scores Differ     3      3.6429    0.3027\n\n\n                                             Total Sample Size = 40"
    +    "text": "In this example, we’re looking at Analysis of Covariance. ANCOVA is typically used to analyse treatment differences, to see examples of prediction models go to the simple linear regression page."
       },
       {
    -    "objectID": "SAS/SAS_Friedmantest.html#references",
    -    "href": "SAS/SAS_Friedmantest.html#references",
    -    "title": "Friedman Chi-Square test using SAS",
    -    "section": "",
    -    "text": "Examples: FREQ Procedure (sas.com)"
    +    "objectID": "R/ancova.html#data-summary",
    +    "href": "R/ancova.html#data-summary",
    +    "title": "Ancova",
    +    "section": "Data Summary",
    +    "text": "Data Summary\n\ndf_sas %>% glimpse()\n\nRows: 30\nColumns: 3\n$ drug <fct> A, A, A, A, A, A, A, A, A, A, D, D, D, D, D, D, D, D, D, D, F, F,…\n$ pre  <dbl> 11, 8, 5, 14, 19, 6, 10, 6, 11, 3, 6, 6, 7, 8, 18, 8, 19, 8, 5, 1…\n$ post <dbl> 6, 0, 2, 8, 11, 4, 13, 1, 8, 0, 0, 2, 3, 1, 18, 4, 14, 9, 1, 9, 1…\n\ndf_sas %>% summary()\n\n drug        pre             post      \n A:10   Min.   : 3.00   Min.   : 0.00  \n D:10   1st Qu.: 7.00   1st Qu.: 2.00  \n F:10   Median :10.50   Median : 7.00  \n        Mean   :10.73   Mean   : 7.90  \n        3rd Qu.:13.75   3rd Qu.:12.75  \n        Max.   :21.00   Max.   :23.00"
       },
       {
    -    "objectID": "SAS/mmrm.html",
    -    "href": "SAS/mmrm.html",
    -    "title": "MMRM in SAS",
    -    "section": "",
    -    "text": "Mixed Models\n\nFitting the MMRM in SAS\nIn SAS the following code was used (assessments at avisitn=0 should also be removed from the response variable):\n\nproc mixed data=adlbh;\n  where base ne . and avisitn not in (., 99);\n  class usubjid trtpn(ref=\"0\") avisitn;\n  by paramcd param;\n  model chg=base trtpn avisitn  trtpn*avisitn / solution cl alpha=0.05 ddfm=KR;\n  repeated avisitn/subject=usubjid type=&covar;\n  lsmeans trtpn * avisitn / diff cl slice=avisitn;\n  lsmeans trtpn / diff cl;\nrun;\n\nwhere the macro variable covar could be UN, CS or AR(1). The results were stored in .csv files that were post-processed in R and compared with the results from R."
    +    "objectID": "R/ancova.html#the-model",
    +    "href": "R/ancova.html#the-model",
    +    "title": "Ancova",
    +    "section": "The Model",
    +    "text": "The Model\n\nmodel_ancova <- lm(post ~ drug + pre, data = df_sas)\nmodel_glance <- model_ancova %>% glance()\nmodel_tidy   <- model_ancova %>% tidy()\nmodel_glance %>% gt()\n\n\n\n\n\n\n\nr.squared\nadj.r.squared\nsigma\nstatistic\np.value\ndf\nlogLik\nAIC\nBIC\ndeviance\ndf.residual\nnobs\n\n\n\n\n0.6762609\n0.6389064\n4.005778\n18.10386\n1.501369e-06\n3\n-82.05377\n174.1075\n181.1135\n417.2026\n26\n30\n\n\n\n\n\n\nmodel_tidy   %>% gt()\n\n\n\n\n\n\n\nterm\nestimate\nstd.error\nstatistic\np.value\n\n\n\n\n(Intercept)\n-3.8808094\n1.9862017\n-1.9538849\n6.155192e-02\n\n\ndrugD\n0.1089713\n1.7951351\n0.0607037\n9.520594e-01\n\n\ndrugF\n3.4461383\n1.8867806\n1.8264647\n7.928458e-02\n\n\npre\n0.9871838\n0.1644976\n6.0012061\n2.454330e-06\n\n\n\n\n\n\n\n\nmodel_table <- \n  model_ancova %>% \n  anova() %>% \n  tidy() %>% \n  add_row(term = \"Total\", df = sum(.$df), sumsq = sum(.$sumsq))\nmodel_table %>% gt()\n\n\n\n\n\n\n\nterm\ndf\nsumsq\nmeansq\nstatistic\np.value\n\n\n\n\ndrug\n2\n293.6000\n146.80000\n9.148553\n9.812371e-04\n\n\npre\n1\n577.8974\n577.89740\n36.014475\n2.454330e-06\n\n\nResiduals\n26\n417.2026\n16.04625\nNA\nNA\n\n\nTotal\n29\n1288.7000\nNA\nNA\nNA\n\n\n\n\n\n\n\n\nType 1\n\ndf_sas %>%\n  anova_test(post ~ drug + pre, type = 1, detailed = TRUE) %>% \n  get_anova_table() %>%\n  gt()\n\n\n\n\n\n\n\nEffect\nDFn\nDFd\nSSn\nSSd\nF\np\np<.05\nges\n\n\n\n\ndrug\n2\n26\n293.600\n417.203\n9.149\n9.81e-04\n*\n0.413\n\n\npre\n1\n26\n577.897\n417.203\n36.014\n2.45e-06\n*\n0.581\n\n\n\n\n\n\n\n\n\nType 2\n\ndf_sas %>% \n  anova_test(post ~ drug + pre, type = 2, detailed = TRUE) %>% \n  get_anova_table() %>% \n  gt()\n\n\n\n\n\n\n\nEffect\nSSn\nSSd\nDFn\nDFd\nF\np\np<.05\nges\n\n\n\n\ndrug\n68.554\n417.203\n2\n26\n2.136\n1.38e-01\n\n0.141\n\n\npre\n577.897\n417.203\n1\n26\n36.014\n2.45e-06\n*\n0.581\n\n\n\n\n\n\n\n\n\nType 3\n\ndf_sas %>%\n  anova_test(post ~ drug + pre, type = 3, detailed = TRUE) %>% \n  get_anova_table() %>% \n  gt()\n\n\n\n\n\n\n\nEffect\nSSn\nSSd\nDFn\nDFd\nF\np\np<.05\nges\n\n\n\n\n(Intercept)\n31.929\n417.203\n1\n26\n1.990\n1.70e-01\n\n0.071\n\n\ndrug\n68.554\n417.203\n2\n26\n2.136\n1.38e-01\n\n0.141\n\n\npre\n577.897\n417.203\n1\n26\n36.014\n2.45e-06\n*\n0.581\n\n\n\n\n\n\n\n\n\nLS Means\n\nmodel_ancova %>% emmeans::lsmeans(\"drug\") %>% emmeans::pwpm(pvals = TRUE, means = TRUE) \n\n        A       D       F\nA [ 6.71]  0.9980  0.1809\nD  -0.109 [ 6.82]  0.1893\nF  -3.446  -3.337 [10.16]\n\nRow and column labels: drug\nUpper triangle: P values   adjust = \"tukey\"\nDiagonal: [Estimates] (lsmean) \nLower triangle: Comparisons (estimate)   earlier vs. later\n\nmodel_ancova %>% emmeans::lsmeans(\"drug\") %>% plot(comparisons = TRUE)"
       },
       {
    -    "objectID": "SAS/manova.html",
    -    "href": "SAS/manova.html",
    -    "title": "Multivariate Analysis of Variance in SAS",
    -    "section": "",
    -    "text": "Example 39.6 Multivariate Analysis of Variance from SAS MANOVA User Guide\nThis example employs multivariate analysis of variance (MANOVA) to measure differences in the chemical characteristics of ancient pottery found at four kiln sites in Great Britain. The data are from Tubb, Parker, and Nickless (1980), as reported in Hand et al. (1994).\nFor each of 26 samples of pottery, the percentages of oxides of five metals are measured. The following statements create the data set and invoke the GLM procedure to perform a one-way MANOVA. Additionally, it is of interest to know whether the pottery from one site in Wales (Llanederyn) differs from the samples from other sites; a CONTRAST statement is used to test this hypothesis.\n\n    #Example code\n    title \"Romano-British Pottery\";\n   data pottery;\n      input Site $12. Al Fe Mg Ca Na;\n      datalines;\n   Llanederyn   14.4 7.00 4.30 0.15 0.51\n   Llanederyn   13.8 7.08 3.43 0.12 0.17\n   Llanederyn   14.6 7.09 3.88 0.13 0.20\n   Llanederyn   11.5 6.37 5.64 0.16 0.14\n   Llanederyn   13.8 7.06 5.34 0.20 0.20\n   Llanederyn   10.9 6.26 3.47 0.17 0.22\n   Llanederyn   10.1 4.26 4.26 0.20 0.18\n   Llanederyn   11.6 5.78 5.91 0.18 0.16\n   Llanederyn   11.1 5.49 4.52 0.29 0.30\n   Llanederyn   13.4 6.92 7.23 0.28 0.20\n   Llanederyn   12.4 6.13 5.69 0.22 0.54\n   Llanederyn   13.1 6.64 5.51 0.31 0.24\n   Llanederyn   12.7 6.69 4.45 0.20 0.22\n   Llanederyn   12.5 6.44 3.94 0.22 0.23\n   Caldicot     11.8 5.44 3.94 0.30 0.04\n   Caldicot     11.6 5.39 3.77 0.29 0.06\n   IslandThorns 18.3 1.28 0.67 0.03 0.03\n   IslandThorns 15.8 2.39 0.63 0.01 0.04\n   IslandThorns 18.0 1.50 0.67 0.01 0.06\n   IslandThorns 18.0 1.88 0.68 0.01 0.04\n   IslandThorns 20.8 1.51 0.72 0.07 0.10\n   AshleyRails  17.7 1.12 0.56 0.06 0.06\n   AshleyRails  18.3 1.14 0.67 0.06 0.05\n   AshleyRails  16.7 0.92 0.53 0.01 0.05\n   AshleyRails  14.8 2.74 0.67 0.03 0.05\n   AshleyRails  19.1 1.64 0.60 0.10 0.03\n   ;\n   run;\n   \n   proc glm data=pottery;\n      class Site;\n      model Al Fe Mg Ca Na = Site;\n      contrast 'Llanederyn vs. the rest' Site 1 1 1 -3;\n      manova h=_all_ / printe printh;\n   run;\n\nAfter the summary information (1), PROC GLM produces the univariate analyses for each of the dependent variables (2-6). These analyses show that sites are significantly different for all oxides individually. You can suppress these univariate analyses by specifying the NOUNI option in the MODEL statement.\n1 Summary Information about Groups\n\n\n\n\n\n\n\n\n\n2 Univariate Analysis of Variance for Aluminum Oxide (AI)\n\n\n\n\n\n\n\n\n\n3 Univariate Analysis of Variance for Iron Oxide (Fe)\n\n\n\n\n\n\n\n\n\n4 Univariate Analysis of Variance for Calcium Oxide (Ca)\n\n\n\n\n\n\n\n\n\n5 Univariate Analysis of Variance for Magnesium Oxide (Mg)\n\n\n\n\n\n\n\n\n\n6 Analysis of Variance for Sodium Oxide (Na)\n\n\n\n\n\n\n\n\n\nThe PRINTE option in the MANOVA statement displays the elements of the error matrix (7), also called the Error Sums of Squares and Crossproducts matrix. The diagonal elements of this matrix are the error sums of squares from the corresponding univariate analyses.\nThe PRINTE option also displays the partial correlation matrix (7) associated with the E matrix. In this example, none of the oxides are very strongly correlated; the strongest correlation (r=0.488) is between magnesium oxide and calcium oxide.\n7 Error SSCP Matrix and Partial Correlations\n\n\n\n\n\n\n\n\n\nThe PRINTH option produces the SSCP matrix for the hypotheses being tested (Site and the contrast); (8 and 9). Since the Type III SS are the highest-level SS produced by PROC GLM by default, and since the HTYPE= option is not specified, the SSCP matrix for Site gives the Type III H matrix. The diagonal elements of this matrix are the model sums of squares from the corresponding univariate analyses.\nFour multivariate tests are computed, all based on the characteristic roots and vectors of \\(E^{-1}H\\). These roots and vectors are displayed along with the tests. All four tests can be transformed to variates that have distributions under the null hypothesis. Note that the four tests all give the same results for the contrast, since it has only one degree of freedom. In this case, the multivariate analysis matches the univariate results: there is an overall difference between the chemical composition of samples from different sites, and the samples from Llanederyn are different from the average of the other sites.\n8 Hypothesis SSCP Matrix and Multivariate Tests for Overall Site Effect\n\n\n\n\n\n\n\n\n\n9 Hypothesis SSCP Matrix and Multivariate Tests for Differences between Llanederyn and the Other Sites\n\n\n\n\n\n\n\n\n\nReferences\nSAS MANOVA User Guide"
    +    "objectID": "R/ancova.html#saslm-package",
    +    "href": "R/ancova.html#saslm-package",
    +    "title": "Ancova",
    +    "section": "sasLM Package",
    +    "text": "sasLM Package\nThe following code performs an ANCOVA analysis using the sasLM package. This package was written specifically to replicate SAS statistics. The console output is also organized in a manner that is similar to SAS.\n\nlibrary(sasLM)\n\nsasLM::GLM(post ~ drug + pre, df_sas, BETA = TRUE, EMEAN = TRUE)\n\n$ANOVA\nResponse : post\n                Df Sum Sq Mean Sq F value    Pr(>F)    \nMODEL            3  871.5 290.499  18.104 1.501e-06 ***\nRESIDUALS       26  417.2  16.046                      \nCORRECTED TOTAL 29 1288.7                              \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$Fitness\n Root MSE post Mean Coef Var  R-square  Adj R-sq\n 4.005778       7.9 50.70604 0.6762609 0.6389064\n\n$`Type I`\n     Df Sum Sq Mean Sq F value    Pr(>F)    \ndrug  2  293.6   146.8  9.1486 0.0009812 ***\npre   1  577.9   577.9 36.0145 2.454e-06 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$`Type II`\n     Df Sum Sq Mean Sq F value    Pr(>F)    \ndrug  2  68.55   34.28  2.1361    0.1384    \npre   1 577.90  577.90 36.0145 2.454e-06 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$`Type III`\n     Df Sum Sq Mean Sq F value    Pr(>F)    \ndrug  2  68.55   34.28  2.1361    0.1384    \npre   1 577.90  577.90 36.0145 2.454e-06 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$Parameter\n            Estimate Estimable Std. Error Df t value  Pr(>|t|)    \n(Intercept)  -0.4347         0     2.4714 26 -0.1759   0.86175    \ndrugA        -3.4461         0     1.8868 26 -1.8265   0.07928 .  \ndrugD        -3.3372         0     1.8539 26 -1.8001   0.08346 .  \ndrugF         0.0000         0     0.0000 26                      \npre           0.9872         1     0.1645 26  6.0012 2.454e-06 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$`Expected Mean`\n               LSmean  LowerCL   UpperCL        SE Df\n(Intercept)  7.900000 6.396685  9.403315 0.7313516 26\ndrugA        6.714963 4.066426  9.363501 1.2884943 26\ndrugD        6.823935 4.208337  9.439532 1.2724690 26\ndrugF       10.161102 7.456182 12.866021 1.3159234 26\npre          7.900000 6.396685  9.403315 0.7313516 26\n\n\nNote that the LSMEANS statistics are produced using the EMEAN = TRUE option. The BETA = TRUE option is equivalent to the SOLUTION option in SAS. See the sasLM documentation for additional information."
       },
       {
    -    "objectID": "SAS/summary-stats.html",
    -    "href": "SAS/summary-stats.html",
    -    "title": "Deriving Quantiles or Percentiles in SAS",
    +    "objectID": "R/mmrm.html",
    +    "href": "R/mmrm.html",
    +    "title": "MMRM in R",
         "section": "",
    -    "text": "Percentiles can be calculated in SAS using the UNIVARIATE procedure. The procedure has the option PCTLDEF which allows for five different percentile definitions to be used. The default is PCTLDEF=5, which uses the empirical distribution function to find percentiles.\nThis is how the 25th and 40th percentiles of aval in the dataset adlb could be calculated, using the default option for PCTLDEF.\n\nproc univariate data=adlb;\n  var aval;\n  output out=stats pctlpts=25 40 pctlpre=p;\nrun;\n\nThe pctlpre=p option tells SAS the prefix to use in the output dataset for the percentile results. In the above example, SAS will create a dataset called stats, containing variables p25 and p40."
    +    "text": "Mixed models for repeated measures (MMRM) are a popular choice for analyzing longitudinal continuous outcomes in randomized clinical trials and beyond; see Cnaan, Laird and Slasor (1997) for a tutorial and Mallinckrodt, Lane and Schnell (2008) for a review.\nThis vignette shows examples from the mmrm package.\nThe mmrm package implements MMRM based on the marginal linear model without random effects using Template Model Builder (TMB) which enables fast and robust model fitting. Users can specify a variety of covariance matrices, weight observations, fit models with restricted or standard maximum likelihood inference, perform hypothesis testing with Satterthwaite or Kenward-Roger adjustment, and extract least square means estimates by using emmeans.\n\n\n\nFlexible covariance specification:\n\nStructures: unstructured, Toeplitz, AR1, compound symmetry, ante-dependence, and spatial exponential.\nGroups: shared covariance structure for all subjects or group-specific covariance estimates.\nVariances: homogeneous or heterogeneous across time points.\n\nInference:\n\nSupports REML and ML.\nSupports weights.\n\nHypothesis testing:\n\nLeast square means: can be obtained with the emmeans package\nOne- and multi-dimensional linear contrasts of model parameters can be tested.\nSatterthwaite adjusted degrees of freedom.\nKenward-Roger adjusted degrees of freedom and coefficients covariance matrix.\nCoefficient Covariance\n\nC++ backend:\n\nFast implementation using C++ and automatic differentiation to obtain precise gradient information for model fitting.\nModel fitting algorithm details used in mmrm.\n\nPackage ecosystems integration:\n\nIntegration with tidymodels package ecosystem\n\nDedicated parsnip engine for linear regression\nIntegration with recipes\n\nIntegration with tern package ecosystems\n\nThe tern.mmrm package can be used to run the mmrm fit and generate tabulation and plots of least square means per visit and treatment arm, tabulation of model diagnostics, diagnostic graphs, and other standard model outputs.\n\n\n\n\n\n\nSee also the introductory vignette\nThe code below implements an MMRM fit in R with the mmrm::mmrm function.\n\nlibrary(mmrm)\nfit <- mmrm(\n  formula = FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID),\n  data = fev_data\n)\n\nThe code specifies an MMRM with the given covariates and an unstructured covariance matrix for the timepoints (also called visits in the clinical trial context, here given by AVISIT) within the subjects (here USUBJID). While by default this uses restricted maximum likelihood (REML), it is also possible to use ML, see ?mmrm.\nPrinting the object will show you output which should be familiar to anyone who has used any popular modeling functions such as stats::lm(), stats::glm(), glmmTMB::glmmTMB(), and lme4::nlmer(). From this print out we see the function call, the data used, the covariance structure with number of variance parameters, as well as the likelihood method, and model deviance achieved. Additionally the user is provided a printout of the estimated coefficients and the model convergence information:\n\nfit\n\nmmrm fit\n\nFormula:     FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID)\nData:        fev_data (used 537 observations from 197 subjects with maximum 4 \ntimepoints)\nCovariance:  unstructured (10 variance parameters)\nInference:   REML\nDeviance:    3386.45\n\nCoefficients: \n                  (Intercept) RACEBlack or African American \n                  30.77747548                    1.53049977 \n                    RACEWhite                     SEXFemale \n                   5.64356535                    0.32606192 \n                     ARMCDTRT                    AVISITVIS2 \n                   3.77423004                    4.83958845 \n                   AVISITVIS3                    AVISITVIS4 \n                  10.34211288                   15.05389826 \n          ARMCDTRT:AVISITVIS2           ARMCDTRT:AVISITVIS3 \n                  -0.04192625                   -0.69368537 \n          ARMCDTRT:AVISITVIS4 \n                   0.62422703 \n\nModel Inference Optimization:\nConverged with code 0 and message: convergence: rel_reduction_of_f <= factr*epsmch\n\n\nThe summary() method then provides the coefficients table with Satterthwaite degrees of freedom as well as the covariance matrix estimate:\n\nfit |>\n  summary()\n\nmmrm fit\n\nFormula:     FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID)\nData:        fev_data (used 537 observations from 197 subjects with maximum 4 \ntimepoints)\nCovariance:  unstructured (10 variance parameters)\nMethod:      Satterthwaite\nVcov Method: Asymptotic\nInference:   REML\n\nModel selection criteria:\n     AIC      BIC   logLik deviance \n  3406.4   3439.3  -1693.2   3386.4 \n\nCoefficients: \n                               Estimate Std. Error        df t value Pr(>|t|)\n(Intercept)                    30.77748    0.88656 218.80000  34.715  < 2e-16\nRACEBlack or African American   1.53050    0.62448 168.67000   2.451 0.015272\nRACEWhite                       5.64357    0.66561 157.14000   8.479 1.56e-14\nSEXFemale                       0.32606    0.53195 166.13000   0.613 0.540744\nARMCDTRT                        3.77423    1.07415 145.55000   3.514 0.000589\nAVISITVIS2                      4.83959    0.80172 143.88000   6.037 1.27e-08\nAVISITVIS3                     10.34211    0.82269 155.56000  12.571  < 2e-16\nAVISITVIS4                     15.05390    1.31281 138.47000  11.467  < 2e-16\nARMCDTRT:AVISITVIS2            -0.04193    1.12932 138.56000  -0.037 0.970439\nARMCDTRT:AVISITVIS3            -0.69369    1.18765 158.17000  -0.584 0.559996\nARMCDTRT:AVISITVIS4             0.62423    1.85085 129.72000   0.337 0.736463\n                                 \n(Intercept)                   ***\nRACEBlack or African American *  \nRACEWhite                     ***\nSEXFemale                        \nARMCDTRT                      ***\nAVISITVIS2                    ***\nAVISITVIS3                    ***\nAVISITVIS4                    ***\nARMCDTRT:AVISITVIS2              \nARMCDTRT:AVISITVIS3              \nARMCDTRT:AVISITVIS4              \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\nCovariance estimate:\n        VIS1    VIS2    VIS3    VIS4\nVIS1 40.5537 14.3960  4.9747 13.3867\nVIS2 14.3960 26.5715  2.7855  7.4745\nVIS3  4.9747  2.7855 14.8979  0.9082\nVIS4 13.3867  7.4745  0.9082 95.5568\n\n\n\n\n\nIn order to extract relevant marginal means (LSmeans) and contrasts we can use the emmeans package. This package includes methods that allow mmrm objects to be used with the emmeans package. emmeans computes estimated marginal means (also called least-square means) for the coefficients of the MMRM.\n\nif (require(emmeans)) {\n  emmeans(fit, ~ ARMCD | AVISIT)\n}\n\nLoading required package: emmeans\n\n\nmmrm() registered as emmeans extension\n\n\nWelcome to emmeans.\nCaution: You lose important information if you filter this package's results.\nSee '? untidy'\n\n\nAVISIT = VIS1:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     33.3 0.755 148     31.8     34.8\n TRT     37.1 0.763 143     35.6     38.6\n\nAVISIT = VIS2:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     38.2 0.612 147     37.0     39.4\n TRT     41.9 0.602 143     40.7     43.1\n\nAVISIT = VIS3:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     43.7 0.462 130     42.8     44.6\n TRT     46.8 0.509 130     45.7     47.8\n\nAVISIT = VIS4:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     48.4 1.189 134     46.0     50.7\n TRT     52.8 1.188 133     50.4     55.1\n\nResults are averaged over the levels of: RACE, SEX \nConfidence level used: 0.95 \n\n\nNote that the degrees of freedom choice is inherited here from the initial mmrm fit."
       },
       {
    -    "objectID": "SAS/ttest_2Sample.html",
    -    "href": "SAS/ttest_2Sample.html",
    -    "title": "Independant Two-Sample t-test",
    +    "objectID": "R/mmrm.html#fitting-the-mmrm-in-r",
    +    "href": "R/mmrm.html#fitting-the-mmrm-in-r",
    +    "title": "MMRM in R",
         "section": "",
    -    "text": "Data Used\nThe following data was used in this example.\ndata d1;\n  length trt_grp $ 9;\n  input trt_grp $ WtGain @@;\n  datalines;\nplacebo    94 placebo    12 placebo    26 placebo    89 \nplacebo    88 placebo    96 placebo    85 placebo   130 \nplacebo    75 placebo    54 placebo   112 placebo    69 \nplacebo   104 placebo    95 placebo    53 placebo    21 \ntreatment  45 treatment  62 treatment  96 treatment 128 \ntreatment 120 treatment  99 treatment  28 treatment  50 \ntreatment 109 treatment 115 treatment  39 treatment  96 \ntreatment  87 treatment 100 treatment  76 treatment  80 \n;\nrun;\n\n\n\nIndependent Two-Sample t-test in SAS\nThe null hypothesis of the Independent Samples t-test is, the means for the two populations are equal.\nIn SAS the following code was used to test the mean comparison (mean of Weight Gain) of two independent treatment groups (Treatment and Placebo).\nFor this example, we’re testing the significant difference in mean of Weight gain (WtGain) between treatment and placebo (trt_grp) using PROC TTEST procedure in SAS.\n\n  proc ttest data=d1; \n     class trt_grp; \n     var WtGain; \n  run; \n\nOutput:\n             Figure 1: Test results for independent t-test using PROC TTEST in SAS\n\n\n\n\n\n\n\n\n\nHere the t-value is –0.70, degrees of freedom is 30 and P value is 0.4912 which is greater than 0.05, so we accept the null hypothesis that there is no evidence of a significant difference between the means of treatment groups. The mean in placebo group is 75.1875 and mean in Treatment group is 83.1250. The mean difference the treatment groups (Treatment-Placebo) is –7.9375 and the 95% CI for the mean difference is [–31.1984, 15.3234]. The 95% confidence interval includes a treatment difference of 0, which supports the conclusion that the data fail to provide any evidence of a difference between the treatment groups.\nNote: Before entering straight into the t-test we need to check whether the assumptions (like the equality of variance, the observations should be independent, observations should be normally distributed) are met or not. If normality is not satisfied, we may consider using a suitable non-parametric test.\n\nNormality: You can check for data to be normally distributed by plotting a histogram of the data by treatment. Alternatively, you can use the Shapiro-Wilk test or the Kolmogorov-Smirnov test. If the test is <0.05 and your sample is quite small then this suggests you should not use the t-test. However, if your sample in each treatment group is large (say >30 in each group), then you do not need to rely so heavily on the assumption that the data have an underlying normal distribution in order to apply the two-sample t-test. This is where plotting the data using histograms can help to support investigation into the normality assumption. We have checked the normality of the observations using the code below. Here for both the treatment groups we have P value greater than 0.05 (Shapiro-Wilk test is used), therefore the normality assumption is there for our data.\n\n\n    proc univariate data=d1 normal;  \n      qqplot WtGain; \n      by trt_grp; \n    run; \n\nOutput:\n        Figure 2: The results of normality test for Treatment group\n\n\n\n\n\n\n\n\n\n       Figure 3: The results of normality test for Placebo group\n\n\n\n\n\n\n\n\n\n\nHomogeneity of variance (or Equality of variance): Homogeniety of variance will be tested by default in PROC TTEST itself by Folded F-test. In our case the P values is 0.6981 which is greater than 0.05. So we accept the null hypothesis of F-test, i.e. variances are same. Then we will consider the pooled method for t-test. If the F test is statistically significant (p<0.05), then the pooled t-test may give erroneous results. In this instance, if it is believed that the population variances may truly differ, then the Satterthwaite (unequal variances) analysis results should be used. These are provided in the SAS output alongside the Pooled results as default.\n\nOutput:\n                    Figure 4: Folded F-test result in PROC TTEST"
    +    "text": "Mixed models for repeated measures (MMRM) are a popular choice for analyzing longitudinal continuous outcomes in randomized clinical trials and beyond; see Cnaan, Laird and Slasor (1997) for a tutorial and Mallinckrodt, Lane and Schnell (2008) for a review.\nThis vignette shows examples from the mmrm package.\nThe mmrm package implements MMRM based on the marginal linear model without random effects using Template Model Builder (TMB) which enables fast and robust model fitting. Users can specify a variety of covariance matrices, weight observations, fit models with restricted or standard maximum likelihood inference, perform hypothesis testing with Satterthwaite or Kenward-Roger adjustment, and extract least square means estimates by using emmeans.\n\n\n\nFlexible covariance specification:\n\nStructures: unstructured, Toeplitz, AR1, compound symmetry, ante-dependence, and spatial exponential.\nGroups: shared covariance structure for all subjects or group-specific covariance estimates.\nVariances: homogeneous or heterogeneous across time points.\n\nInference:\n\nSupports REML and ML.\nSupports weights.\n\nHypothesis testing:\n\nLeast square means: can be obtained with the emmeans package\nOne- and multi-dimensional linear contrasts of model parameters can be tested.\nSatterthwaite adjusted degrees of freedom.\nKenward-Roger adjusted degrees of freedom and coefficients covariance matrix.\nCoefficient Covariance\n\nC++ backend:\n\nFast implementation using C++ and automatic differentiation to obtain precise gradient information for model fitting.\nModel fitting algorithm details used in mmrm.\n\nPackage ecosystems integration:\n\nIntegration with tidymodels package ecosystem\n\nDedicated parsnip engine for linear regression\nIntegration with recipes\n\nIntegration with tern package ecosystems\n\nThe tern.mmrm package can be used to run the mmrm fit and generate tabulation and plots of least square means per visit and treatment arm, tabulation of model diagnostics, diagnostic graphs, and other standard model outputs.\n\n\n\n\n\n\nSee also the introductory vignette\nThe code below implements an MMRM fit in R with the mmrm::mmrm function.\n\nlibrary(mmrm)\nfit <- mmrm(\n  formula = FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID),\n  data = fev_data\n)\n\nThe code specifies an MMRM with the given covariates and an unstructured covariance matrix for the timepoints (also called visits in the clinical trial context, here given by AVISIT) within the subjects (here USUBJID). While by default this uses restricted maximum likelihood (REML), it is also possible to use ML, see ?mmrm.\nPrinting the object will show you output which should be familiar to anyone who has used any popular modeling functions such as stats::lm(), stats::glm(), glmmTMB::glmmTMB(), and lme4::nlmer(). From this print out we see the function call, the data used, the covariance structure with number of variance parameters, as well as the likelihood method, and model deviance achieved. Additionally the user is provided a printout of the estimated coefficients and the model convergence information:\n\nfit\n\nmmrm fit\n\nFormula:     FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID)\nData:        fev_data (used 537 observations from 197 subjects with maximum 4 \ntimepoints)\nCovariance:  unstructured (10 variance parameters)\nInference:   REML\nDeviance:    3386.45\n\nCoefficients: \n                  (Intercept) RACEBlack or African American \n                  30.77747548                    1.53049977 \n                    RACEWhite                     SEXFemale \n                   5.64356535                    0.32606192 \n                     ARMCDTRT                    AVISITVIS2 \n                   3.77423004                    4.83958845 \n                   AVISITVIS3                    AVISITVIS4 \n                  10.34211288                   15.05389826 \n          ARMCDTRT:AVISITVIS2           ARMCDTRT:AVISITVIS3 \n                  -0.04192625                   -0.69368537 \n          ARMCDTRT:AVISITVIS4 \n                   0.62422703 \n\nModel Inference Optimization:\nConverged with code 0 and message: convergence: rel_reduction_of_f <= factr*epsmch\n\n\nThe summary() method then provides the coefficients table with Satterthwaite degrees of freedom as well as the covariance matrix estimate:\n\nfit |>\n  summary()\n\nmmrm fit\n\nFormula:     FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID)\nData:        fev_data (used 537 observations from 197 subjects with maximum 4 \ntimepoints)\nCovariance:  unstructured (10 variance parameters)\nMethod:      Satterthwaite\nVcov Method: Asymptotic\nInference:   REML\n\nModel selection criteria:\n     AIC      BIC   logLik deviance \n  3406.4   3439.3  -1693.2   3386.4 \n\nCoefficients: \n                               Estimate Std. Error        df t value Pr(>|t|)\n(Intercept)                    30.77748    0.88656 218.80000  34.715  < 2e-16\nRACEBlack or African American   1.53050    0.62448 168.67000   2.451 0.015272\nRACEWhite                       5.64357    0.66561 157.14000   8.479 1.56e-14\nSEXFemale                       0.32606    0.53195 166.13000   0.613 0.540744\nARMCDTRT                        3.77423    1.07415 145.55000   3.514 0.000589\nAVISITVIS2                      4.83959    0.80172 143.88000   6.037 1.27e-08\nAVISITVIS3                     10.34211    0.82269 155.56000  12.571  < 2e-16\nAVISITVIS4                     15.05390    1.31281 138.47000  11.467  < 2e-16\nARMCDTRT:AVISITVIS2            -0.04193    1.12932 138.56000  -0.037 0.970439\nARMCDTRT:AVISITVIS3            -0.69369    1.18765 158.17000  -0.584 0.559996\nARMCDTRT:AVISITVIS4             0.62423    1.85085 129.72000   0.337 0.736463\n                                 \n(Intercept)                   ***\nRACEBlack or African American *  \nRACEWhite                     ***\nSEXFemale                        \nARMCDTRT                      ***\nAVISITVIS2                    ***\nAVISITVIS3                    ***\nAVISITVIS4                    ***\nARMCDTRT:AVISITVIS2              \nARMCDTRT:AVISITVIS3              \nARMCDTRT:AVISITVIS4              \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\nCovariance estimate:\n        VIS1    VIS2    VIS3    VIS4\nVIS1 40.5537 14.3960  4.9747 13.3867\nVIS2 14.3960 26.5715  2.7855  7.4745\nVIS3  4.9747  2.7855 14.8979  0.9082\nVIS4 13.3867  7.4745  0.9082 95.5568\n\n\n\n\n\nIn order to extract relevant marginal means (LSmeans) and contrasts we can use the emmeans package. This package includes methods that allow mmrm objects to be used with the emmeans package. emmeans computes estimated marginal means (also called least-square means) for the coefficients of the MMRM.\n\nif (require(emmeans)) {\n  emmeans(fit, ~ ARMCD | AVISIT)\n}\n\nLoading required package: emmeans\n\n\nmmrm() registered as emmeans extension\n\n\nWelcome to emmeans.\nCaution: You lose important information if you filter this package's results.\nSee '? untidy'\n\n\nAVISIT = VIS1:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     33.3 0.755 148     31.8     34.8\n TRT     37.1 0.763 143     35.6     38.6\n\nAVISIT = VIS2:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     38.2 0.612 147     37.0     39.4\n TRT     41.9 0.602 143     40.7     43.1\n\nAVISIT = VIS3:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     43.7 0.462 130     42.8     44.6\n TRT     46.8 0.509 130     45.7     47.8\n\nAVISIT = VIS4:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     48.4 1.189 134     46.0     50.7\n TRT     52.8 1.188 133     50.4     55.1\n\nResults are averaged over the levels of: RACE, SEX \nConfidence level used: 0.95 \n\n\nNote that the degrees of freedom choice is inherited here from the initial mmrm fit."
       },
       {
    -    "objectID": "SAS/mi_mar_regression.html",
    -    "href": "SAS/mi_mar_regression.html",
    -    "title": "Multiple Imputaton: Linear Regression in SAS",
    +    "objectID": "R/ttest_1Sample.html",
    +    "href": "R/ttest_1Sample.html",
    +    "title": "One Sample t-test",
         "section": "",
    -    "text": "Prepare a subset of the analysis dummy dataset, details as below:\n\n\nUSUBJID (length 4): Subject ID.\nSEX1N: Sex A random integer between 0 and 1 representing a binary variable (perhaps gender).\nAVISITN: Visit number (1 to 5 for each subject).\nAVAL: A random value between 1 and 2, with a random 10% chance of being missing.\n\nAs PROC MI requires a horizontal, one record per subject data set. More often than not, the data we impute will come from a vertical ADaM BDS data set. So we need to first transpose the aval with the avisitn as ID (assuming avisitn = 1 to 5),creating transposed variable v1-v5.\n\ndata dummy;\n    length USUBJID $4;\n    do i=1 to 10;\n            sex1n=int(ranuni(0)*2);\n        do j=1 to 5;\n            USUBJID=strip(put(1000+i,best.));\n            AVISITN=j;\n            AVAL=round(1+ranuni(0),0.01);\n            if ranuni(0) <0.1 then aval=.;\n            output;\n        end;\n    end;\n    drop i j;\nrun;\nproc sort data=dummy; by usubjid sex1n;run;\nproc transpose data=dummy out=dummyt(drop=_name_) prefix=v;\n    by USUBJID sex1n;\n    id avisitn;\n    var aval;\nrun;\nproc print data=dummyt(obs=5);\nrun;"
    +    "text": "The One Sample t-test is used to compare a single sample against an expected hypothesis value. In the One Sample t-test, the mean of the sample is compared against the hypothesis value. In R, a One Sample t-test can be performed using the Base R t.test() from the stats package or the proc_ttest() function from the procs package.\n\n\nThe following data was used in this example.\n\n# Create sample data\nread <- tibble::tribble(\n  ~score, ~count,\n  40, 2,   47, 2,   52, 2,   26, 1,   19, 2,\n  25, 2,   35, 4,   39, 1,   26, 1,   48, 1,\n  14, 2,   22, 1,   42, 1,   34, 2 ,  33, 2,\n  18, 1,   15, 1,   29, 1,   41, 2,   44, 1,\n  51, 1,   43, 1,   27, 2,   46, 2,   28, 1,\n  49, 1,   31, 1,   28, 1,   54, 1,   45, 1\n)\n\n\n\n\nBy default, the R one sample t-test functions assume normality in the data and use a classic Student’s t-test.\n\n\n\n\nThe following code was used to test the comparison in Base R. Note that the baseline null hypothesis goes in the “mu” parameter.\n\n  # Perform t-test\n  t.test(read$score, mu = 30)\n\n\n    One Sample t-test\n\ndata:  read$score\nt = 2.3643, df = 29, p-value = 0.02497\nalternative hypothesis: true mean is not equal to 30\n95 percent confidence interval:\n 30.67928 39.38739\nsample estimates:\nmean of x \n 35.03333 \n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a one sample t-test. Note that the null hypothesis value goes in the “options” parameter.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(read, var = score,\n             options = c(\"h0\" = 30))\n\n$Statistics\n    VAR  N     MEAN      STD   STDERR MIN MAX\n1 score 30 35.03333 11.66038 2.128884  14  54\n\n$ConfLimits\n    VAR     MEAN     LCLM     UCLM      STD  LCLMSTD  UCLMSTD\n1 score 35.03333 30.67928 39.38739 11.66038 9.286404 15.67522\n\n$TTests\n    VAR DF        T     PROBT\n1 score 29 2.364306 0.0249741\n\n\nViewer Output:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe Base R t.test() function does not have an option for lognormal data. Likewise, the procs proc_ttest() function also does not have an option for lognormal data.\nOne possibility may be the tTestLnormAltPower() function from the EnvStats package. This package has not been evaluated yet."
       },
       {
    -    "objectID": "SAS/mi_mar_regression.html#input-dataset-preparation-before-multiple-imputation",
    -    "href": "SAS/mi_mar_regression.html#input-dataset-preparation-before-multiple-imputation",
    -    "title": "Multiple Imputaton: Linear Regression in SAS",
    +    "objectID": "R/ttest_1Sample.html#normal",
    +    "href": "R/ttest_1Sample.html#normal",
    +    "title": "One Sample t-test",
         "section": "",
    -    "text": "Prepare a subset of the analysis dummy dataset, details as below:\n\n\nUSUBJID (length 4): Subject ID.\nSEX1N: Sex A random integer between 0 and 1 representing a binary variable (perhaps gender).\nAVISITN: Visit number (1 to 5 for each subject).\nAVAL: A random value between 1 and 2, with a random 10% chance of being missing.\n\nAs PROC MI requires a horizontal, one record per subject data set. More often than not, the data we impute will come from a vertical ADaM BDS data set. So we need to first transpose the aval with the avisitn as ID (assuming avisitn = 1 to 5),creating transposed variable v1-v5.\n\ndata dummy;\n    length USUBJID $4;\n    do i=1 to 10;\n            sex1n=int(ranuni(0)*2);\n        do j=1 to 5;\n            USUBJID=strip(put(1000+i,best.));\n            AVISITN=j;\n            AVAL=round(1+ranuni(0),0.01);\n            if ranuni(0) <0.1 then aval=.;\n            output;\n        end;\n    end;\n    drop i j;\nrun;\nproc sort data=dummy; by usubjid sex1n;run;\nproc transpose data=dummy out=dummyt(drop=_name_) prefix=v;\n    by USUBJID sex1n;\n    id avisitn;\n    var aval;\nrun;\nproc print data=dummyt(obs=5);\nrun;"
    +    "text": "By default, the R one sample t-test functions assume normality in the data and use a classic Student’s t-test.\n\n\n\n\nThe following code was used to test the comparison in Base R. Note that the baseline null hypothesis goes in the “mu” parameter.\n\n  # Perform t-test\n  t.test(read$score, mu = 30)\n\n\n    One Sample t-test\n\ndata:  read$score\nt = 2.3643, df = 29, p-value = 0.02497\nalternative hypothesis: true mean is not equal to 30\n95 percent confidence interval:\n 30.67928 39.38739\nsample estimates:\nmean of x \n 35.03333 \n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a one sample t-test. Note that the null hypothesis value goes in the “options” parameter.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(read, var = score,\n             options = c(\"h0\" = 30))\n\n$Statistics\n    VAR  N     MEAN      STD   STDERR MIN MAX\n1 score 30 35.03333 11.66038 2.128884  14  54\n\n$ConfLimits\n    VAR     MEAN     LCLM     UCLM      STD  LCLMSTD  UCLMSTD\n1 score 35.03333 30.67928 39.38739 11.66038 9.286404 15.67522\n\n$TTests\n    VAR DF        T     PROBT\n1 score 29 2.364306 0.0249741\n\n\nViewer Output:"
       },
       {
    -    "objectID": "SAS/mi_mar_regression.html#check-missing-data-patterns",
    -    "href": "SAS/mi_mar_regression.html#check-missing-data-patterns",
    -    "title": "Multiple Imputaton: Linear Regression in SAS",
    -    "section": "Check missing data patterns",
    -    "text": "Check missing data patterns\nThe pattern can be checked using the following code, missing data pattern could be classified as “Monotone” or “Arbitrary”\n\n“Monotone” : The missingness of data follows a specific order such that if a certain variable is missing for a particular observation, all subsequent variables are also missing for that observation. If a dataset has columns X1,X2,…,Xk a monotone missing pattern appears when: If Xj is missing, then Xj+1, Xj+2,…,Xj+3 are missing.\n“Arbitrary” : The missingness of data does not follow any specific order or predictable sequence. Data can be missing at random points without a discernible pattern.\n\n\nods select MissPattern;\nproc mi data=dummyt nimpute=0;\nvar v1 - v5;\nrun;\n\nAs below figure shows the missingness dose not follow any specific order, obviously the missing pattern is arbitrary and non-monotone missing pattern."
    +    "objectID": "R/ttest_1Sample.html#lognormal",
    +    "href": "R/ttest_1Sample.html#lognormal",
    +    "title": "One Sample t-test",
    +    "section": "",
    +    "text": "The Base R t.test() function does not have an option for lognormal data. Likewise, the procs proc_ttest() function also does not have an option for lognormal data.\nOne possibility may be the tTestLnormAltPower() function from the EnvStats package. This package has not been evaluated yet."
       },
       {
    -    "objectID": "SAS/mi_mar_regression.html#fcs-regression-for-non-monotone-missing-pattern",
    -    "href": "SAS/mi_mar_regression.html#fcs-regression-for-non-monotone-missing-pattern",
    -    "title": "Multiple Imputaton: Linear Regression in SAS",
    -    "section": "FCS Regression for non-monotone missing pattern",
    -    "text": "FCS Regression for non-monotone missing pattern\n\nproc mi data=dummyt out=outdata nimpute=10 seed=123;\n  class sex1n;\n  var sex1n v1 - v5;\n  fcs reg (v1-v5 /details);\nrun;\n\n\nThe VAR statement above listing the variables to be analyzed, should match the statistical models for efficacy analysis per SAP, which may include TRTPN, necessary grouping variable (for eg AGEGR1/AGEGR1N), and all outcome variables coming from repeated assessments\nNIMPUTE : the number of imputations\nSEED : the seed to begin random number generator\nNote that depending on the SAS Proc MI algorithm, if there are more factors, the ordering of factors, for example SEX1N, RACE1N, may have an effect on the generation of the imputed values for the missing values, i.e., different orderings of these factors will generate different imputed values (e.g may happen in case of monotone missing pattern) from PROC MI procedure. The ordering of subjects in the dataset may also have an effect on the generation of the imputed values for the missing values.\nThe CLASS statement specifies the classification variables in the VAR statement.\nFCS is displayed as the method, if not specified then MCMC will be the default method.\nREG is the specified model which in this example is linear regression)\nThe DETAILS option displays the regression coefficients in the regression model used in each imputation."
    +    "objectID": "R/Weighted-log-rank.html",
    +    "href": "R/Weighted-log-rank.html",
    +    "title": "Testing approaches under non-proportional hazards",
    +    "section": "",
    +    "text": "In clinical studies with time-to-event outcomes, it is commonly assumed that the hazard functions of two groups are proportional. The standard log-rank test is widely used to test the equivalence of survival functions. However, several scenarios can lead to non-proportional hazards (NPH). For example, a delayed treatment effect may be observed in the treatment arm which can lead to departure from proportionality of the survival curves. Thus there are many tests available in the literature that can handle such scenarios. Most commonly used tests are as follows:\n\nWeighted log-rank test\nRestricted Mean Survival Time (RMST)\nMilestone survival\nMax-Combo test.\n\nWhile these tests may be explored in a separate document, this particular document focuses solely on the weighted log-rank test."
       },
       {
    -    "objectID": "SAS/mi_mar_regression.html#monotone-regression-for-monotone-missing-pattern",
    -    "href": "SAS/mi_mar_regression.html#monotone-regression-for-monotone-missing-pattern",
    -    "title": "Multiple Imputaton: Linear Regression in SAS",
    -    "section": "Monotone Regression for monotone missing pattern",
    -    "text": "Monotone Regression for monotone missing pattern\nLet’s update above SAS code to generate a dummy dataset with monotone missing pattern\n\ndata dummy;\n    length USUBJID $4;\n    do i=1 to 10; \n        sex1n=int(ranuni(0)*2); \n        USUBJID = strip(put(1000+i, best.));\n        miss_start = ceil(ranuni(0) * 5); /* Randomly decide the start point for missing data (1 to 5) */\n        do j=1 to 5; \n            AVISITN = j;\n            if j >= miss_start then AVAL = .; /* If the visit number is greater than or equal to miss_start, make AVAL missing */\n            else AVAL = round(1 + ranuni(0), 0.01);\n            output; \n        end;\n    end;\n    drop i miss_start j;\nrun;\nproc sort data=dummy; by usubjid sex1n;run;\nproc transpose data=dummy out=dummyt(drop=_name_) prefix=v;\n    by USUBJID sex1n;\n    id avisitn;\n    var aval;\nrun;\nproc print data=dummyt(obs=5);\nrun;\nods select MissPattern;\nproc mi data=dummyt nimpute=0;\nvar v1 - v5;\nrun;\n\n\n\n\n\n\n\n\n\n\nIn this case we will use monotone statement instead of FCS for the imputation, example code as below:\n\nproc mi data=dummyt out=outdata nimpute=10 seed=123;\n  class sex1n;\n  var sex1n v1 - v5;\n  monotone reg (v1-v5 /details);\nrun;"
    +    "objectID": "R/Weighted-log-rank.html#survdiff",
    +    "href": "R/Weighted-log-rank.html#survdiff",
    +    "title": "Testing approaches under non-proportional hazards",
    +    "section": "survdiff()",
    +    "text": "survdiff()\nThis function uses \\(G(\\rho)=\\hat{S}(t)^\\rho, \\rho \\geq 0\\) , where \\(\\hat{S}(t)\\) is the Kaplan-Meier estimate of the survival function at time \\(t\\). If \\(\\rho = 0\\), then this is the standard log-rank test.\n\nlibrary(survival)\nWLRtest<-survdiff(Surv(LENFOL,FSTAT)~ AFB,rho = 3,data=dat)\n\n\nWLRtest\n\nCall:\nsurvdiff(formula = Surv(LENFOL, FSTAT) ~ AFB, data = dat, rho = 3)\n\n        N Observed Expected (O-E)^2/E (O-E)^2/V\nAFB=0 422     86.3     94.5     0.718      7.68\nAFB=1  78     24.2     16.0     4.245      7.68\n\n Chisq= 7.7  on 1 degrees of freedom, p= 0.006 \n\n\nFor the illustration, \\(\\rho\\) is taken as 3 while calculating weights and the weighted log rank test reject the null hypothesis at 2.5% level of significance."
       },
       {
    -    "objectID": "SAS/mi_mar_regression.html#reference",
    -    "href": "SAS/mi_mar_regression.html#reference",
    -    "title": "Multiple Imputaton: Linear Regression in SAS",
    -    "section": "Reference",
    -    "text": "Reference\n\nUser’s Guide The MI Procedure\nMultiple Imputation: A Statistical Programming Story\nExamine patterns of missing data in SAS"
    +    "objectID": "R/Weighted-log-rank.html#wlrt",
    +    "href": "R/Weighted-log-rank.html#wlrt",
    +    "title": "Testing approaches under non-proportional hazards",
    +    "section": "wlrt()",
    +    "text": "wlrt()\nThis function uses \\(G(\\rho,\\gamma)=\\hat{S}(t)^\\rho (1-\\hat{S}(t))^\\gamma; \\rho,\\gamma \\geq 0,\\) , where \\(\\hat{S}(t)\\) is the Kaplan-Meier estimate of the survival function at time \\(t\\). If \\(\\rho = \\gamma = 0\\), then this is the standard log-rank test. When \\(\\rho=0, \\gamma=1\\) this test can be used to detect early difference in the survival curves, when \\(\\rho=1, \\gamma = 0\\), this test can be used to detect late differences in the survival curves and when \\(\\rho=1, \\gamma = 1\\) this test can be used to test middle differences in the survival curves. Also it is to be noted that this test gives the Z-score as the test statistic which can be squared to obtain the chi-square statistic.\n\nlibrary(nphRCT)\nWL<-wlrt(Surv(LENFOL,FSTAT)~ AFB, data=dat, method=\"fh\", rho = 0, gamma = 0)\nWL\n\n         u      v_u        z trt_group\n1 16.77487 25.81609 3.301521         1\n\n\nTo obtain the corresponding \\(p\\)-value we can either use 2(1-pnorm(abs(WL$z),0,1)) or we can square the test statistic WL$z by using (WL$z)^2 and obtain the corresponding \\(p\\)-values as 1 - pchisq((WL$z)^2,1) , both the \\(p\\)-values will be the same.\n\n2*(1-pnorm(abs(WL$z),0,1))\n\n[1] 0.0009616214\n\n(WL$z)^2\n\n[1] 10.90004\n\n1-pchisq((WL$z)^2,1)\n\n[1] 0.0009616214\n\n\nFor the illustration purpose we used \\(\\rho=0,\\  \\gamma=0\\) and in this scenario weighted log-rank test becomes standard log-rank test. Therefore, the result obtained in this illustration is consistent with the result obtained in standard log-rank test."
       },
       {
    -    "objectID": "SAS/correlation.html",
    -    "href": "SAS/correlation.html",
    -    "title": "Correlation Analysis using SAS",
    +    "objectID": "R/survival.html",
    +    "href": "R/survival.html",
    +    "title": "Survival Analysis Using R",
         "section": "",
    -    "text": "Data source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601-7, 1994.\nSurvival in patients with advanced lung cancer from the North Central Cancer Treatment Group. Performance scores rate how well the patient can perform usual daily activities.\n\n\nThe CORR procedure computes Pearson correlation coefficients, three nonparametric measures of association, and the probabilities associated with these statistics. The correlation statistics include the following:\n\nPearson product-moment correlation\nSpearman rank-order correlation\nKendall’s tau-b coefficient\nHoeffding’s measure of dependence, \nPearson, Spearman, and Kendall partial correlation\n\nThis program works on the first three correlation coefficients.\nMissing Values\nPROC CORR excludes observations with missing values in the WEIGHT and FREQ variables. By default, PROC CORR uses pairwise deletion when observations contain missing values. PROC CORR includes all nonmissing pairs of values for each pair of variables in the statistical computations. Therefore, the correlation statistics might be based on different numbers of observations.\nIf you specify the NOMISS option, PROC CORR uses listwise deletion when a value of the VAR or WITH statement variable is missing. PROC CORR excludes all observations with missing values from the analysis. Therefore, the number of observations for each pair of variables is identical.\nThe PARTIAL statement always excludes the observations with missing values by automatically invoking the NOMISS option. With the NOMISS option, the data are processed more efficiently because fewer resources are needed. Also, the resulting correlation matrix is nonnegative definite.\nIn contrast, if the data set contains missing values for the analysis variables and the NOMISS option is not specified, the resulting correlation matrix might not be nonnegative definite. This leads to several statistical difficulties if you use the correlations as input to regression or other statistical procedures.\n\n\n\n\nproc corr data=lung pearson;\nvar age mealcal;\nrun;\n\n\n\n\n\n\n\n\n\n\nproc corr data=lung spearman; \nvar age mealcal; \nrun;\n\n\n\n\n\n\n\n\n\n\nproc corr data=lung kendall;\nvar age mealcal;\nrun;\n\n\n\n\n\n\n\n\n\nPROC CORR: The CORR Procedure (sas.com)"
    +    "text": "The most commonly used survival analysis methods in clinical trials include:\nAdditionally, other methods for analyzing time-to-event data are available, such as:\nWhile these models may be explored in a separate document, this particular document focuses solely on the three most prevalent methods: KM estimators, log-rank test and Cox PH model."
       },
       {
    -    "objectID": "SAS/correlation.html#overview",
    -    "href": "SAS/correlation.html#overview",
    -    "title": "Correlation Analysis using SAS",
    -    "section": "",
    -    "text": "The CORR procedure computes Pearson correlation coefficients, three nonparametric measures of association, and the probabilities associated with these statistics. The correlation statistics include the following:\n\nPearson product-moment correlation\nSpearman rank-order correlation\nKendall’s tau-b coefficient\nHoeffding’s measure of dependence, \nPearson, Spearman, and Kendall partial correlation\n\nThis program works on the first three correlation coefficients.\nMissing Values\nPROC CORR excludes observations with missing values in the WEIGHT and FREQ variables. By default, PROC CORR uses pairwise deletion when observations contain missing values. PROC CORR includes all nonmissing pairs of values for each pair of variables in the statistical computations. Therefore, the correlation statistics might be based on different numbers of observations.\nIf you specify the NOMISS option, PROC CORR uses listwise deletion when a value of the VAR or WITH statement variable is missing. PROC CORR excludes all observations with missing values from the analysis. Therefore, the number of observations for each pair of variables is identical.\nThe PARTIAL statement always excludes the observations with missing values by automatically invoking the NOMISS option. With the NOMISS option, the data are processed more efficiently because fewer resources are needed. Also, the resulting correlation matrix is nonnegative definite.\nIn contrast, if the data set contains missing values for the analysis variables and the NOMISS option is not specified, the resulting correlation matrix might not be nonnegative definite. This leads to several statistical difficulties if you use the correlations as input to regression or other statistical procedures."
    +    "objectID": "R/survival.html#example-data",
    +    "href": "R/survival.html#example-data",
    +    "title": "Survival Analysis Using R",
    +    "section": "Example Data",
    +    "text": "Example Data\nData source: https://stats.idre.ucla.edu/sas/seminars/sas-survival/\nThe data include 500 subjects from the Worcester Heart Attack Study. This study examined several factors, such as age, gender and BMI, that may influence survival time after heart attack. Follow up time for all participants begins at the time of hospital admission after heart attack and ends with death or loss to follow up (censoring). The variables used here are:\n\nlenfol: length of followup, terminated either by death or censoring - time variable\nfstat: loss to followup = 0, death = 1 - censoring variable\nafb: atrial fibrillation, no = 0, 1 = yes - explanatory variable\ngender: males = 0, females = 1 - stratification factor\n\n\nlibrary(tidyverse)\nlibrary(haven)\nlibrary(survival)\nlibrary(survminer)\nlibrary(broom)\nlibrary(knitr)\nknitr::opts_chunk$set(echo = TRUE)\n\ndat <- read_sas(file.path(\"../data/whas500.sas7bdat\")) %>%\n  mutate(LENFOLY = round(LENFOL/365.25, 2), ## change follow-up days to years for better visualization\n         AFB = factor(AFB, levels = c(1, 0))) ## change AFB order to use \"Yes\" as the reference group to be consistent with SAS"
       },
       {
    -    "objectID": "SAS/correlation.html#pearson-correlation",
    -    "href": "SAS/correlation.html#pearson-correlation",
    -    "title": "Correlation Analysis using SAS",
    -    "section": "",
    -    "text": "proc corr data=lung pearson;\nvar age mealcal;\nrun;"
    +    "objectID": "R/survival.html#the-non-stratified-model",
    +    "href": "R/survival.html#the-non-stratified-model",
    +    "title": "Survival Analysis Using R",
    +    "section": "The Non-stratified Model",
    +    "text": "The Non-stratified Model\nFirst we try a non-stratified analysis following the mock-up above to describe the association between survival time and afb (atrial fibrillation).\nThe KM estimators are from survival::survfit function, the log-rank test uses survminer::surv_pvalue, and Cox PH model is conducted using survival::coxph function. Numerous R packages and functions are available for performing survival analysis. The author has selected survival and survminer for use in this context, but alternative options can also be employed for survival analysis.\n\nKM estimators\n\nfit.km <- survfit(Surv(LENFOLY, FSTAT) ~ AFB, data = dat)\n\n## quantile estimates\nquantile(fit.km, probs = c(0.25, 0.5, 0.75)) \n\n$quantile\n        25   50   75\nAFB=1 0.26 2.37 6.43\nAFB=0 0.94 5.91 6.44\n\n$lower\n        25   50   75\nAFB=1 0.05 1.27 4.24\nAFB=0 0.55 4.32 6.44\n\n$upper\n        25   50 75\nAFB=1 1.11 4.24 NA\nAFB=0 1.47   NA NA\n\n## landmark estimates at 1, 3, 5-year\nsummary(fit.km, times = c(1, 3, 5)) \n\nCall: survfit(formula = Surv(LENFOLY, FSTAT) ~ AFB, data = dat)\n\n                AFB=1 \n time n.risk n.event survival std.err lower 95% CI upper 95% CI\n    1     50      28    0.641  0.0543        0.543        0.757\n    3     27      12    0.455  0.0599        0.351        0.589\n    5     11       6    0.315  0.0643        0.211        0.470\n\n                AFB=0 \n time n.risk n.event survival std.err lower 95% CI upper 95% CI\n    1    312     110    0.739  0.0214        0.699        0.782\n    3    199      33    0.642  0.0245        0.595        0.691\n    5     77      20    0.530  0.0311        0.472        0.595\n\n\n\n\nLog-rank test\n\nsurvminer::surv_pvalue(fit.km, data = dat)\n\n  variable         pval   method    pval.txt\n1      AFB 0.0009646027 Log-rank p = 0.00096\n\n\n\n\nCox PH model\n\nfit.cox <- coxph(Surv(LENFOLY, FSTAT) ~ AFB, data = dat)\nfit.cox %>% \n  tidy(exponentiate = TRUE, conf.int = TRUE, conf.level = 0.95) %>%\n  select(term, estimate, conf.low, conf.high)\n\n# A tibble: 1 × 4\n  term  estimate conf.low conf.high\n  <chr>    <dbl>    <dbl>     <dbl>\n1 AFB0     0.583    0.421     0.806"
       },
       {
    -    "objectID": "SAS/correlation.html#spearman-correlation",
    -    "href": "SAS/correlation.html#spearman-correlation",
    -    "title": "Correlation Analysis using SAS",
    -    "section": "",
    -    "text": "proc corr data=lung spearman; \nvar age mealcal; \nrun;"
    +    "objectID": "R/survival.html#the-stratified-model",
    +    "href": "R/survival.html#the-stratified-model",
    +    "title": "Survival Analysis Using R",
    +    "section": "The Stratified Model",
    +    "text": "The Stratified Model\nIn a stratified model, the Kaplan-Meier estimators remain the same as those in the non-stratified model. To implement stratified log-rank tests and Cox proportional hazards models, simply include the strata() function within the model formula.\n\nStratified Log-rank test\n\nfit.km.str <- survfit(Surv(LENFOLY, FSTAT) ~ AFB + strata(GENDER), data = dat)\n\nsurvminer::surv_pvalue(fit.km.str, data = dat)\n\n            variable        pval   method   pval.txt\n1 AFB+strata(GENDER) 0.001506607 Log-rank p = 0.0015\n\n\n\n\nStratified Cox PH model\n\nfit.cox.str <- coxph(Surv(LENFOLY, FSTAT) ~ AFB + strata(GENDER), data = dat)\nfit.cox.str %>% \n  tidy(exponentiate = TRUE, conf.int = TRUE, conf.level = 0.95) %>%\n  select(term, estimate, conf.low, conf.high)\n\n# A tibble: 1 × 4\n  term  estimate conf.low conf.high\n  <chr>    <dbl>    <dbl>     <dbl>\n1 AFB0     0.594    0.430     0.823"
       },
       {
    -    "objectID": "SAS/correlation.html#kendalls-rank-correlation",
    -    "href": "SAS/correlation.html#kendalls-rank-correlation",
    -    "title": "Correlation Analysis using SAS",
    +    "objectID": "R/anova.html",
    +    "href": "R/anova.html",
    +    "title": "ANOVA",
         "section": "",
    -    "text": "proc corr data=lung kendall;\nvar age mealcal;\nrun;"
    +    "text": "Getting Started\nTo demonstrate the various types of sums of squares, we’ll create a data frame called df_disease taken from the SAS documentation. The corresponding data can be found here.\n\n\nThe Model\nFor this example, we’re testing for a significant difference in stem_length using ANOVA. In R, we’re using lm() to run the ANOVA, and then using broom::glance() and broom::tidy() to view the results in a table format.\n\nlm_model <- lm(y ~ drug + disease + drug*disease, df_disease)\n\nThe glance function gives us a summary of the model diagnostic values.\n\nlm_model %>% \n  glance() %>% \n  pivot_longer(everything())\n\n# A tibble: 12 × 2\n   name               value\n   <chr>              <dbl>\n 1 r.squared        0.456  \n 2 adj.r.squared    0.326  \n 3 sigma           10.5    \n 4 statistic        3.51   \n 5 p.value          0.00130\n 6 df              11      \n 7 logLik        -212.     \n 8 AIC            450.     \n 9 BIC            477.     \n10 deviance      5081.     \n11 df.residual     46      \n12 nobs            58      \n\n\nThe tidy function gives a summary of the model results.\n\nlm_model %>% tidy()\n\n# A tibble: 12 × 5\n   term           estimate std.error statistic      p.value\n   <chr>             <dbl>     <dbl>     <dbl>        <dbl>\n 1 (Intercept)      29.3        4.29    6.84   0.0000000160\n 2 drug2            -1.33       6.36   -0.210  0.835       \n 3 drug3           -13          7.43   -1.75   0.0869      \n 4 drug4           -15.7        6.36   -2.47   0.0172      \n 5 disease2         -1.08       6.78   -0.160  0.874       \n 6 disease3         -8.93       6.36   -1.40   0.167       \n 7 drug2:disease2    6.58       9.78    0.673  0.504       \n 8 drug3:disease2  -10.9       10.2    -1.06   0.295       \n 9 drug4:disease2    0.317      9.30    0.0340 0.973       \n10 drug2:disease3   -0.900      9.00   -0.100  0.921       \n11 drug3:disease3    1.10      10.2     0.107  0.915       \n12 drug4:disease3    9.53       9.20    1.04   0.306       \n\n\n\n\nThe Results\nYou’ll see that R print the individual results for each level of the drug and disease interaction. We can get the combined F table in R using the anova() function on the model object.\n\nlm_model %>% \n  anova() %>% \n  tidy() %>% \n  kable()\n\n\n\n\nterm\ndf\nsumsq\nmeansq\nstatistic\np.value\n\n\n\n\ndrug\n3\n3133.2385\n1044.4128\n9.455761\n0.0000558\n\n\ndisease\n2\n418.8337\n209.4169\n1.895990\n0.1617201\n\n\ndrug:disease\n6\n707.2663\n117.8777\n1.067225\n0.3958458\n\n\nResiduals\n46\n5080.8167\n110.4525\nNA\nNA\n\n\n\n\n\nWe can add a Total row, by using add_row and calculating the sum of the degrees of freedom and sum of squares.\n\nlm_model %>%\n  anova() %>%\n  tidy() %>%\n  add_row(term = \"Total\", df = sum(.$df), sumsq = sum(.$sumsq)) %>% \n  kable()\n\n\n\n\nterm\ndf\nsumsq\nmeansq\nstatistic\np.value\n\n\n\n\ndrug\n3\n3133.2385\n1044.4128\n9.455761\n0.0000558\n\n\ndisease\n2\n418.8337\n209.4169\n1.895990\n0.1617201\n\n\ndrug:disease\n6\n707.2663\n117.8777\n1.067225\n0.3958458\n\n\nResiduals\n46\n5080.8167\n110.4525\nNA\nNA\n\n\nTotal\n57\n9340.1552\nNA\nNA\nNA\n\n\n\n\n\n\n\nSums of Squares Tables\nUnfortunately, it is not easy to get the various types of sums of squares calculations in using functions from base R. However, the rstatix package offers a solution to produce these various sums of squares tables. For each type, you supply the original dataset and model to the. anova_test function, then specify the ttype and se detailed = TRUE.\n\nType I\n\ndf_disease %>% \n  rstatix::anova_test(\n    y ~ drug + disease + drug*disease, \n    type = 1, \n    detailed = TRUE) %>% \n  rstatix::get_anova_table() %>% \n  kable()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEffect\nDFn\nDFd\nSSn\nSSd\nF\np\np<.05\nges\n\n\n\n\ndrug\n3\n46\n3133.239\n5080.817\n9.456\n5.58e-05\n*\n0.381\n\n\ndisease\n2\n46\n418.834\n5080.817\n1.896\n1.62e-01\n\n0.076\n\n\ndrug:disease\n6\n46\n707.266\n5080.817\n1.067\n3.96e-01\n\n0.122\n\n\n\n\n\n\n\nType II\n\ndf_disease %>% \n  rstatix::anova_test(\n    y ~ drug + disease + drug*disease, \n    type = 2, \n    detailed = TRUE) %>% \n  rstatix::get_anova_table() %>% \n  kable()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEffect\nSSn\nSSd\nDFn\nDFd\nF\np\np<.05\nges\n\n\n\n\ndrug\n3063.433\n5080.817\n3\n46\n9.245\n6.75e-05\n*\n0.376\n\n\ndisease\n418.834\n5080.817\n2\n46\n1.896\n1.62e-01\n\n0.076\n\n\ndrug:disease\n707.266\n5080.817\n6\n46\n1.067\n3.96e-01\n\n0.122\n\n\n\n\n\n\n\nType III\n\ndf_disease %>% \n  rstatix::anova_test(\n    y ~ drug + disease + drug*disease, \n    type = 3, \n    detailed = TRUE) %>% \n  rstatix::get_anova_table() %>% \n  kable()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEffect\nSSn\nSSd\nDFn\nDFd\nF\np\np<.05\nges\n\n\n\n\n(Intercept)\n20037.613\n5080.817\n1\n46\n181.414\n0.00e+00\n*\n0.798\n\n\ndrug\n2997.472\n5080.817\n3\n46\n9.046\n8.09e-05\n*\n0.371\n\n\ndisease\n415.873\n5080.817\n2\n46\n1.883\n1.64e-01\n\n0.076\n\n\ndrug:disease\n707.266\n5080.817\n6\n46\n1.067\n3.96e-01\n\n0.122\n\n\n\n\n\n\n\nType IV\nIn R there is no equivalent operation to the Type IV sums of squares calculation in SAS."
       },
       {
    -    "objectID": "SAS/correlation.html#references",
    -    "href": "SAS/correlation.html#references",
    -    "title": "Correlation Analysis using SAS",
    -    "section": "",
    -    "text": "PROC CORR: The CORR Procedure (sas.com)"
    -  },
    -  {
    -    "objectID": "SAS/linear-regression.html",
    -    "href": "SAS/linear-regression.html",
    -    "title": "Linear Regression",
    +    "objectID": "R/mi_mar_regression.html",
    +    "href": "R/mi_mar_regression.html",
    +    "title": "Multiple Imputaton: Linear Regression",
         "section": "",
    -    "text": "To demonstrate the use of linear regression we examine a dataset that illustrates the relationship between Height and Weight in a group of 237 teen-aged boys and girls. The dataset is available at (../data/htwt.csv) and is imported to sas using proc import procedure.\n\nDescriptive Statistics\nThe first step is to obtain the simple descriptive statistics for the numeric variables of htwt data, and one-way frequencies for categorical variables. This is accomplished by employing proc means and proc freq procedures There are 237 participants who are from 13.9 to 25 years old. It is a cross-sectional study, with each participant having one observation. We can use this data set to examine the relationship of participants’ height to their age and sex.\n\nproc means data=htwt;\nrun;\n\n                    Descriptive Statistics for HTWT Data Set                  \n                             The MEANS Procedure\n\nVariable  Label     N          Mean       Std Dev       Minimum       Maximum\n-----------------------------------------------------------------------------\nAGE       AGE     237    16.4430380     1.8425767    13.9000000    25.0000000\nHEIGHT    HEIGHT  237    61.3645570     3.9454019    50.5000000    72.0000000\nWEIGHT    WEIGHT  237   101.3080169    19.4406980    50.5000000   171.5000000\n----------------------------------------------------------------------------\n\n\nproc freq data=htwt;\ntables sex;\nrun;\n\n    Oneway Frequency Tabulation for Sex for HTWT Data Set                    \n                    The FREQ Procedure\n\n                                      Cumulative    Cumulative\nSEX         Frequency     Percent     Frequency      Percent\n-------------------------------------------------------------\nf           111           46.84           111        46.84\nm           126           53.16           237       100.00\n\nIn order to create a regression model to demonstrate the relationship between age and height for females, we first need to create a flag variable identifying females and an interaction variable between age and female gender flag.\n\ndata htwt2;\n  set htwt;\n  if sex=\"f\" then female=1;\n  if sex=\"m\" then female=0; \n \n  *model to demonstrate interaction between female gender and age;\n  fem_age = female * age;  \nrun;\n\n\n\nRegression Analysis\nNext, we fit a regression model, representing the relationships between gender, age, height and the interaction variable created in the datastep above. We again use a where statement to restrict the analysis to those who are less than or equal to 19 years old. We use the clb option to get a 95% confidence interval for each of the parameters in the model. The model that we are fitting is height = b0 + b1 x female + b2 x age + b3 x fem_age + e\n\nproc reg data=htwt2;\n  where age <=19;\n  model height = female age fem_age / clb;\nrun; quit;\n\n                        Number of Observations Read         219\n                        Number of Observations Used         219\n\n                                 Analysis of Variance\n\n                                        Sum of           Mean\n    Source                   DF        Squares         Square    F Value    Pr > F\n    Model                     3     1432.63813      477.54604      60.93    <.0001\n    Error                   215     1684.95730        7.83701\n    Corrected Total         218     3117.59543\n\n                 Root MSE              2.79947    R-Square     0.4595\n                 Dependent Mean       61.00457    Adj R-Sq     0.4520\n                 Coeff Var             4.58895\n\nWe examine the parameter estimates in the output below.\n\n                            Parameter Estimates\n                            Parameter       Standard\n       Variable     DF       Estimate          Error    t Value    Pr > |t|       95% Confidence Limits\n       Intercept     1       28.88281        2.87343      10.05      <.0001       23.21911       34.54650\n       female        1       13.61231        4.01916       3.39      0.0008        5.69031       21.53432\n       AGE           1        2.03130        0.17764      11.44      <.0001        1.68117        2.38144\n       fem_age       1       -0.92943        0.24782      -3.75      0.0002       -1.41791       -0.44096\n\nFrom the parameter estimates table the coefficients b0,b1,b2,b3 are estimated as b0=28.88 b1=13.61 b2=2.03 b3=-0.92942\nThe resulting regression model for height, age and gender based on the available data is height=28.88281 + 13.61231 x female + 2.03130 x age -0.92943 x fem_age"
    +    "text": "Multiple imputation with regression is one step further from mean imputation (i.e. by a single value: the average of observed). In the case for continuous, normally distributed variable, linear regression can use information from other variables hence could be closer to the true missing values."
       },
       {
    -    "objectID": "SAS/survival.html",
    -    "href": "SAS/survival.html",
    -    "title": "Survival Analysis Using SAS",
    +    "objectID": "R/mi_mar_regression.html#overview",
    +    "href": "R/mi_mar_regression.html#overview",
    +    "title": "Multiple Imputaton: Linear Regression",
         "section": "",
    -    "text": "The most commonly used survival analysis methods in clinical trials include:\nAdditionally, other methods for analyzing time-to-event data are available, such as:\nWhile these models may be explored in a separate document, this particular document focuses solely on the three most prevalent methods: KM estimators, log-rank test and Cox PH model."
    -  },
    -  {
    -    "objectID": "SAS/survival.html#example-data",
    -    "href": "SAS/survival.html#example-data",
    -    "title": "Survival Analysis Using SAS",
    -    "section": "Example Data",
    -    "text": "Example Data\nData source: https://stats.idre.ucla.edu/sas/seminars/sas-survival/\nThe data include 500 subjects from the Worcester Heart Attack Study. This study examined several factors, such as age, gender and BMI, that may influence survival time after heart attack. Follow up time for all participants begins at the time of hospital admission after heart attack and ends with death or loss to follow up (censoring). The variables used here are:\n\nlenfol: length of followup, terminated either by death or censoring - time variable\nfstat: loss to followup = 0, death = 1 - censoring variable\nafb: atrial fibrillation, no = 0, 1 = yes - explanatory variable\ngender: males = 0, females = 1 - stratification factor\n\n\nlibname mylib \"..\\data\";\n\ndata dat;\nset mylib.whas500;\nlenfoly = round(lenfol/365.25, 0.01);  /* change follow-up days to years for better visualization*/\nrun;"
    +    "text": "Multiple imputation with regression is one step further from mean imputation (i.e. by a single value: the average of observed). In the case for continuous, normally distributed variable, linear regression can use information from other variables hence could be closer to the true missing values."
       },
       {
    -    "objectID": "SAS/survival.html#the-non-stratified-model",
    -    "href": "SAS/survival.html#the-non-stratified-model",
    -    "title": "Survival Analysis Using SAS",
    -    "section": "The Non-stratified Model",
    -    "text": "The Non-stratified Model\nFirst we try a non-stratified analysis following the mock-up above to describe the association between survival time and afb (atrial fibrillation).\nThe KM estimators and log-rank test are from PROC LIFETEST, and Cox PH model is conducted using PROC PHREG.\n\nKM estimators and log-rank test\n\nproc lifetest data=dat outsurv=_SurvEst timelist= 1 3 5 reduceout stderr; \ntime lenfoly*fstat(0);\nstrata afb;\nrun;\n\nThe landmark estimates and quartile estimates for AFB = 0 group are as shown in below:\n\n\n\n\n\n\n\n\n\nThe logrank test result is in below:\n\n\n\n\n\n\n\n\n\n\n\nCox PH model\n\nproc phreg data = dat;\nclass afb;\nmodel lenfol*fstat(0) = afb/rl;\nrun;\n\nThe hazard ratio and confidence intervals are shown as below:"
    +    "objectID": "R/mi_mar_regression.html#imputation-with-mice",
    +    "href": "R/mi_mar_regression.html#imputation-with-mice",
    +    "title": "Multiple Imputaton: Linear Regression",
    +    "section": "Imputation with mice",
    +    "text": "Imputation with mice\nmice is a powerful R package developed by Stef van Buuren, Karin Groothuis-Oudshoorn and other contributors. Regression methods (continuous, normal outcome) are implemented in mice with methods starting with norm.\n\nLinear regression without parameter uncertainty, mice.impute.norm.nob\nLinear regression through prediction, mice.impute.norm.predict\nBayesian linear regression, mice.impute.norm\nLinear regression bootstrap, mice.impute.norm.boot"
       },
       {
    -    "objectID": "SAS/survival.html#the-stratified-model",
    -    "href": "SAS/survival.html#the-stratified-model",
    -    "title": "Survival Analysis Using SAS",
    -    "section": "The Stratified Model",
    -    "text": "The Stratified Model\nIn a stratified model, the Kaplan-Meier estimators remain the same as those in the non-stratified model. To implement stratified log-rank tests and Cox proportional hazards models, simply add the STRATA option in both PROC LIFETEST and PROC PHREG.\n\n# KM estimators and log-rank test\nproc lifetest data=dat;\ntime lenfoly*fstat(0);\nstrata gender/group = afb;\nrun;\n\n# Cox PH model\nproc phreg data=dat;\nclass afb;\nmodel lenfol*fstat(0) = afb/rl;\nstrata gender;\nrun;"
    +    "objectID": "R/mi_mar_regression.html#example",
    +    "href": "R/mi_mar_regression.html#example",
    +    "title": "Multiple Imputaton: Linear Regression",
    +    "section": "Example",
    +    "text": "Example\nHere I use the small dataset nhanes included in mice package. It has 25 rows, and three out of four variables have missings.\nThe original NHANES data is a large national level survey, some are publicly available via R package nhanes.\n\nlibrary(mice)\n\n\nAttaching package: 'mice'\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\nThe following objects are masked from 'package:base':\n\n    cbind, rbind\n\n# load example dataset from mice\nhead(nhanes)\n\n  age  bmi hyp chl\n1   1   NA  NA  NA\n2   2 22.7   1 187\n3   1   NA   1 187\n4   3   NA  NA  NA\n5   1 20.4   1 113\n6   3   NA  NA 184\n\nsummary(nhanes)\n\n      age            bmi             hyp             chl       \n Min.   :1.00   Min.   :20.40   Min.   :1.000   Min.   :113.0  \n 1st Qu.:1.00   1st Qu.:22.65   1st Qu.:1.000   1st Qu.:185.0  \n Median :2.00   Median :26.75   Median :1.000   Median :187.0  \n Mean   :1.76   Mean   :26.56   Mean   :1.235   Mean   :191.4  \n 3rd Qu.:2.00   3rd Qu.:28.93   3rd Qu.:1.000   3rd Qu.:212.0  \n Max.   :3.00   Max.   :35.30   Max.   :2.000   Max.   :284.0  \n                NA's   :9       NA's   :8       NA's   :10     \n\n\nExamine missing pattern with md.pattern(data).\n\n# 27 missing in total\n# by col: 8 for hyp, 9 for bmi, 10 for chl\n# by row: n missing numbers\n\nmd.pattern(nhanes)\n\n\n\n\n\n\n\n\n   age hyp bmi chl   \n13   1   1   1   1  0\n3    1   1   1   0  1\n1    1   1   0   1  1\n1    1   0   0   1  2\n7    1   0   0   0  3\n     0   8   9  10 27\n\n\n\nRegression without parameter uncertainty\nWe can generate two imputed datasets by setting m=2.\nThere is a certain level of randomness, so would be a good idea to set seed.\n\nset.seed(1)\nimpr0 <- mice(nhanes, method = 'norm.nob', m=2, maxit = 1)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n  1   2  bmi  hyp  chl\n\nimpr0\n\nClass: mids\nNumber of multiple imputations:  2 \nImputation methods:\n       age        bmi        hyp        chl \n        \"\" \"norm.nob\" \"norm.nob\" \"norm.nob\" \nPredictorMatrix:\n    age bmi hyp chl\nage   0   1   1   1\nbmi   1   0   1   1\nhyp   1   1   0   1\nchl   1   1   1   0\n\nnhanes_impr0 <- complete(impr0) # by default, returns the first imputation\nnhanes_impr0\n\n   age      bmi       hyp      chl\n1    1 35.53430 1.2503841 256.6153\n2    2 22.70000 1.0000000 187.0000\n3    1 27.31412 1.0000000 187.0000\n4    3 25.31243 2.3880837 267.1435\n5    1 20.40000 1.0000000 113.0000\n6    3 17.94547 1.5855064 184.0000\n7    1 22.50000 1.0000000 118.0000\n8    1 30.10000 1.0000000 187.0000\n9    2 22.00000 1.0000000 238.0000\n10   2 26.99782 1.0810473 206.9927\n11   1 32.71511 0.7819353 213.7222\n12   2 27.65399 0.7904680 209.6716\n13   3 21.70000 1.0000000 206.0000\n14   2 28.70000 2.0000000 204.0000\n15   1 29.60000 1.0000000 252.1596\n16   1 27.47980 0.6071353 145.9557\n17   3 27.20000 2.0000000 284.0000\n18   2 26.30000 2.0000000 199.0000\n19   1 35.30000 1.0000000 218.0000\n20   3 25.50000 2.0000000 245.7884\n21   1 35.12809 0.5807116 232.4652\n22   1 33.20000 1.0000000 229.0000\n23   1 27.50000 1.0000000 131.0000\n24   3 24.90000 1.0000000 268.3929\n25   2 27.40000 1.0000000 186.0000\n\n\nWhen we have two imputed datasets, we can check the values for each of the variables. For example, extract bmi variable from the imputed data imp,\n\n# two imputed datasets (m=2)\nimpr0$imp$bmi\n\n          1        2\n1  35.53430 32.26078\n3  27.31412 22.55473\n4  25.31243 14.90410\n6  17.94547 22.59196\n10 26.99782 25.08534\n11 32.71511 27.71485\n12 27.65399 25.76286\n16 27.47980 30.34985\n21 35.12809 29.89142\n\n\nWe can also specify which imputed dataset to use as our complete data. Set index to 0 (action = 0) returns the original dataset with missing values.\nHere we check which of the imputed data is being used as the completed dataset. First take a note of the row IDs (based on bmi, for example). Then we generate completed dataset.\n\nif no action argument is set, then it returns the first imputation by default\naction=0 corresponds to the original data with missing values\n\n\n# check which imputed data is used for the final result, take note of row id\nid_missing <- which(is.na(nhanes$bmi))\nid_missing\n\n[1]  1  3  4  6 10 11 12 16 21\n\nnhanes_impr0_action0 <- complete(impr0, action = 0) \nnhanes_impr0_action0[id_missing, ] # original data with missing bmi\n\n   age bmi hyp chl\n1    1  NA  NA  NA\n3    1  NA   1 187\n4    3  NA  NA  NA\n6    3  NA  NA 184\n10   2  NA  NA  NA\n11   1  NA  NA  NA\n12   2  NA  NA  NA\n16   1  NA  NA  NA\n21   1  NA  NA  NA\n\nnhanes_impr0_action1 <- complete(impr0, action = 1) \nnhanes_impr0_action1[id_missing, ] # using first imputation\n\n   age      bmi       hyp      chl\n1    1 35.53430 1.2503841 256.6153\n3    1 27.31412 1.0000000 187.0000\n4    3 25.31243 2.3880837 267.1435\n6    3 17.94547 1.5855064 184.0000\n10   2 26.99782 1.0810473 206.9927\n11   1 32.71511 0.7819353 213.7222\n12   2 27.65399 0.7904680 209.6716\n16   1 27.47980 0.6071353 145.9557\n21   1 35.12809 0.5807116 232.4652\n\nnhanes_impr0_action2 <- complete(impr0, action = 2) \nnhanes_impr0_action2[id_missing, ] # using second imputation\n\n   age      bmi       hyp      chl\n1    1 32.26078 0.4616324 228.0022\n3    1 22.55473 1.0000000 187.0000\n4    3 14.90410 1.4558818 212.7958\n6    3 22.59196 1.7664882 184.0000\n10   2 25.08534 1.2940549 201.5872\n11   1 27.71485 0.9410698 169.2427\n12   2 25.76286 1.3570093 168.5961\n16   1 30.34985 0.6878971 163.7262\n21   1 29.89142 1.0452062 212.9144\n\n\n\n\nOther imputation by linear regression\nOther various of imputaton via linear regression can be implemented simply by changing the method argument.\n\nLinear regression through prediction, mice.impute.norm.predict\nBayesian linear regression, mice.impute.norm\nLinear regression bootstrap, mice.impute.norm.boot\n\n\nimpr <- mice(nhanes, method = 'norm.predict', m=1, maxit=1)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n\nimpr$imp$bmi\n\n          1\n1  28.33396\n3  28.33396\n4  22.75613\n6  21.17519\n10 27.19573\n11 29.12443\n12 26.26576\n16 30.28688\n21 28.33396\n\n\nBayesian linear regression\n\nimpb <- mice(nhanes, method = 'norm', m=1, maxit=1)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n\nimpb$imp$bmi\n\n          1\n1  33.82959\n3  28.98754\n4  20.88810\n6  19.11391\n10 27.32990\n11 29.44117\n12 22.68062\n16 32.13267\n21 22.03164\n\n# nhanes_impb <- complete(impb)\n\nBootstrap\n\nimpbt <- mice(nhanes, method = 'norm.boot', m=1, maxit=1)\n\n\n iter imp variable\n  1   1  bmi  hyp  chl\n\nimpbt$imp$bmi\n\n          1\n1  24.19248\n3  28.77464\n4  22.42321\n6  23.47542\n10 21.95529\n11 23.12703\n12 25.84230\n16 27.68216\n21 26.43770"
       },
       {
    -    "objectID": "SAS/association.html",
    -    "href": "SAS/association.html",
    -    "title": "Association Analysis for Count Data Using SAS",
    +    "objectID": "R/count_data_regression.html",
    +    "href": "R/count_data_regression.html",
    +    "title": "Regression for Count Data",
         "section": "",
    -    "text": "In SAS, association analysis methods for count data/contingency tables is typically performed using the PROC FREQ procedure. This procedure has options for Chi-Square and Fisher’s Exact tests."
    +    "text": "The most commonly used models for count data in clinical trials include:\n\nPoisson regression: assumes the response variable \\(Y\\) has a Poisson distribution, which is linked using the logarithm with explanatory variables \\(\\bf{x}\\).\n\n\\[\n\\text{log}(E(Y|x))= \\beta_0 + \\beta' x, \\; i = 1,\\ldots,n\n\\]\n\nQuasi-Poisson regression: Poisson model that allows overdispersion, i.e. dispersion parameter is not fixed at one.\nNegative-Binomial regression: popular generalization which loosens the assumption that the variance is equal to the mean made by the Poisson model.\n\nOther models include hurdle or zero-inflated models, if data have more zero observations than expected.\n\nExample: Familial Andenomatous Polyposis Data\nData source: F. M. Giardiello, S. R. Hamilton, A. J. Krush, S. Piantadosi, L. M. Hylind, P. Celano, S. V. Booker, C. R. Robinson and G. J. A. Offerhaus (1993), Treatment of colonic and rectal adenomas with sulindac in familial adenomatous polyposis. New England Journal of Medicine, 328(18), 1313–1316.\nData from a placebo-controlled trial of a non-steroidal anti-inflammatory drug in the treatment of familial andenomatous polyposis (FAP). (see ?polyps for details).\n\npolyps <- HSAUR2::polyps\nglimpse(polyps)\n\nRows: 20\nColumns: 3\n$ number <dbl> 63, 2, 28, 17, 61, 1, 7, 15, 44, 25, 3, 28, 10, 40, 33, 46, 50,…\n$ treat  <fct> placebo, drug, placebo, drug, placebo, drug, placebo, placebo, …\n$ age    <dbl> 20, 16, 18, 22, 13, 23, 34, 50, 19, 17, 23, 22, 30, 27, 23, 22,…\n\n\nWe analyze the number of colonic polyps at 12 months in dependency of treatment and age of the patient.\n\npolyps %>% \n  ggplot(aes(y = number, x = age, color = treat)) + \n  geom_point() + theme_minimal()\n\n\n\n\n\n\n\n\n\n\nModel Fit\nWe fit a generalized linear model for number using the Poisson distribution with default log link.\n\n# Poisson\nm1 <- glm(number ~ treat + age, data = polyps, family = poisson)\nsummary(m1)\n\n\nCall:\nglm(formula = number ~ treat + age, family = poisson, data = polyps)\n\nCoefficients:\n             Estimate Std. Error z value Pr(>|z|)    \n(Intercept)  4.529024   0.146872   30.84  < 2e-16 ***\ntreatdrug   -1.359083   0.117643  -11.55  < 2e-16 ***\nage         -0.038830   0.005955   -6.52 7.02e-11 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for poisson family taken to be 1)\n\n    Null deviance: 378.66  on 19  degrees of freedom\nResidual deviance: 179.54  on 17  degrees of freedom\nAIC: 273.88\n\nNumber of Fisher Scoring iterations: 5\n\n\nThe parameter estimates are on log-scale. For better interpretation, we can exponentiate these estimates, to obtain estimates and provide \\(95\\)% confidence intervals:\n\n# OR and CI\nexp(coef(m1))\n\n(Intercept)   treatdrug         age \n 92.6681047   0.2568961   0.9619140 \n\nexp(confint(m1))\n\nWaiting for profiling to be done...\n\n\n                 2.5 %      97.5 %\n(Intercept) 69.5361752 123.6802476\ntreatdrug    0.2028078   0.3218208\nage          0.9505226   0.9729788\n\n\nPredictions for number of colonic polyps given a new 25-year-old patient on either treatment using predict():\n\n# new 25 year old patient\nnew_pt <- data.frame(treat = c(\"drug\",\"placebo\"), age=25)\npredict(m1, new_pt, type = \"response\")\n\n        1         2 \n 9.017654 35.102332 \n\n\n\n\nModelling Overdispersion\nPoisson model assumes that mean and variance are equal, which can be a very restrictive assumption. One option to relax the assumption is adding a overdispersion constant to the relationship, i.e. \\(\\text{Var}(\\text{response}) = \\phi\\cdot \\mu\\), which results in a quasipoisson model:\n\n# Quasi poisson\nm2 <- glm(number ~ treat + age, data = polyps, family = quasipoisson)\nsummary(m2)\n\n\nCall:\nglm(formula = number ~ treat + age, family = quasipoisson, data = polyps)\n\nCoefficients:\n            Estimate Std. Error t value Pr(>|t|)    \n(Intercept)  4.52902    0.48106   9.415 3.72e-08 ***\ntreatdrug   -1.35908    0.38533  -3.527  0.00259 ** \nage         -0.03883    0.01951  -1.991  0.06284 .  \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for quasipoisson family taken to be 10.72805)\n\n    Null deviance: 378.66  on 19  degrees of freedom\nResidual deviance: 179.54  on 17  degrees of freedom\nAIC: NA\n\nNumber of Fisher Scoring iterations: 5\n\n\nAlternatively, we can explicitly model the count data with overdispersion using the negative Binomial model. In this case, the overdispersion is a function of both \\(\\mu\\) and \\(\\mu^2\\):\n\\[\n\\text{Var}(\\text{response}) = \\mu + \\kappa\\,\\mu^2.\n\\]\n\n# Negative Binomial\nm3 <- MASS::glm.nb(number ~ treat + age, data = polyps)\nsummary(m3)\n\n\nCall:\nMASS::glm.nb(formula = number ~ treat + age, data = polyps, init.theta = 1.719491, \n    link = log)\n\nCoefficients:\n            Estimate Std. Error z value Pr(>|z|)    \n(Intercept)  4.52603    0.59466   7.611 2.72e-14 ***\ntreatdrug   -1.36812    0.36903  -3.707 0.000209 ***\nage         -0.03856    0.02095  -1.840 0.065751 .  \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for Negative Binomial(1.7195) family taken to be 1)\n\n    Null deviance: 36.734  on 19  degrees of freedom\nResidual deviance: 22.002  on 17  degrees of freedom\nAIC: 164.88\n\nNumber of Fisher Scoring iterations: 1\n\n              Theta:  1.719 \n          Std. Err.:  0.607 \n\n 2 x log-likelihood:  -156.880 \n\n\nBoth model result very similar parameter estimates, but vary in estimates for their respective standard deviation."
       },
       {
    -    "objectID": "SAS/association.html#tests-of-association",
    -    "href": "SAS/association.html#tests-of-association",
    -    "title": "Association Analysis for Count Data Using SAS",
    -    "section": "Tests of Association",
    -    "text": "Tests of Association\nThe following SAS code produces both the Chi-Square and Fisher’s Exact tests of association. Note that the results contain many statistics not produced by the corresponding R function. The relevant sections of the output have been outlined in red.\nproc freq data = test_case;\nweight Count;\ntables treatment * Weight / chisq fisher;\nexact or;\nrun;\nOutput:"
    +    "objectID": "R/summary-stats.html",
    +    "href": "R/summary-stats.html",
    +    "title": "Deriving Quantiles or Percentiles in R",
    +    "section": "",
    +    "text": "Percentiles can be calculated in R using the quantile function. The function has the argument type which allows for nine different percentile definitions to be used. The default is type = 7, which uses a piecewise-linear estimate of the cumulative distribution function to find percentiles.\nThis is how the 25th and 40th percentiles of aval could be calculated using the default type.\n\nquantile(aval, probs = c(0.25, 0.4))"
       },
       {
    -    "objectID": "SAS/rounding.html",
    -    "href": "SAS/rounding.html",
    -    "title": "Rounding in SAS",
    +    "objectID": "R/nonpara_wilcoxon_ranksum.html",
    +    "href": "R/nonpara_wilcoxon_ranksum.html",
    +    "title": "Wilcoxon Rank Sum (Mann Whitney-U) in R",
         "section": "",
    -    "text": "There are two rounding functions in SAS.\nThe round() function in SAS will round to the nearest whole number and ‘away from zero’ or ‘rounding up’ when equidistant meaning that exactly 12.5 rounds to the integer 13.\nThe rounde() function in SAS will round to the nearest whole number and ‘rounding to the even number’ when equidistant, meaning that exactly 12.5 rounds to the integer 12.\nBoth functions allow you to specify the number of decimal places you want to round to.\nFor example (See references for source of the example)\n\n    #Example code\n    data XXX;\n      my_number=2.2; output;\n      my_number=3.99; output;\n      my_number=1.2345; output;\n      my_number=7.876; output;\n      my_number=13.8739;  output;\n    run;\n\n    data xxx2;\n      set xxx;\n        r_1_dec = round(my_number, 0.1);\n        r_2_dec = round(my_number, 0.01);\n        r_3_dec = round(my_number, 0.001);\n        \n        re_1_dec = rounde(my_number, 0.1);\n        re_2_dec = rounde(my_number, 0.01);\n        re_3_dec = rounde(my_number, 0.001);\n    run;\n\n\n\n\n\n\n\n\n\n\n\n\n\nmy_number\nr_1_dec\nr_2_de\nr_3_dec\nre_1_dec\nre_2_dec\nre_3_dec\n\n\n\n\n2.2\n2.2\n2.2\n2.2\n2.2\n2.2\n2.2\n\n\n3.99\n4\n3.99\n3.99\n4\n3.99\n3.99\n\n\n1.2345\n1.2\n1.23\n1.235\n1.2\n1.23\n1.234\n\n\n7.876\n7.9\n7.88\n7.876\n7.9\n7.88\n7.876\n\n\n13.8739\n13.9\n13.87\n13.874\n13.9\n13.87\n13.874\n\n\n\nIn some rare cases, round() does not return result as expected. For example below.\n\ndata incorrect_round;\n  *rounded=32768.015625, but it should be 32768.015626;\n  rounded=round(32768.0156255,1e-6); output;\n  *rounded=0.137, but it should be 0.138;\n  rounded=round(2048.1375-2048,1e-3); output;\nrun;\n\nYou can find a little more by the code below. It creates dummy numbers with different numbers of decimal digits, and filter incorrect results. Note, the incorrect results are expected when the input number is near or beyond the precision level, i.e. the last decimal of the input number is near or less than the number multiplied by constant('maceps').\n\ndata dum1;\n  int1=0; output;\n  do i=1 to 25;\n    int1=2**i; output;\n  end;\n  keep int1;\nrun;\n\ndata dum2;\n  do round_digits=1 to 7;\n    *x.xxx5 should be rounded up, or replace 5 to 4.99 which should be rounded down;\n    dec1=2**(-round_digits)+10**(-round_digits-1)*5;\n    output;\n  end;\n  keep dec1 round_digits;\nrun;\n\nproc sql;\n  create table incorrect_round2(where=(rounded<num1)) as\n  select dum1.*,dum2.*,int1+dec1 as num1,round(calculated num1,10**(-round_digits)) as rounded\n  from dum1, dum2;\nquit;\n\nOr more by the code below and comparing with results from another language, e.g. R.\n\ndata dum1;\n  dec1=0; int1=0; output;\n  do i=0 to 12;\n    dec1=2**(-i);\n    dec1=dec1*1.1;\n    int1=2**i;\n    output;\n  end;\nrun;\n\nproc sql;\n  create table dum3 as select dec1+int1 as num1 from dum1(keep=dec1) a, dum1(keep=int1) b\n  ;\n  create table dat1 as select a.num1,b.num1 as num2 from dum3 a, dum3 b\n;quit;\n\ndata dat2;\n  set dat1;\n  operator='+'; num3=num1+num2; output;\n  operator='-'; num3=num1-num2; output;\n  if num1^=0 and num2^=0 then do;\n    operator='*'; num3=num1*num2; output;\n    operator='/'; num3=num1/num2; output;\n  end;\nrun;\n\ndata dat3;\n  set dat2;\n  rounded=round(num3,1e-3);\nrun;\n\nAs the incorrect rounding all occur on large number, round() is still reliable in most of cases.\nReferences\nHow to Round Numbers in SAS - SAS Example Code"
    +    "text": "Wilcoxon rank sum test, or equivalently, Mann-Whitney U-test is a rank based non-parametric method. The aim is to compare two independent groups of observations. Under certain scenarios, it can be thought of as a test for median differences, however this is only valid when: 1) both samples are independent and identically distributed (same dispersion, same shape, not necessarily normal) and 2) are symmetric around their medians.\nGenerally, with two samples of observations (A and B), the test uses the mean of each possible pair of observations in each group (including the pair of each value with itself) to test if the probability that (A>B) > probability (B>A).\nThe Wilcoxon rank sum test is often presented alongside a Hodges-Lehmann estimate of the pseudo-median (the median of the Walsh averages), and an associated confidence interval for the pseudo-median.\nA tie in the data exists when an observation in group A, has the same result as an observation in group B.\n\n\n\nMethods and Formulae\nMann Whitney is not about medians in general\nRelationship between walsh averages and WRS\nHodges Lehmann Problems\n\n\n\n\nThere are three main implementations of the Wilcoxon rank sum test in R.\n\nstats::wilcox.test\nasht::wmwTest()\ncoin::wilcox_test()\n\nThe stats package implements various classic statistical tests, including Wilcoxon rank sum test. Although this is arguably the most commonly applied package, this one does not account for any ties in the data.\n\n# x, y are two unpaired vectors. Do not necessary need to be of the same length.\nstats::wilcox.test(x, y, paired = F)\n\n\n\n\nData source: Table 30.4, Kirkwood BR. and Sterne JAC. Essentials of medical statistics. Second Edition. ISBN 978-0-86542-871-3\nComparison of birth weights (kg) of children born to 15 non-smokers with those of children born to 14 heavy smokers.\n\n# bw_ns: non smokers\n# bw_s: smokers\nbw_ns <- c(3.99, 3.89, 3.6, 3.73, 3.31, \n            3.7, 4.08, 3.61, 3.83, 3.41, \n            4.13, 3.36, 3.54, 3.51, 2.71)\nbw_s <- c(3.18, 2.74, 2.9, 3.27, 3.65, \n           3.42, 3.23, 2.86, 3.6, 3.65, \n           3.69, 3.53, 2.38, 2.34)\n\nCan visualize the data on two histograms. Red lines indicate the location of medians.\n\npar(mfrow =c(1,2))\nhist(bw_ns, main = 'Birthweight: non-smokers')\nabline(v = median(bw_ns), col = 'red', lwd = 2)\nhist(bw_s, main = 'Birthweight: smokers')\nabline(v = median(bw_s), col = 'red', lwd = 2)\n\n\n\n\n\n\n\n\nIt is possible to see that for non-smokers, the median birthweight is higher than those of smokers. Now we can formally test it with wilcoxon rank sum test.\nThe default test is two-sided with confidence level of 0.95, and does continuity correction.\n\n# default is two sided\nstats::wilcox.test(bw_ns, bw_s, paired = F)\n\nWarning in wilcox.test.default(bw_ns, bw_s, paired = F): cannot compute exact\np-value with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  bw_ns and bw_s\nW = 164.5, p-value = 0.01001\nalternative hypothesis: true location shift is not equal to 0\n\n\nWe can also carry out a one-sided test, by specifying alternative = greater (if the first item is greater than the second).\n\n# default is two sided\nstats::wilcox.test(bw_ns, bw_s, paired = F, alternative = 'greater')\n\nWarning in wilcox.test.default(bw_ns, bw_s, paired = F, alternative =\n\"greater\"): cannot compute exact p-value with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  bw_ns and bw_s\nW = 164.5, p-value = 0.005003\nalternative hypothesis: true location shift is greater than 0"
       },
       {
    -    "objectID": "SAS/cmh.html",
    -    "href": "SAS/cmh.html",
    -    "title": "CMH Test",
    +    "objectID": "R/nonpara_wilcoxon_ranksum.html#useful-references",
    +    "href": "R/nonpara_wilcoxon_ranksum.html#useful-references",
    +    "title": "Wilcoxon Rank Sum (Mann Whitney-U) in R",
         "section": "",
    -    "text": "The CMH procedure tests for conditional independence in partial contingency tables for a 2 x 2 x K design. However, it can be generalized to tables of X x Y x K dimensions.\n\n\nThe cmh test is calculated in SAS using the PROC FREQ procedure. By default, it outputs the chi square statistic, degrees of freedom and p-value for each of the three alternative hypothesis: general association, row means differ, and nonzero correlation. It is up to the statistical analyst or statistician to know which result is appropriate for their analysis.\nWhen the design of the contingency table is 2 x 2 x K (i.e, X == 2 levels, Y == 2 levels, K >= 2 levels), the Mantel-Haenszel Common Odds Ratio (odds ratio estimate, 95% CI, P-value) and the Breslow-Day Test for Homogeneity of the Odds Ratios (chi-square statistic, degrees of freedom, P-value) are also output.\nBelow is the syntax to conduct a CMH analysis in SAS:\n\nProc freq data = filtered_data; \ntables K * X * Y / cmh; \n* the order of K, X, and Y appearing on the line is important!;\nrun;"
    +    "text": "Methods and Formulae\nMann Whitney is not about medians in general\nRelationship between walsh averages and WRS\nHodges Lehmann Problems"
       },
       {
    -    "objectID": "SAS/cmh.html#cmh-in-sas",
    -    "href": "SAS/cmh.html#cmh-in-sas",
    -    "title": "CMH Test",
    +    "objectID": "R/nonpara_wilcoxon_ranksum.html#available-r-packages",
    +    "href": "R/nonpara_wilcoxon_ranksum.html#available-r-packages",
    +    "title": "Wilcoxon Rank Sum (Mann Whitney-U) in R",
         "section": "",
    -    "text": "The cmh test is calculated in SAS using the PROC FREQ procedure. By default, it outputs the chi square statistic, degrees of freedom and p-value for each of the three alternative hypothesis: general association, row means differ, and nonzero correlation. It is up to the statistical analyst or statistician to know which result is appropriate for their analysis.\nWhen the design of the contingency table is 2 x 2 x K (i.e, X == 2 levels, Y == 2 levels, K >= 2 levels), the Mantel-Haenszel Common Odds Ratio (odds ratio estimate, 95% CI, P-value) and the Breslow-Day Test for Homogeneity of the Odds Ratios (chi-square statistic, degrees of freedom, P-value) are also output.\nBelow is the syntax to conduct a CMH analysis in SAS:\n\nProc freq data = filtered_data; \ntables K * X * Y / cmh; \n* the order of K, X, and Y appearing on the line is important!;\nrun;"
    +    "text": "There are three main implementations of the Wilcoxon rank sum test in R.\n\nstats::wilcox.test\nasht::wmwTest()\ncoin::wilcox_test()\n\nThe stats package implements various classic statistical tests, including Wilcoxon rank sum test. Although this is arguably the most commonly applied package, this one does not account for any ties in the data.\n\n# x, y are two unpaired vectors. Do not necessary need to be of the same length.\nstats::wilcox.test(x, y, paired = F)"
       },
       {
    -    "objectID": "SAS/mcnemar.html",
    -    "href": "SAS/mcnemar.html",
    -    "title": "McNemar’s test in SAS",
    +    "objectID": "R/nonpara_wilcoxon_ranksum.html#example-birth-weight",
    +    "href": "R/nonpara_wilcoxon_ranksum.html#example-birth-weight",
    +    "title": "Wilcoxon Rank Sum (Mann Whitney-U) in R",
         "section": "",
    -    "text": "Performing McNemar’s test in SAS\nTo demonstrate McNemar’s test in SAS, data concerning the presence or absence of cold symptoms was used. The symptoms were recorded by the same children at the age of 12 and 14. A total of 2638 participants were involved.\n\nUsing PROC FREQ\nTesting for a significant difference in cold symptoms between ages, using McNemar’s test in SAS, can be performed as below. The AGREE option is stated within the FREQ procedure to produce agreement tests and measures, including McNemar’s test.\n\nproc freq data=colds;\n  tables age12*age14 / agree;\nrun;\n\n\n\nResults\n\n\n\n\n\n\n\n\n\nSAS outputs the tabulated data for proportions, the McNemar’s Chi-square statistic, and the Kappa coefficient with 95% confidence limits. There is no continuity correction used and no option to include this."
    +    "text": "Data source: Table 30.4, Kirkwood BR. and Sterne JAC. Essentials of medical statistics. Second Edition. ISBN 978-0-86542-871-3\nComparison of birth weights (kg) of children born to 15 non-smokers with those of children born to 14 heavy smokers.\n\n# bw_ns: non smokers\n# bw_s: smokers\nbw_ns <- c(3.99, 3.89, 3.6, 3.73, 3.31, \n            3.7, 4.08, 3.61, 3.83, 3.41, \n            4.13, 3.36, 3.54, 3.51, 2.71)\nbw_s <- c(3.18, 2.74, 2.9, 3.27, 3.65, \n           3.42, 3.23, 2.86, 3.6, 3.65, \n           3.69, 3.53, 2.38, 2.34)\n\nCan visualize the data on two histograms. Red lines indicate the location of medians.\n\npar(mfrow =c(1,2))\nhist(bw_ns, main = 'Birthweight: non-smokers')\nabline(v = median(bw_ns), col = 'red', lwd = 2)\nhist(bw_s, main = 'Birthweight: smokers')\nabline(v = median(bw_s), col = 'red', lwd = 2)\n\n\n\n\n\n\n\n\nIt is possible to see that for non-smokers, the median birthweight is higher than those of smokers. Now we can formally test it with wilcoxon rank sum test.\nThe default test is two-sided with confidence level of 0.95, and does continuity correction.\n\n# default is two sided\nstats::wilcox.test(bw_ns, bw_s, paired = F)\n\nWarning in wilcox.test.default(bw_ns, bw_s, paired = F): cannot compute exact\np-value with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  bw_ns and bw_s\nW = 164.5, p-value = 0.01001\nalternative hypothesis: true location shift is not equal to 0\n\n\nWe can also carry out a one-sided test, by specifying alternative = greater (if the first item is greater than the second).\n\n# default is two sided\nstats::wilcox.test(bw_ns, bw_s, paired = F, alternative = 'greater')\n\nWarning in wilcox.test.default(bw_ns, bw_s, paired = F, alternative =\n\"greater\"): cannot compute exact p-value with ties\n\n\n\n    Wilcoxon rank sum test with continuity correction\n\ndata:  bw_ns and bw_s\nW = 164.5, p-value = 0.005003\nalternative hypothesis: true location shift is greater than 0"
       },
       {
    -    "objectID": "SAS/anova.html",
    -    "href": "SAS/anova.html",
    -    "title": "linear-models",
    +    "objectID": "R/manova.html",
    +    "href": "R/manova.html",
    +    "title": "Multivariate Analysis of Variance in R",
         "section": "",
    -    "text": "Getting Started\nTo demonstrate the various types of sums of squares, we’ll create a data frame called df_disease taken from the SAS documentation.\n\n\nThe Model\nFor this example, we’re testing for a significant difference in stem_length using ANOVA.\n\nproc glm;\n   class drug disease;\n   model y=drug disease drug*disease;\nrun;\n\n\n\nSums of Squares Tables\nSAS has four types of sums of squares calculations. To get these calculations, the sum of squares option needs to be added (/ ss1 ss2 ss3 ss4) to the model statement.\n\nproc glm;\n   class drug disease;\n   model y=drug disease drug*disease / ss1 ss2 ss3 ss4;\nrun;\n\n\nType I\n\n\n\n\n\n\n\n\n\n\n\nType II\n\n\n\n\n\n\n\n\n\n\n\nType III\n\n\n\n\n\n\n\n\n\n\n\nType IV"
    +    "text": "For a detailed description of MANOVA including assumptions see Renesh Bedre\nExample 39.6 Multivariate Analysis of Variance from SAS MANOVA User Guide\nThis example employs multivariate analysis of variance (MANOVA) to measure differences in the chemical characteristics of ancient pottery found at four kiln sites in Great Britain. The data are from Tubb, Parker, and Nickless (1980), as reported in Hand et al. (1994).\nFor each of 26 samples of pottery, the percentages of oxides of five metals are measured. The following statements create the data set and perform a one-way MANOVA. Additionally, it is of interest to know whether the pottery from one site in Wales (Llanederyn) differs from the samples from other sites.\n\nlibrary(tidyverse)\n\n── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──\n✔ dplyr     1.1.4     ✔ readr     2.1.5\n✔ forcats   1.0.0     ✔ stringr   1.5.1\n✔ ggplot2   3.5.1     ✔ tibble    3.2.1\n✔ lubridate 1.9.3     ✔ tidyr     1.3.1\n✔ purrr     1.0.2     \n── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag()    masks stats::lag()\nℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors\n\nlibrary(knitr)\nlibrary(emmeans)\n\nWelcome to emmeans.\nCaution: You lose important information if you filter this package's results.\nSee '? untidy'\n\nknitr::opts_chunk$set(echo = TRUE, cache = TRUE)\npottery <- read.csv(\"../data/manova1.csv\")\npottery\n\n           site   al   fe   mg   ca   na\n1    Llanederyn 14.4 7.00 4.30 0.15 0.51\n2    Llanederyn 13.8 7.08 3.43 0.12 0.17\n3    Llanederyn 14.6 7.09 3.88 0.13 0.20\n4    Llanederyn 11.5 6.37 5.64 0.16 0.14\n5    Llanederyn 13.8 7.06 5.34 0.20 0.20\n6    Llanederyn 10.9 6.26 3.47 0.17 0.22\n7    Llanederyn 10.1 4.26 4.26 0.20 0.18\n8    Llanederyn 11.6 5.78 5.91 0.18 0.16\n9    Llanederyn 11.1 5.49 4.52 0.29 0.30\n10   Llanederyn 13.4 6.92 7.23 0.28 0.20\n11   Llanederyn 12.4 6.13 5.69 0.22 0.54\n12   Llanederyn 13.1 6.64 5.51 0.31 0.24\n13   Llanederyn 12.7 6.69 4.45 0.20 0.22\n14   Llanederyn 12.5 6.44 3.94 0.22 0.23\n15     Caldicot 11.8 5.44 3.94 0.30 0.04\n16     Caldicot 11.6 5.39 3.77 0.29 0.06\n17 IslandThorns 18.3 1.28 0.67 0.03 0.03\n18 IslandThorns 15.8 2.39 0.63 0.01 0.04\n19 IslandThorns 18.0 1.50 0.67 0.01 0.06\n20 IslandThorns 18.0 1.88 0.68 0.01 0.04\n21 IslandThorns 20.8 1.51 0.72 0.07 0.10\n22  AshleyRails 17.7 1.12 0.56 0.06 0.06\n23  AshleyRails 18.3 1.14 0.67 0.06 0.05\n24  AshleyRails 16.7 0.92 0.53 0.01 0.05\n25  AshleyRails 14.8 2.74 0.67 0.03 0.05\n26  AshleyRails 19.1 1.64 0.60 0.10 0.03\n\n\n1 Perform one way MANOVA\nResponse ID for ANOVA is order of 1=al, 2=fe, 3=mg, ca, na.\nWe are testing H0: group mean vectors are the same for all groups or they dont differ significantly vs\nH1: At least one of the group mean vectors is different from the rest.\n\ndep_vars <- cbind(pottery$al,pottery$fe,pottery$mg, pottery$ca, pottery$na)\nfit <-manova(dep_vars ~ pottery$site)\nsummary.aov(fit)\n\n Response 1 :\n             Df  Sum Sq Mean Sq F value    Pr(>F)    \npottery$site  3 175.610  58.537  26.669 1.627e-07 ***\nResiduals    22  48.288   2.195                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n Response 2 :\n             Df  Sum Sq Mean Sq F value    Pr(>F)    \npottery$site  3 134.222  44.741  89.883 1.679e-12 ***\nResiduals    22  10.951   0.498                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n Response 3 :\n             Df Sum Sq Mean Sq F value    Pr(>F)    \npottery$site  3 103.35  34.450   49.12 6.452e-10 ***\nResiduals    22  15.43   0.701                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n Response 4 :\n             Df   Sum Sq  Mean Sq F value    Pr(>F)    \npottery$site  3 0.204703 0.068234  29.157 7.546e-08 ***\nResiduals    22 0.051486 0.002340                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n Response 5 :\n             Df  Sum Sq  Mean Sq F value    Pr(>F)    \npottery$site  3 0.25825 0.086082  9.5026 0.0003209 ***\nResiduals    22 0.19929 0.009059                      \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n\n‘summary(fit)’ outputs the MANOVA testing of an overall site effect.\nP<0.001 suggests there is an overall difference between the chemical composition of samples from different sites.\n\nsummary(fit)\n\n             Df Pillai approx F num Df den Df    Pr(>F)    \npottery$site  3 1.5539   4.2984     15     60 2.413e-05 ***\nResiduals    22                                            \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n\n2 Now we test to see if the Llanaderyn site is different to the other sites\nNOTE: interest may now lie in using pre-planned contrast statements to investigate if one site differs when compared to the average of the others. You would imagine this could be done using the ‘contrast’ function something like the code below, however this result does not match the SAS user guide and so looks to be doing a different analysis. SUGGEST THIS IS NOT USED UNTIL MORE RESEARCH INTO THIS METHOD CAN BE PERFORMED. One alternative suggestion is to perform a linear descriminent analysis (LDA).\n\nmanova(dep_vars ~ pottery$site) %>% \n          emmeans(\"site\") %>% \n     contrast(method=list(\n          \"Llanederyn vs other sites\"= c(\"Llanederyn\"=-3, \"Caldicot\"=1, \"IslandThorns\"=1, \"AshleyRails\"=1)))\n\n contrast                  estimate    SE df t.ratio p.value\n Llanederyn vs other sites     1.51 0.661 22   2.288  0.0321\n\nResults are averaged over the levels of: rep.meas \n\n\nNOTE: if you feel you can help with the above discrepancy please contribute to the CAMIS repo by following the instructions on the contributions page."
       },
       {
    -    "objectID": "SAS/logistic-regr.html",
    -    "href": "SAS/logistic-regr.html",
    -    "title": "Logistic Regression in SAS",
    +    "objectID": "index.html",
    +    "href": "index.html",
    +    "title": "CAMIS - A PHUSE DVOST Working Group",
         "section": "",
    -    "text": "For a brief description of what is logistic regression see here.\n\nModelling the lung cancer data\nIn SAS, we can use proc logistic or proc genmod to perform a logistic regression.\nTo demonstrate the use of logistic regression we examine the same lung dataset as used in the R example here.\nSome Common mistakes\n\nHandling of missing data. Check SAS output that the number of missing values is as you expect. Make sure you have changed any NA results in the raw data to be missing, since SAS would consider NA as a valid category (a non-missing character result).\nMake sure you consider continuous or categorical variables as you intended. Just because a variable is character or numeric in the dataset, doesn’t mean SAS will treat it that way in the model. You have to use Class row to tell SAS which variables should be treated as character factors (also using ref=' ' to select the reference category).\nBe careful you are modelling the correct event (response vs non-response, or weight_gain vs weight_loss for example)\nBe careful when interpreting any odds ratios that you have the factor of interest the correct way around (0 vs 1, or 1 vs 0)\nIf using proc logistic, be careful of how SAS creates its parameters used in the model as this determines how you can use the parameter estimates! It is often easiest to use param=glm so that the exp(maximum liklihood parameter estimate) = odds ratio. Check the class level information (Design variables) is as you would expect. See below for more detail on other parameterization methods.\n\nOption 1: Using Proc Logistic with sex and ph_ecog as character factors: sex (2 levels: 1,2) and ph_ecog (4 levels:0,1,2 or 3), meal_cal as continuous. As shown below, the class statement and ref=\" \" option can be used to set the direction of the comparison, /param=glm ensures exp(estimates)=odds ratio.\n\nproc logistic data=lung;  \n    class sex (ref=\"1\") ph_ecog (ref=\"0\")/param=glm;\n    model  wt_grp(event=\"weight_gain\") = age sex ph_ecog meal_cal;\nrun;\n\nOption 2: Using proc Genmod with sex and ph_ecog as character factors: sex (2 levels: 1,2) and ph_ecog (4 levels:0,1,2 or 3), meal_cal as continuous. This gets the same results as above. You can use exp(maximum likelihood parameter estimate) to obtain the odds ratios and 95% CIs for the odds ratios. The below already uses GLM parameterization.\n\nproc genmod data=lung; \n      class sex (ref=\"1\") ph_ecog (ref=\"0\"); \n      model wt_grp (event=\"weight_gain\") = age sex ph_ecog meal_cal / dist=bin link=logit;\nrun;\n\nOption 3: Using proc logistic, however this time all covariates are treated as continuous parameters not categorical. You do need to ensure age sex ph_ecog and meal_cal are numeric SAS variables else you will get an error message suggesting to add the varibles to a class statement.\n\nproc logistic data=lung;\nmodel wt_grp(event=\"weight_gain\") = age sex ph_ecog meal_cal;\nrun;\n\nComparison with R model Option 3 is used with the following 3 models, in order to match the same analysis performed in R. This is modelling Sex and ECOG as continuous parameters. We analyze the weight gain in lung cancer patients in dependency of age, sex, ECOG performance score and calories consumed at meals. Weight is categorized into a binary variable for Loss or Gain. The probability modelled is weight_gain.\nWe fit 3 models. In\n\nModel 1: Weight Loss (1/0) = Age + Sex + ECOG + Calories\nModel 2: Weight Loss (1/0) = Sex + ECOG + Calories\nModel 3: Using backwards selection to compare models with/without age\n\n\ntitle1 \"Model 1\";                                                                                                             \nproc logistic data=lung;                                                                                                    \n  model  wt_grp (event=\"weight_gain\")  = age sex ph_ecog meal_cal;                                                                                    \nrun;  \n\nResponse Profile\nOrdered value     wt_grp         Total Frequency\n-----------------------------------------------------------------------------\n1                 weight_gain     122 \n2                 weight_loss     48\n-----------------------------------------------------------------------------\n\nModel 1 Results\n                    Analysis of Maximum Likelihood Estimates                 \n\nParameter   DF     Estimate       Standard Error    Wald Chi-Square  Pr>ChiSq\n-----------------------------------------------------------------------------\nIntercept   1      3.2632         1.6488            3.9168            0.0478\nAge         1     -0.0102         0.0208            0.2389            0.6250\nSex         1     -0.8717         0.3714            5.5090            0.0189\nph_ecog     1      0.4180         0.2589            2.6069            0.1064\nmeal_cal    1     -0.00089        0.000447          3.9417            0.0471\n----------------------------------------------------------------------------\n\nModel Fit Statistics\nCriterion   Intercept Only     Intercept and Covariates       \n--------------------------------------------------------\nAIC         204.355            201.505\nSC          207.491            217.184\n-2 Log L    202.355            191.505   \n--------------------------------------------------------\n\n\ntitle1 \"Model 2\";                                                    \nproc logistic data=lung2;\nmodel  wt_grp (event=\"weight_gain\") = sex ph_ecog meal_cal;\nrun;             \n\nModel 2 Results\n                    Analysis of Maximum Likelihood Estimates                 \n\nParameter   DF     Estimate       Standard Error    Wald Chi-Square  Pr>ChiSq\n-----------------------------------------------------------------------------\nIntercept   1      2.5607         0.7977           10.3047            0.0013\nSex         1     -0.8359         0.3637            5.2815            0.0216\nph_ecog     1      0.3794         0.2469            2.3616            0.1244\nmeal_cal    1     -0.00083        0.000435          3.6770            0.0552\n----------------------------------------------------------------------------\n\nModel Fit Statistics\nCriterion   Intercept Only     Intercept and Covariates       \n--------------------------------------------------------\nAIC         204.355            201.505\nSC          207.491            217.184\n-2 Log L    202.355            191.505   \n--------------------------------------------------------\n\n\ntitle1 \"Using selection=backward to get model comparison stats\"; \nproc logistic data=lung2;  \nmodel  wt_grp (event=\"weight_gain\")  = age sex ph_ecog meal_cal / selection = backward stop=3; \nrun;   \n\nStep 1: Effect age is removed\nSummary of Backward Elimination\nStep   Effect Removed   DF     Number In     Wald Chi-Square   Pr>ChiSq\n-----------------------------------------------------------------------------\n1      Age              1      3             0.2389            0.6250   \n-----------------------------------------------------------------------------\n\nNote: The number of effects in the model has reached STOP=3, (when 3 variables remain in the model, it will not proceed to remove any more even if the ones left are not significant)\n\nModel 3 Results\n                    Analysis of Maximum Likelihood Estimates                 \n\nParameter   DF     Estimate       Standard Error    Wald Chi-Square  Pr>ChiSq\n-----------------------------------------------------------------------------\nIntercept   1      2.5607         0.7977           10.3047            0.0013\nSex         1     -0.8359         0.3637            5.2815            0.0216\nph_ecog     1      0.3794         0.2469            2.3616            0.1244\nmeal_cal    1     -0.00083        0.000435          3.6770            0.0552\n----------------------------------------------------------------------------\n\nNOTE: the chi-square test summary of backward elimination, p=0.6250 is different to the results in R, which gave a difference in deviance of -0.24046, p=0.6239. This difference is currently being investigated.\n\n\nParameterization of model effects (categorical covariates) in SAS\nThe most common problem when fitting logistic regression in SAS, is getting SAS to model the binary variable (events) and any categorical covariates correctly.\nThere are two procedures which can be used to perform logistic regression in SAS, proc logistic, and proc genmod (using dist=bin and link=logit options). They obtain the same results when parameterized correctly. However proc logistic has three ways to parameterize categorical variables, and failure to parameterize correctly can lead to incorrect interpretation of results. Parameterization is what SAS does when you include a categorical variable in your model. It codes that variable using new parameters and it fits those into your model.\nThe default parameterization is /PARAM=EFFECT - This is shown as Example A in the design matrix example figure below.\nFor the example of a categorical variable trt - which has 3 treatment levels (Active 1, Active 2, Placebo). With the EFFECT option, the reference level (Placebo) is given values of “-1” for both of the x1 and x2 parameters. The design matrix consists of 1 less parameter than the number of levels of your variable (so that for 3 treatment groups you have x1 and x2 - 2 parameters in the model). Which reference category is selected is specified either by using the ref='X' option, or the default which would be the last value of the variable. In our example (as we have not specified ref='X' this is Placebo (as this is last in the alphabet after Active 1 and Active 2).\n\nproc logistic data=dataset; \n      CLASS TRTP /PARAM=EFFECT; \n      MODEL resp (event=\"Y\") = TRTP ;\nrun;\n\nor \n\nproc logistic data=dataset; \n      CLASS TRTP; \n      MODEL resp (event=\"Y\") = TRTP ;\nrun;\n\nAlternatively, you change the parameterization in SAS using the following options:\nPARAM=REF - This is shown as Example B below - reference parameter values “0”, n-1 variables\n\nproc logistic data=dataset; \n      CLASS TRTP /PARAM=REF; \n      MODEL resp (event=\"Y\") = TRTP ;\nrun;\n\nPARAM=GLM - This is shown as Example C below - no reference parameter as such (output compares against last value of treatment group), n variables.\n\nproc logistic data=dataset;  \n      CLASS TRTP /PARAM=GLM; \n      MODEL resp (event=\"Y\") = TRTP ;\nrun;\n\nDesign Matrix Examples\n\n\n\n\n\n\n\n\n\nDepending on which parameterization you use, you have to interpret the estimates you obtains from the model carefully. It is also very important to check the reference assigned is the correct one.\nThis is also particularly important if you are using any contrast, estimate or lsmestimate statements since the coefficients used for the contrasts must be in line with the parameterization.\n\n\nExample of deriving contrast statements in SAS\nThe table below shows the how the parameterizations using EFFECT, REF or GLM, translate to the model being fitted.\nUsing General model: Y= α + β1x1 + β2x1 {+β3x3}, the treatments are represented as follows:\n\nTreatment  Effect(A)          REF (B)       GLM (C)\n--------------------------------------------------------\nActive A   Y = α + β1         Y = α + β1    Y = α + β1 \nActive B   Y = α + β2         Y = α + β2    Y = α + β2 \nPlacebo    Y = α - β1 - β2    Y = α         Y = α + β3 \n--------------------------------------------------------\n\nNow let’s suppose we wanted to compare the average of the Active Treatment groups versus the Placebo treatment group. (A+B)/2 compared to Placebo.\nEFFECT (A) parameterization\n\n((α + β1 + α + β2 ) /2 ) - (α - β1 - β2)\n= α + 0.5 β1 + 0.5 β2 - α + β1 + β2  \n= 1.5 β1 + 1.5 β2\n\nTherefore, to apply this contrast in SAS we would use:\n\nPROC LOGISTIC data=dataset;\nCLASS trt ; -default PARAM=EFFECT option is used so last trt is reference \nMODEL resp (event=\"Y\") = trt ; \nCONTRAST \"Active (A & B) vs. Placebo\" trt 1.5 1.5 / e; \nRUN;\n\nGLM (C) parameterization\nThe GLM parameterization can be more intuitive.\n\n((α + β1 + α + β2)/2 - (α + β3) \n= α + 0.5 β1 + 0.5 β2 - α - β3 \n= 0.5 β1 + 0.5 β2 - β3\n\nTherefore, to apply this contrast in SAS we would use:\n\nPROC LOGISTIC data=dataset; \nCLASS trt / param=glm; \nMODEL resp (event=\"Y\") = trt ; \nCONTRAST \"Active (2 & 3) vs. Placebo (1)\" trt 0.5 0.5 -1 / e; \nRUN;\n\nFor this reason, it is common to either use the default PARAM=Effect with ref=“X” option. or to use the param=GLM with no ref=“X” option. It is very important to check the output design matrix so you know what parameterization and reference groups are being used.\n\n\nEnsuring you are modelling the correct Binary event in SAS\nWith logistic regression, we often want to model the number of “Successes”. However, by default, SAS sorts alphabetically/numerically and selects the first occurring EVENT alphabetically as the one it’s going to model.\nIt’s a common mistake, and we find SAS modelling the number of failures instead of successes. Very common when your response is: ‘Responder’ vs ‘Non-responder’, SAS will model the Non-responders as ‘N’ is alphabetically first before ‘R’!\nFor this reason, It is recommended to always use the event=“Y” option.\nOptions such as ORDER=DATA|FORMATTED|FREQ|INTERNAL as well as descending can be used to ensure the correct levels of classification variables are being modelled. More detail here"
    +    "text": "Introduction\nSeveral discrepancies have been discovered in statistical analysis results between different programming languages, even in fully qualified statistical computing environments. Subtle differences exist between the fundamental approaches implemented by each language, yielding differences in results which are each correct in their own right. The fact that these differences exist causes unease on the behalf of sponsor companies when submitting to a regulatory agency, as it is uncertain if the agency will view these differences as problematic. In its Statistical Software Clarifying Statement, the US Food and Drug Administration (FDA) states that it “FDA does not require use of any specific software for statistical analyses” and that “the computer software used for data management and statistical analysis should be reliable.” Observing differences across languages can reduce the analyst’s confidence in reliability and, by understanding the source of any discrepancies, one can reinstate confidence in reliability.\n\nMotivation\nThe goal of this project is to demystify conflicting results between software and to help ease the transitions to new languages by providing comparison and comprehensive explanations.\n\n\nRepository\nThe repository below provides examples of statistical methodology in different software and languages, along with a comparison of the results obtained and description of any discrepancies.\n\n\n\n\n\n\n\n\nMethods\nR\nSAS\nPython\nComparison\n\n\n\n\nSummary Statistics\nRounding\nR\nSAS\nPython\nR vs SAS\n\n\nSummary statistics\nR\nSAS\nPython\nR vs SAS\n\n\nSkewness/Kurtosis\nR\nSAS\nPython\nR vs SAS\n\n\nGeneral Linear Models\nOne Sample t-test\nR\nSAS\nPython\nR vs SAS\n\n\nPaired t-test\nR\nSAS\nPython\nR vs SAS\n\n\nTwo Sample t-test\nR\nSAS\nPython\nR vs SAS\n\n\nANOVA\nR\nSAS\nPython\nR vs SAS\n\n\nANCOVA\nR\nSAS\nPython\nR vs SAS\n\n\nMANOVA\nR\nSAS\nPython\nR vs SAS\n\n\nLinear Regression\nR\nSAS\nPython\nR vs SAS\n\n\nGeneralized Linear Models\nLogistic Regression\nR\nSAS\nPython\nR vs SAS\n\n\nPoisson/Negative Binomial Regression\nR\n\n\nR vs SAS\n\n\nCategorical Repeated Measures\n\n\n\n\n\n\nCategorical Multiple Imputation\n\n\n\n\n\n\nNon-parametric Analysis\nWilcoxon signed rank\nR\nSAS\n\nR vs SAS\n\n\nMann-Whitney U/Wilcoxon rank sum\nR\nSAS\n\n\n\n\nKolmogorov-Smirnov test\n\n\n\n\n\n\nKruskall-Wallis test\nR\nSAS\nPython\nR vs SAS\n\n\nFriedman test\n\n\n\n\n\n\nJonckheere test\nR\nSAS\n\nR vs SAS\n\n\nHodges-Lehman Estimator\nR\nSAS\n\n\n\n\nCategorical Data Analysis\nBinomial test\nR\n\n\n\n\n\nMcNemar's test\nR\nSAS\n\nR vs SAS\n\n\nChi-Square Association/Fishers exact\nR\nSAS\nPython\nR vs SAS\n\n\nCochran Mantel Haenszel\nR\nSAS\n\nR vs SAS\n\n\nConfidence Intervals for proportions\nR\nSAS\n\nR vs SAS\n\n\nRepeated Measures\nLinear Mixed Model (MMRM)\nR\nSAS\n\nR vs SAS\n\n\nLinear Mixed Model (degrees of freedom)\n\n\n\n\n\n\nGeneralized Linear Mixed Model (MMRM)\n\n\n\n\n\n\nBayesian MMRM\n\n\n\n\n\n\nMultiple Imputation - Continuous Data MAR\nMCMC\n\n\n\n\n\n\nLinear regression\nR\n\n\n\n\n\nPredictive Mean Matching\nR\n\n\n\n\n\nMultiple Imputation - Continuous Data MNAR\nDelta Adjustment/Tipping Point\n\n\n\n\n\n\nReference-Based Imputation/Sequential Methods\n\n\n\n\n\n\nReference-Based Imputation/Joint Modelling\n\n\n\n\n\n\nCorrelation\nPearson's/ Spearman's/ Kendall's Rank\nR\nSAS\nPython\nR vs SAS\n\n\nSurvival Models\nKaplan-Meier Log-rank test and Cox-PH\nR\nSAS\n\nR vs SAS\n\n\nAccelerated Failure Time\nR\n\n\n\n\n\nNon-proportional hazards methods\nR\n\n\n\n\n\nCumulative Incidence Functions\nR\nSAS\n\nR vs SAS\n\n\nSample size /Power calculations\nSingle timepoint analysis\n\n\n\n\n\n\nGroup sequential designs\nR\n\n\nEast\n\n\nMultivariate methods\nClustering\nR\n\n\n\n\n\nFactor analysis\n\n\n\n\n\n\nPCA\nR\n\n\n\n\n\nCanonical correlation\n\n\n\n\n\n\nPLS\n\n\n\n\n\n\nCausal inference\nPropensity scores\n\n\n\n\n\n\nMatching\n\n\n\n\n\n\nWeighting\n\n\n\n\n\n\nG-computation\n\n\n\n\n\n\nOther Methods\nSurvey statistics\nR\nSAS\nPython\nR vs SAS vs Python\n\n\nNearest neighbour\n\n\n\n\n\n\nMachine learning\nR"
       },
       {
    -    "objectID": "SAS/nparestimate.html",
    -    "href": "SAS/nparestimate.html",
    -    "title": "Non-parametric point estimation in SAS",
    +    "objectID": "LICENSE.html",
    +    "href": "LICENSE.html",
    +    "title": "Apache License",
         "section": "",
    -    "text": "Introduction\nThe Hodges-Lehman estimator (Hodges and Lehmann 1962) provides a point estimate which is associated with the Wilcoxon rank sum statistics based on location shift. This is typically used for the 2-sample comparison with small sample size. Note: The Hodges-Lehman estimates the median of the difference and not the difference of the medians. The corresponding distribution-free confidence interval (CI) is also based on the Wilcoxon rank sum statistics (Moses). In addition, exact CIs can be constructed.\nPROC NPAR1WAY provides these estimates in a flexible manner.\nHodges, J. L. and Lehmann, E. L. (1962) Rank methods for combination of independent experiments in analysis of variance. Annals of Mathematical Statistics, 33, 482-4.\n\n\nCase study\n\n# Hollander-Wolfe-Chicken Example\ndata all ;\ninput group $ value ; \ncards ;\nA 1.83\nA 0.50\nA 1.62\nA 2.48\nA 1.68\nA 1.88\nA 1.55\nA 3.06\nA 1.30\nB 0.878\nB 0.647\nB 0.598\nB 2.050\nB 1.060\nB 1.290\nB 1.060\nB 3.140\nB 1.290\n; \nrun ;\n\n\n\nHodges-Lehmann estimate and confidence interval\nHodges-Lehmann estimate and Moses confidence interval for the 2-sample case will be generated when putting HL as an option. The direction of the comparison can be controlled via refclass. If the exact confidence interval is required additionally then the exact statement together with the option HL needs to be defined. The Hodges-Lehmann point estimate and confidence interval can be addressed via the HodgesLehmann option under the ODS statement.\n\nproc npar1way hl (refclass = \"B\") data = all ;\n   class group ;\n   var value ;\n   exact hl ;\n   ods select HodgesLehmann ;\nrun ;\n\n\n\nResults\nThe NPAR1WAY Procedure\n                                           Hodges-Lehmann Estimation                                                \n                                                                                                                    \n                                        Location Shift (A - B)    0.5600                                            \n                                                                                                                    \n                                                                   Interval        Asymptotic                       \n                   Type                 95% Confidence Limits      Midpoint    Standard Error                       \n                                                                                                                    \n                   Asymptotic (Moses)     -0.3700      1.1830        0.4065            0.3962                       \n                   Exact                  -0.2200      1.0820        0.4310"
    +    "text": "Apache License\nVersion 2.0, January 2004 <http://www.apache.org/licenses/>\n\nTerms and Conditions for use, reproduction, and distribution\n\n1. Definitions\n“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.\n“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”\n“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n\n2. Grant of Copyright License\nSubject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n\n3. Grant of Patent License\nSubject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n\n4. Redistribution\nYou may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n(b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\nYou may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n\n5. Submission of Contributions\nUnless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n\n6. Trademarks\nThis License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n\n7. Disclaimer of Warranty\nUnless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n\n8. Limitation of Liability\nIn no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n\n9. Accepting Warranty or Additional Liability\nWhile redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\nEND OF TERMS AND CONDITIONS\n\n\n\nAPPENDIX: How to apply the Apache License to your work\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets [] replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.\nCopyright 2024 PHUSE\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n  http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License."
       },
       {
    -    "objectID": "Comp/r-sas_ci_for_prop.html",
    -    "href": "Comp/r-sas_ci_for_prop.html",
    -    "title": "R vs SAS Confidence Intervals for Proportions",
    +    "objectID": "R/mcnemar.html",
    +    "href": "R/mcnemar.html",
    +    "title": "McNemar’s test in R",
         "section": "",
    -    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (different subjects in each of the 2 groups), or can be matched (the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more technical derivation and reasons for use for each of the methods listed below, see the corresponding SAS page."
    +    "text": "Performing McNemar’s test in R\nTo demonstrate McNemar’s test, data was used concerning the presence or absence of cold symptoms reported by the same children at age 12 and age 14. A total of 2638 participants were involved.\n\nUsing the epibasix::mcnemar function\nTesting for a significant difference in cold symptoms between the two ages using the mcNemar function from the epibasix package can be performed as below. The symptoms for participants at age 12 and age 14 are tabulated and stored as an object, then passed to the mcNemar function. A more complete view of the output is achieved by calling the summary function.\n\nlibrary(epibasix)\n\nX <- table(colds$age12, colds$age14)\nepi_mcn <- mcNemar(X)\nsummary(epi_mcn)\n\n\nMatched Pairs Analysis: McNemar's Statistic and Odds Ratio (Detailed Summary):\n \n     \n       No Yes\n  No  707 256\n  Yes 144 212\n\nEntries in above matrix correspond to number of pairs. \n \nMcNemar's Chi^2 Statistic (corrected for continuity) = 30.802 which has a p-value of: 0\nNote: The p.value for McNemar's Test corresponds to the hypothesis test: H0: OR = 1 vs. HA: OR != 1\nMcNemar's Odds Ratio (b/c): 1.778\n95% Confidence Limits for the OR are: [1.449, 2.208]\nThe risk difference is: 0.085\n95% Confidence Limits for the rd are: [0.055, 0.115]\n\n\n\n\nUsing the stats::mcnemar.test function\nMcNemar’s test can also be performed using stats::mcnemar.test as shown below, using the same table X as in the previous section.\n\nmcnemar.test(X)\n\n\n    McNemar's Chi-squared test with continuity correction\n\ndata:  X\nMcNemar's chi-squared = 30.802, df = 1, p-value = 2.857e-08\n\n\nThe result is shown without continuity correction by specifying correct=FALSE.\n\nmcnemar.test(X, correct=FALSE)\n\n\n    McNemar's Chi-squared test\n\ndata:  X\nMcNemar's chi-squared = 31.36, df = 1, p-value = 2.144e-08\n\n\n\n\nResults\nAs default, using summary with epibasix::mcNemar gives additional information to the McNemar’s chi-square statistic. This includes a table to view proportions, and odds ratio and risk difference with 95% confidence limits. The result uses Edward’s continuity correction without the option to remove this, which is consistent with other functions within the package.\nstats::mcnemar.test uses a continuity correction as default but does allow for this to be removed. This function does not output any other coefficients for agreement or proportions but (if required) these can be achieved within other functions or packages in R."
       },
       {
    -    "objectID": "Comp/r-sas_ci_for_prop.html#introduction",
    -    "href": "Comp/r-sas_ci_for_prop.html#introduction",
    -    "title": "R vs SAS Confidence Intervals for Proportions",
    +    "objectID": "R/kruskal_wallis.html",
    +    "href": "R/kruskal_wallis.html",
    +    "title": "Kruskal Wallis R",
         "section": "",
    -    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (different subjects in each of the 2 groups), or can be matched (the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more technical derivation and reasons for use for each of the methods listed below, see the corresponding SAS page."
    +    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of datasets::iris, testing for difference in sepal width between species of flower.\n\n\n      Species Sepal_Width\n1      setosa         3.4\n2      setosa         3.0\n3      setosa         3.4\n4      setosa         3.2\n5      setosa         3.5\n6      setosa         3.1\n7  versicolor         2.7\n8  versicolor         2.9\n9  versicolor         2.7\n10 versicolor         2.6\n11 versicolor         2.5\n12 versicolor         2.5\n13  virginica         3.0\n14  virginica         3.0\n15  virginica         3.1\n16  virginica         3.8\n17  virginica         2.7\n18  virginica         3.3"
       },
       {
    -    "objectID": "Comp/r-sas_ci_for_prop.html#general-comparison-table-for-single-sample-proportions",
    -    "href": "Comp/r-sas_ci_for_prop.html#general-comparison-table-for-single-sample-proportions",
    -    "title": "R vs SAS Confidence Intervals for Proportions",
    -    "section": "General Comparison Table For Single Sample Proportions",
    -    "text": "General Comparison Table For Single Sample Proportions\nThe following table provides an overview of the results comparing between R and SAS for Single Sample Proportions and independent 2 sample proportions . See the corresponding SAS page and R page for results showing a single set of data run through both SAS and R.\n\n\n\n\n\n\n\n\n\nAnalysis of One Sample Proportion\nSupported in R\nSupported in SAS\nResults Match\n\n\n\n\nClopper-Pearson Exact\nYes {cardx}\nYes (default)\nYes\n\n\nNormal approximation (Wald Method)\nYes {cardx}\nYes (default)\nYes\n\n\nNormal approximation (Wald Method) with continuity correction\nYes {cardx}\nYes\nYes\n\n\nWilson (Score, Altman, Newcombe) method\nYes {cardx}\nYes\nYes\n\n\nWilson (Score, Altman, Newcombe) method with continuity correction\nYes {cardx}\nYes\nYes\n\n\nAgresti Coull\nYes {cardx}\nYes\nYes\n\n\nJeffreys Bayesian HPD\nYes {cardx}\nYes\nYes\n\n\nmidp\nYes {PropCIs}\nYes\nresults match to the 3rd decimal place\n\n\nBlaker\nYes {PropCIs}\nYes\nresults match to the 5th decimal place\n\n\nWilson Stratified score\nYes {cardx}\nNo\nNA"
    +    "objectID": "R/kruskal_wallis.html#introduction",
    +    "href": "R/kruskal_wallis.html#introduction",
    +    "title": "Kruskal Wallis R",
    +    "section": "",
    +    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of datasets::iris, testing for difference in sepal width between species of flower.\n\n\n      Species Sepal_Width\n1      setosa         3.4\n2      setosa         3.0\n3      setosa         3.4\n4      setosa         3.2\n5      setosa         3.5\n6      setosa         3.1\n7  versicolor         2.7\n8  versicolor         2.9\n9  versicolor         2.7\n10 versicolor         2.6\n11 versicolor         2.5\n12 versicolor         2.5\n13  virginica         3.0\n14  virginica         3.0\n15  virginica         3.1\n16  virginica         3.8\n17  virginica         2.7\n18  virginica         3.3"
       },
       {
    -    "objectID": "Comp/r-sas_ci_for_prop.html#general-comparison-table-for-two-independent-samples-proportions",
    -    "href": "Comp/r-sas_ci_for_prop.html#general-comparison-table-for-two-independent-samples-proportions",
    -    "title": "R vs SAS Confidence Intervals for Proportions",
    -    "section": "General Comparison Table For Two Independent Samples Proportions",
    -    "text": "General Comparison Table For Two Independent Samples Proportions\n\n\n\n\n\n\n\n\n\nAnalysis of Two independant Sample Proportions\nSupported in R\nSupported in SAS\nResults Match\n\n\n\n\nNormal approximation (Wald Method)\nYes {cardx} ard_stats_prop_test function uses stats::prop.test\nYes (default)\nYes, but documentation for stats::prop.test says it’s using newcombe method so more research needed given results match wald method?\n\n\nNormal approximation (Wald Method) with continuity correction\nYes {cardx} ard_stats_prop_test function uses stats::prop.test\nYes\nUnknown.\n\n\nWilson (Score, Altman, Newcombe) method\nUnknown - more research needed\nYes\nSAS results match by hand calculation\n\n\nWilson (Score, Altman, Newcombe) method with continuity correction\nUnknown - more research needed\nYes\nSAS results match by hand calculation"
    +    "objectID": "R/kruskal_wallis.html#implementing-kruskal-wallis-in-r",
    +    "href": "R/kruskal_wallis.html#implementing-kruskal-wallis-in-r",
    +    "title": "Kruskal Wallis R",
    +    "section": "Implementing Kruskal-Wallis in R",
    +    "text": "Implementing Kruskal-Wallis in R\nThe Kruskal-Wallis test can be implemented in R using stats::kruskal.test. Below, the test is defined using R’s formula interface (dependent ~ independent variable) and specifying the data set. The null hypothesis is that the samples are from identical populations.\n\nkruskal.test(Sepal_Width~Species, data=iris_sub)\n\n\n    Kruskal-Wallis rank sum test\n\ndata:  Sepal_Width by Species\nKruskal-Wallis chi-squared = 10.922, df = 2, p-value = 0.004249"
       },
       {
    -    "objectID": "Comp/r-sas_ci_for_prop.html#prerequisites-r-packages",
    -    "href": "Comp/r-sas_ci_for_prop.html#prerequisites-r-packages",
    -    "title": "R vs SAS Confidence Intervals for Proportions",
    -    "section": "Prerequisites: R Packages",
    -    "text": "Prerequisites: R Packages\nSee the R page for more detail.\n\n# Example R packages required\nlibrary(cardx)"
    +    "objectID": "R/kruskal_wallis.html#results",
    +    "href": "R/kruskal_wallis.html#results",
    +    "title": "Kruskal Wallis R",
    +    "section": "Results",
    +    "text": "Results\nAs seen above, R outputs the Kruskal-Wallis rank sum statistic (10.922), the degrees of freedom (2), and the p-value of the test (0.004249). Therefore, the difference in population medians is statistically significant at the 5% level."
       },
       {
    -    "objectID": "Comp/r-sas_cmh.html",
    -    "href": "Comp/r-sas_cmh.html",
    -    "title": "R vs SAS CMH",
    +    "objectID": "R/ttest_Paired.html",
    +    "href": "R/ttest_Paired.html",
    +    "title": "Paired t-test",
         "section": "",
    -    "text": "The CMH procedure tests for conditional independence in partial contingency tables for a 2 x 2 x K design. However, it can be generalized to tables of X x Y x K dimensions.\n\n\n\n\n\n\n\n\n\n\n\nFor the remainder of this document, we adopt the following naming convention when referring to variables of a contingency table:\n\nX = exposure\nY = response\nK = control\n\n\n\n\nThe scale of the exposure (X) and response (Y) variables dictate which test statistic is computed for the contingency table. Each test statistic is evaluated on different degrees of freedom (df):\n\nGeneral association statistic (X and Y both nominal) results in (X-1) * (Y-1) dfs\nRow mean scores statistic (X is nominal and Y is ordinal) results in X-1 dfs\nNonzero correlation statistic (X and Y both ordinal) results in 1 df"
    +    "text": "The Paired t-test is used when two samples are naturally correlated. In the Paired t-test, the difference of the means between the two samples is compared to a given number that represents the null hypothesis. For a Paired t-test, the number of observations in each sample must be equal.\nIn R, a Paired t-test can be performed using the Base R t.test() from the stats package or the proc_ttest() function from the procs package.\n\n\nBy default, the R paired t-test functions assume normality in the data and use a classic Student’s t-test.\n\n\nThe following data was used in this example.\n\n# Create sample data\npressure <- tibble::tribble(\n  ~SBPbefore, ~SBPafter,\n  120, 128,   \n  124, 131,   \n  130, 131,   \n  118, 127,\n  140, 132,   \n  128, 125,   \n  140, 141,   \n  135, 137,\n  126, 118,   \n  130, 132,   \n  126, 129,   \n  127, 135\n)\n\n\n\n\n\n\nThe following code was used to test the comparison in Base R.\n\n  # Perform t-test\n  t.test(pressure$SBPbefore, pressure$SBPafter, paired = TRUE)\n\n\n    Paired t-test\n\ndata:  pressure$SBPbefore and pressure$SBPafter\nt = -1.0896, df = 11, p-value = 0.2992\nalternative hypothesis: true mean difference is not equal to 0\n95 percent confidence interval:\n -5.536492  1.869825\nsample estimates:\nmean difference \n      -1.833333 \n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a paired t-test.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(pressure,\n     paired = \"SBPbefore*SBPafter\")\n\n$Statistics\n       VAR1     VAR2               DIFF  N      MEAN      STD   STDERR MIN MAX\n1 SBPbefore SBPafter SBPbefore-SBPafter 12 -1.833333 5.828353 1.682501  -9   8\n\n$ConfLimits\n       VAR1     VAR2               DIFF      MEAN      LCLM     UCLM      STD\n1 SBPbefore SBPafter SBPbefore-SBPafter -1.833333 -5.536492 1.869825 5.828353\n   LCLMSTD  UCLMSTD\n1 4.128777 9.895832\n\n$TTests\n       VAR1     VAR2               DIFF DF         T     PROBT\n1 SBPbefore SBPafter SBPbefore-SBPafter 11 -1.089648 0.2991635\n\n\nViewer Output:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe Base R t.test() function does not have an option for lognormal data. Likewise, the procs proc_ttest() function also does not have an option for lognormal data.\nOne possibility may be the tTestLnormAltPower() function from the EnvStats package. This package has not been evaluated yet."
       },
       {
    -    "objectID": "Comp/r-sas_cmh.html#naming-convention",
    -    "href": "Comp/r-sas_cmh.html#naming-convention",
    -    "title": "R vs SAS CMH",
    +    "objectID": "R/ttest_Paired.html#normal",
    +    "href": "R/ttest_Paired.html#normal",
    +    "title": "Paired t-test",
         "section": "",
    -    "text": "For the remainder of this document, we adopt the following naming convention when referring to variables of a contingency table:\n\nX = exposure\nY = response\nK = control"
    +    "text": "By default, the R paired t-test functions assume normality in the data and use a classic Student’s t-test.\n\n\nThe following data was used in this example.\n\n# Create sample data\npressure <- tibble::tribble(\n  ~SBPbefore, ~SBPafter,\n  120, 128,   \n  124, 131,   \n  130, 131,   \n  118, 127,\n  140, 132,   \n  128, 125,   \n  140, 141,   \n  135, 137,\n  126, 118,   \n  130, 132,   \n  126, 129,   \n  127, 135\n)\n\n\n\n\n\n\nThe following code was used to test the comparison in Base R.\n\n  # Perform t-test\n  t.test(pressure$SBPbefore, pressure$SBPafter, paired = TRUE)\n\n\n    Paired t-test\n\ndata:  pressure$SBPbefore and pressure$SBPafter\nt = -1.0896, df = 11, p-value = 0.2992\nalternative hypothesis: true mean difference is not equal to 0\n95 percent confidence interval:\n -5.536492  1.869825\nsample estimates:\nmean difference \n      -1.833333 \n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a paired t-test.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(pressure,\n     paired = \"SBPbefore*SBPafter\")\n\n$Statistics\n       VAR1     VAR2               DIFF  N      MEAN      STD   STDERR MIN MAX\n1 SBPbefore SBPafter SBPbefore-SBPafter 12 -1.833333 5.828353 1.682501  -9   8\n\n$ConfLimits\n       VAR1     VAR2               DIFF      MEAN      LCLM     UCLM      STD\n1 SBPbefore SBPafter SBPbefore-SBPafter -1.833333 -5.536492 1.869825 5.828353\n   LCLMSTD  UCLMSTD\n1 4.128777 9.895832\n\n$TTests\n       VAR1     VAR2               DIFF DF         T     PROBT\n1 SBPbefore SBPafter SBPbefore-SBPafter 11 -1.089648 0.2991635\n\n\nViewer Output:"
       },
       {
    -    "objectID": "Comp/r-sas_cmh.html#scale",
    -    "href": "Comp/r-sas_cmh.html#scale",
    -    "title": "R vs SAS CMH",
    +    "objectID": "R/ttest_Paired.html#lognormal",
    +    "href": "R/ttest_Paired.html#lognormal",
    +    "title": "Paired t-test",
         "section": "",
    -    "text": "The scale of the exposure (X) and response (Y) variables dictate which test statistic is computed for the contingency table. Each test statistic is evaluated on different degrees of freedom (df):\n\nGeneral association statistic (X and Y both nominal) results in (X-1) * (Y-1) dfs\nRow mean scores statistic (X is nominal and Y is ordinal) results in X-1 dfs\nNonzero correlation statistic (X and Y both ordinal) results in 1 df"
    -  },
    -  {
    -    "objectID": "Comp/r-sas_cmh.html#data",
    -    "href": "Comp/r-sas_cmh.html#data",
    -    "title": "R vs SAS CMH",
    -    "section": "Data",
    -    "text": "Data\nTo begin investigating the differences in the SAS and R implementations of the CMH test, we decided to use the CDISC Pilot data set, which is publicly available on the PHUSE Test Data Factory repository. We applied very basic filtering conditions upfront (see below) and this data set served as the basis of the examples to follow.\n\n\n# A tibble: 6 × 36\n  STUDYID  SITEID SITEGR1 USUBJID TRTSDT     TRTEDT     TRTP  TRTPN   AGE AGEGR1\n  <chr>    <chr>  <chr>   <chr>   <date>     <date>     <chr> <dbl> <dbl> <chr> \n1 CDISCPI… 701    701     01-701… 2014-01-02 2014-07-02 Plac…     0    63 <65   \n2 CDISCPI… 701    701     01-701… 2012-08-05 2012-09-01 Plac…     0    64 <65   \n3 CDISCPI… 701    701     01-701… 2013-07-19 2014-01-14 Xano…    81    71 65-80 \n4 CDISCPI… 701    701     01-701… 2014-03-18 2014-03-31 Xano…    54    74 65-80 \n5 CDISCPI… 701    701     01-701… 2014-07-01 2014-12-30 Xano…    81    77 65-80 \n6 CDISCPI… 701    701     01-701… 2013-02-12 2013-03-09 Plac…     0    85 >80   \n# ℹ 26 more variables: AGEGR1N <dbl>, RACE <chr>, RACEN <dbl>, SEX <chr>,\n#   ITTFL <chr>, EFFFL <chr>, COMP24FL <chr>, AVISIT <chr>, AVISITN <dbl>,\n#   VISIT <chr>, VISITNUM <dbl>, ADY <dbl>, ADT <date>, PARAMCD <chr>,\n#   PARAM <chr>, PARAMN <dbl>, AVAL <dbl>, ANL01FL <chr>, DTYPE <chr>,\n#   AWRANGE <chr>, AWTARGET <dbl>, AWTDIFF <dbl>, AWLO <dbl>, AWHI <dbl>,\n#   AWU <chr>, QSSEQ <dbl>"
    +    "text": "The Base R t.test() function does not have an option for lognormal data. Likewise, the procs proc_ttest() function also does not have an option for lognormal data.\nOne possibility may be the tTestLnormAltPower() function from the EnvStats package. This package has not been evaluated yet."
       },
       {
    -    "objectID": "Comp/r-sas_cmh.html#schemes",
    -    "href": "Comp/r-sas_cmh.html#schemes",
    -    "title": "R vs SAS CMH",
    -    "section": "Schemes",
    -    "text": "Schemes\nIn order to follow a systematic approach to testing, and to cover variations in the CMH test, we considered the traditional 2 x 2 x K design as well as scenarios where the generalized CMH test is employed (e.g. 5 x 3 x 3).\nWe present 5 archetype test scenarios that illustrate diverging results, possibly related to sparse data and possibly considered edge cases.\n\n\n\n\n\n\n\n\n\n\nNumber\nSchema\nVariables\nRelevant Test\nDescription\n\n\n\n\n1\n2x2x2\nX = TRTP, Y = SEX, K = AGEGR1\nGeneral Association\nTRTP and AGEGR1 were limited to two categories, overall the the groups were rather balanced\n\n\n3\n2x2x3\nX = TRTP, Y = SEX, K = RACE\nGeneral Association\nGives back NaN in R because RACE is very imbalanced\n\n\n6\n2x5x2\nX = TRTP, Y = AVAL, K = SEX\nRow Means\nCompare Row Means results for R and SAS because Y is ordinal\n\n\n9\n3x5x17\nX = TRTP, Y = AVAL, K = SITEID\nRow Means\nSITEID has many strata and provokes sparse groups, AVAL is ordinal, therefore row means statistic applies here, R threw an error\n\n\n10\n5x3x3\nX = AVAL, Y = AGEGR1, K = TRTP\nCorrelation\nX and Y are ordinal variables and therefore the correlation statistics has to be taken here"
    +    "objectID": "R/ttest_2Sample.html",
    +    "href": "R/ttest_2Sample.html",
    +    "title": "Two Sample t-test",
    +    "section": "",
    +    "text": "The Two Sample t-test is used to compare two independent samples against each other. In the Two Sample t-test, the mean of the first sample is compared against the mean of the second sample. In R, a Two Sample t-test can be performed using the Base R t.test() function from the stats package or the proc_ttest() function from the procs package.\n\n\nThe following data was used in this example.\n\n# Create sample data\nd1 <- tibble::tribble(\n  ~trt_grp, ~WtGain,\n  \"placebo\",    94, \"placebo\",  12, \"placebo\",  26, \"placebo\",  89,\n  \"placebo\",    88, \"placebo\",  96, \"placebo\",  85, \"placebo\",  130,\n  \"placebo\",    75, \"placebo\",  54, \"placebo\",  112, \"placebo\", 69,\n  \"placebo\",    104, \"placebo\", 95, \"placebo\",  53, \"placebo\",  21,\n  \"treatment\",  45, \"treatment\",    62, \"treatment\",    96, \"treatment\",    128,\n  \"treatment\",  120, \"treatment\",   99, \"treatment\",    28, \"treatment\",    50,\n  \"treatment\",  109, \"treatment\",   115, \"treatment\",   39, \"treatment\",    96,\n  \"treatment\",  87, \"treatment\",    100, \"treatment\",   76, \"treatment\",    80\n)\n\n\n\n\nIf we have normalized data, we can use the classic Student’s t-test. For a Two sample test where the variances are not equal, we should use the Welch’s t-test. Both of those options are available with the Base R t.test() function.\n\n\n\n\nThe following code was used to test the comparison in Base R. By default, the R two sample t-test function assumes the variances in the data are unequal, and uses a Welch’s t-test. Therefore, to use a classic Student’s t-test with normalized data, we must specify var.equal = TRUE. Also note that we must separate the single variable into two variables to satisfy the t.test() syntax and set paired = FALSE.\n\n  d1p <- dplyr::filter(d1, trt_grp == 'placebo')\n  d1t <- dplyr::filter(d1, trt_grp == 'treatment')\n\n  # Perform t-test\n  t.test(d1p$WtGain, d1t$WtGain, \n       var.equal = TRUE, paired = FALSE)\n\n\n    Two Sample t-test\n\ndata:  d1p$WtGain and d1t$WtGain\nt = -0.6969, df = 30, p-value = 0.4912\nalternative hypothesis: true difference in means is not equal to 0\n95 percent confidence interval:\n -31.19842  15.32342\nsample estimates:\nmean of x mean of y \n  75.1875   83.1250 \n\n\n\n\n\n\n\n\nThe following code was used to test the comparison in Base R using Welch’s t-test. Observe that in this case, the var.equal parameter is set to FALSE.\n\n  d1p <- dplyr::filter(d1, trt_grp == 'placebo')\n  d1t <- dplyr::filter(d1, trt_grp == 'treatment')\n\n  # Perform t-test\n  t.test(d1p$WtGain, d1t$WtGain, \n       var.equal = FALSE, paired = FALSE)\n\n\n    Welch Two Sample t-test\n\ndata:  d1p$WtGain and d1t$WtGain\nt = -0.6969, df = 29.694, p-value = 0.4913\nalternative hypothesis: true difference in means is not equal to 0\n95 percent confidence interval:\n -31.20849  15.33349\nsample estimates:\nmean of x mean of y \n  75.1875   83.1250 \n\n\n\n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a two sample t-test. Note that the proc_ttest() function performs both the Student’s t-test and Welch’s (Satterthwaite) t-test in the same call. The results are displayed on separate rows. This output is similar to SAS.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(d1, var = WtGain,\n             class = trt_grp)\n\n$Statistics\n     VAR      CLASS        METHOD  N    MEAN      STD    STDERR MIN MAX\n1 WtGain    placebo          <NA> 16 75.1875 33.81167  8.452918  12 130\n2 WtGain  treatment          <NA> 16 83.1250 30.53495  7.633738  28 128\n3 WtGain Diff (1-2)        Pooled NA -7.9375       NA 11.389723  NA  NA\n4 WtGain Diff (1-2) Satterthwaite NA -7.9375       NA 11.389723  NA  NA\n\n$ConfLimits\n     VAR      CLASS        METHOD    MEAN      LCLM     UCLM      STD  LCLMSTD\n1 WtGain    placebo          <NA> 75.1875  57.17053 93.20447 33.81167 24.97685\n2 WtGain  treatment          <NA> 83.1250  66.85407 99.39593 30.53495 22.55632\n3 WtGain Diff (1-2)        Pooled -7.9375 -31.19842 15.32342       NA       NA\n4 WtGain Diff (1-2) Satterthwaite -7.9375 -31.20849 15.33349       NA       NA\n   UCLMSTD\n1 52.33003\n2 47.25868\n3       NA\n4       NA\n\n$TTests\n     VAR        METHOD VARIANCES       DF          T     PROBT\n1 WtGain        Pooled     Equal 30.00000 -0.6969002 0.4912306\n2 WtGain Satterthwaite   Unequal 29.69359 -0.6969002 0.4912856\n\n$Equality\n     VAR   METHOD NDF DDF     FVAL     PROBF\n1 WtGain Folded F  15  15 1.226136 0.6980614\n\n\nViewer Output:"
       },
       {
    -    "objectID": "Comp/r-sas_cmh.html#cmh-statistics",
    -    "href": "Comp/r-sas_cmh.html#cmh-statistics",
    -    "title": "R vs SAS CMH",
    -    "section": "CMH Statistics",
    -    "text": "CMH Statistics\n\n\nLoading required package: vcd\n\n\nLoading required package: grid\n\n\nLoading required package: gnm\n\n\n\nAttaching package: 'vcdExtra'\n\n\nThe following object is masked from 'package:dplyr':\n\n    summarise\n\n\nscenarios this is a test\nAs it can be seen, there are two schemata where R does not provide any results:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nTest\n\nChi-Square\n\n\ndf\n\n\np-value\n\n\n\nSAS\nR\nSAS\nR\nSAS\nR\n\n\n\n\n1\nCorrelation\n0.01767040\n0.0008689711\n1\n1\n0.89424870\n0.9764831\n\n\nRow Means\n0.01767040\n2.4820278527\n1\n2\n0.89424870\n0.2890910\n\n\nGeneral Association\n0.01767040\n2.4820278527\n1\n2\n0.89424870\n0.2890910\n\n\n3*\nCorrelation\n0.00278713\nNaN\n1\n1\n0.95789662\nNaN\n\n\nRow Means\n2.38606985\nNaN\n2\n2\n0.30329938\nNaN\n\n\nGeneral Association\n2.38606985\nNaN\n2\n2\n0.30329938\nNaN\n\n\n6\nCorrelation\n1.14720000\n0.1115439738\n1\n1\n0.28410000\n0.7383931\n\n\nRow Means\n1.14720000\n2.6632420358\n1\n2\n0.28410000\n0.2640489\n\n\nGeneral Association\n2.56720000\n6.5238474681\n4\n8\n0.63260000\n0.5887637\n\n\n9†\nCorrelation\n0.08544312\nNA\n1\nNA\n0.77005225\nNA\n\n\nRow Means\n2.47631367\nNA\n2\nNA\n0.28991809\nNA\n\n\nGeneral Association\n7.03387844\nNA\n8\nNA\n0.53298189\nNA\n\n\n10\nCorrelation\n2.73816085\n0.8715295423\n1\n1\n0.09797747\n0.3505322\n\n\nRow Means\n4.40701092\n3.0445270087\n4\n4\n0.35371641\n0.5504018\n\n\nGeneral Association\n5.73053819\n5.7305381934\n8\n8\n0.67738613\n0.6773861\n\n\n\n* Reason for NaN in schema 3: Stratum k = AMERICAN INDIAN OR ALASKA NATIVE can not be compared because there are only values for one treatment and one gender.\n\n\n† Reason for Error 4: For large sparse table (many strata) CMHTest will occasionally throw an error in solve.default(AVA) because of singularity"
    +    "objectID": "R/ttest_2Sample.html#base-r",
    +    "href": "R/ttest_2Sample.html#base-r",
    +    "title": "Two Sample t-test",
    +    "section": "",
    +    "text": "If we have normalized data, we can use the classic Student’s t-test. For a Two sample test where the variances are not equal, we should use the Welch’s t-test. Both of those options are available with the Base R t.test() function.\n\n\n\n\nThe following code was used to test the comparison in Base R. By default, the R two sample t-test function assumes the variances in the data are unequal, and uses a Welch’s t-test. Therefore, to use a classic Student’s t-test with normalized data, we must specify var.equal = TRUE. Also note that we must separate the single variable into two variables to satisfy the t.test() syntax and set paired = FALSE.\n\n  d1p <- dplyr::filter(d1, trt_grp == 'placebo')\n  d1t <- dplyr::filter(d1, trt_grp == 'treatment')\n\n  # Perform t-test\n  t.test(d1p$WtGain, d1t$WtGain, \n       var.equal = TRUE, paired = FALSE)\n\n\n    Two Sample t-test\n\ndata:  d1p$WtGain and d1t$WtGain\nt = -0.6969, df = 30, p-value = 0.4912\nalternative hypothesis: true difference in means is not equal to 0\n95 percent confidence interval:\n -31.19842  15.32342\nsample estimates:\nmean of x mean of y \n  75.1875   83.1250 \n\n\n\n\n\n\n\n\nThe following code was used to test the comparison in Base R using Welch’s t-test. Observe that in this case, the var.equal parameter is set to FALSE.\n\n  d1p <- dplyr::filter(d1, trt_grp == 'placebo')\n  d1t <- dplyr::filter(d1, trt_grp == 'treatment')\n\n  # Perform t-test\n  t.test(d1p$WtGain, d1t$WtGain, \n       var.equal = FALSE, paired = FALSE)\n\n\n    Welch Two Sample t-test\n\ndata:  d1p$WtGain and d1t$WtGain\nt = -0.6969, df = 29.694, p-value = 0.4913\nalternative hypothesis: true difference in means is not equal to 0\n95 percent confidence interval:\n -31.20849  15.33349\nsample estimates:\nmean of x mean of y \n  75.1875   83.1250"
       },
       {
    -    "objectID": "Comp/r-sas_ttest_2Sample.html",
    -    "href": "Comp/r-sas_ttest_2Sample.html",
    -    "title": "R vs SAS Two Sample T-Test",
    +    "objectID": "R/ttest_2Sample.html#procs-package",
    +    "href": "R/ttest_2Sample.html#procs-package",
    +    "title": "Two Sample t-test",
         "section": "",
    -    "text": "The following table shows the types of Two Sample t-test analysis, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nTwo sample Student’s t-test\nYes\nYes\nYes\nIn Base R, use t.test() function with paired = FALSE and var.equal = TRUE\n\n\nTwo sample Welch’s t-test\nYes\nYes\nYes\nIn Base R, use t.test() function with paired = FALSE and var.equal = FALSE\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n30\n30\n30\nYes\n\n\n\nt value\n-0.6969002\n-0.6969002\n-0.6969002\nYes\n\n\n\np value\n0.4912306\n0.4912306\n0.4912306\nYes\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n29.69359\n29.69359\n29.69359\nYes\n\n\n\nt value\n-0.6969002\n-0.6969002\n-0.6969002\nYes\n\n\n\np value\n0.4912856\n0.4912856\n0.4912856\nYes"
    +    "text": "The following code from the procs package was used to perform a two sample t-test. Note that the proc_ttest() function performs both the Student’s t-test and Welch’s (Satterthwaite) t-test in the same call. The results are displayed on separate rows. This output is similar to SAS.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(d1, var = WtGain,\n             class = trt_grp)\n\n$Statistics\n     VAR      CLASS        METHOD  N    MEAN      STD    STDERR MIN MAX\n1 WtGain    placebo          <NA> 16 75.1875 33.81167  8.452918  12 130\n2 WtGain  treatment          <NA> 16 83.1250 30.53495  7.633738  28 128\n3 WtGain Diff (1-2)        Pooled NA -7.9375       NA 11.389723  NA  NA\n4 WtGain Diff (1-2) Satterthwaite NA -7.9375       NA 11.389723  NA  NA\n\n$ConfLimits\n     VAR      CLASS        METHOD    MEAN      LCLM     UCLM      STD  LCLMSTD\n1 WtGain    placebo          <NA> 75.1875  57.17053 93.20447 33.81167 24.97685\n2 WtGain  treatment          <NA> 83.1250  66.85407 99.39593 30.53495 22.55632\n3 WtGain Diff (1-2)        Pooled -7.9375 -31.19842 15.32342       NA       NA\n4 WtGain Diff (1-2) Satterthwaite -7.9375 -31.20849 15.33349       NA       NA\n   UCLMSTD\n1 52.33003\n2 47.25868\n3       NA\n4       NA\n\n$TTests\n     VAR        METHOD VARIANCES       DF          T     PROBT\n1 WtGain        Pooled     Equal 30.00000 -0.6969002 0.4912306\n2 WtGain Satterthwaite   Unequal 29.69359 -0.6969002 0.4912856\n\n$Equality\n     VAR   METHOD NDF DDF     FVAL     PROBF\n1 WtGain Folded F  15  15 1.226136 0.6980614\n\n\nViewer Output:"
       },
       {
    -    "objectID": "Comp/r-sas_ttest_2Sample.html#comparison-results",
    -    "href": "Comp/r-sas_ttest_2Sample.html#comparison-results",
    -    "title": "R vs SAS Two Sample T-Test",
    +    "objectID": "R/jonckheere.html",
    +    "href": "R/jonckheere.html",
    +    "title": "Jonckheere-Terpstra test",
         "section": "",
    -    "text": "Here is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n30\n30\n30\nYes\n\n\n\nt value\n-0.6969002\n-0.6969002\n-0.6969002\nYes\n\n\n\np value\n0.4912306\n0.4912306\n0.4912306\nYes\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n29.69359\n29.69359\n29.69359\nYes\n\n\n\nt value\n-0.6969002\n-0.6969002\n-0.6969002\nYes\n\n\n\np value\n0.4912856\n0.4912856\n0.4912856\nYes"
    +    "text": "As far as I know, the following packages are available:\n\nDescTools\nclinfun\nPMCMRplus\nfastJT\n\nDue to availability in the company, DescTools version 0.99.55 is used to compare the results with SAS. Of these packages DescTools is the most common."
       },
       {
    -    "objectID": "Comp/r-sas_friedman.html",
    -    "href": "Comp/r-sas_friedman.html",
    -    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    +    "objectID": "R/jonckheere.html#available-r-packages",
    +    "href": "R/jonckheere.html#available-r-packages",
    +    "title": "Jonckheere-Terpstra test",
         "section": "",
    -    "text": "library(tidyverse)\nlibrary(rstatix) \nlibrary(ggpubr)"
    +    "text": "As far as I know, the following packages are available:\n\nDescTools\nclinfun\nPMCMRplus\nfastJT\n\nDue to availability in the company, DescTools version 0.99.55 is used to compare the results with SAS. Of these packages DescTools is the most common."
       },
       {
    -    "objectID": "Comp/r-sas_friedman.html#data-used",
    -    "href": "Comp/r-sas_friedman.html#data-used",
    -    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    +    "objectID": "R/jonckheere.html#data-used",
    +    "href": "R/jonckheere.html#data-used",
    +    "title": "Jonckheere-Terpstra test",
         "section": "Data used",
    -    "text": "Data used\nFriedman’s test is used when you have one within-subjects independent variable with two or more levels and a dependent variable that is not interval and normally distributed (but at least ordinal). To build such unreplicated blocked data, we’ll create a data frame called  df_bp from random number. In  df_bp : dependent variable bp is randomly generated; Block: subjid ; Group: time_point.\n\nset.seed(123)\n\ndf_bp = data.frame(bp = runif(n = 50, 138, 200)) %>% \n  mutate(subjid = as.factor(row_number() %% 5),  \n         time_point = as.factor((row_number()-1) %/% 5 + 1))\n\nhead(df_bp)\n\n        bp subjid time_point\n1 155.8298      1          1\n2 186.8749      2          1\n3 163.3566      3          1\n4 192.7471      4          1\n5 196.3090      0          1\n6 140.8245      1          2\n\n\nLet’s see distribution of df_bp\n\nggpubr::ggboxplot(df_bp, x = \"time_point\", y = \"bp\", add = \"jitter\")"
    +    "text": "Data used\nThe data for testing is a sample dataset on a dose-response study.\n\nThe Group indicates a dose of a drug. The scores for Group represent ordering of dose arms. Then the boxplot implies a declining dose-response relationship."
       },
       {
    -    "objectID": "Comp/r-sas_friedman.html#example-code-using-rstatix",
    -    "href": "Comp/r-sas_friedman.html#example-code-using-rstatix",
    -    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    -    "section": "Example Code using {rstatix}",
    -    "text": "Example Code using {rstatix}\nIn R, friedman_test can be used to compare multiple means of rank in bp grouped by time_point, stratified by subjid.\n\nres.fried <- df_bp %>% \n  friedman_test(bp ~ time_point | subjid)\nres.fried\n\n# A tibble: 1 × 6\n  .y.       n statistic    df     p method       \n* <chr> <int>     <dbl> <dbl> <dbl> <chr>        \n1 bp        5      10.9     9 0.284 Friedman test"
    +    "objectID": "R/jonckheere.html#example-code",
    +    "href": "R/jonckheere.html#example-code",
    +    "title": "Jonckheere-Terpstra test",
    +    "section": "Example Code",
    +    "text": "Example Code\n\nlibrary(DescTools)\nlibrary(ggplot2)\nlibrary(readr)\n\n#\n# Constants\nk_n_samp <- 10000\n\nset.seed(4989)\n#\n# The input dataset is imported.\n#\ninds <- read_csv(\"../data/jonck.csv\", col_select = c(DOSE, value)) \n\nNew names:\nRows: 40 Columns: 2\n── Column specification\n──────────────────────────────────────────────────────── Delimiter: \",\" dbl\n(2): DOSE, value\nℹ Use `spec()` to retrieve the full column specification for this data. ℹ\nSpecify the column types or set `show_col_types = FALSE` to quiet this message.\n• `` -> `...1`\n\n#\n# Analysis\n#\njt_norm <- DescTools::JonckheereTerpstraTest(\n  value ~ DOSE,\n  alternative = \"decreasing\",\n  data = inds\n)\n\nWarning in JonckheereTerpstraTest.default(alternative = alternative, c(153, : Sample size > 100 or data with ties \n p-value based on normal approximation. Specify nperm for permutation p-value\n\njt_resamp <- DescTools::JonckheereTerpstraTest(\n  value ~ DOSE,\n  alternative = \"decreasing\",\n  data = inds,\n  nperm = k_n_samp\n)\n\nWarning in JonckheereTerpstraTest.default(alternative = alternative, nperm = nperm, : Sample size > 100 or data with ties \n p-value based on normal approximation. Specify nperm for permutation p-value\n\njt_norm\n\n\n    Jonckheere-Terpstra test\n\ndata:  value by DOSE\nJT = 184.5, p-value = 0.002655\nalternative hypothesis: decreasing\n\njt_resamp\n\n\n    Jonckheere-Terpstra test\n\ndata:  value by DOSE\nJT = 184.5, p-value = 0.0023\nalternative hypothesis: decreasing"
       },
       {
    -    "objectID": "Comp/r-sas_friedman.html#example-code-using-proc-freq",
    -    "href": "Comp/r-sas_friedman.html#example-code-using-proc-freq",
    -    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    -    "section": "Example Code using {PROC FREQ}",
    -    "text": "Example Code using {PROC FREQ}\nIn SAS, CMH2 option of PROC FREQ is used to perform Friedman’s test.\nproc freq data=data_bp;\n   tables patient*dos*bp / \n          cmh2 scores=rank noprint;\nrun;"
    +    "objectID": "R/jonckheere.html#reference",
    +    "href": "R/jonckheere.html#reference",
    +    "title": "Jonckheere-Terpstra test",
    +    "section": "Reference",
    +    "text": "Reference\nSignorell A (2024). DescTools: Tools for Descriptive Statistics. R package version 0.99.55, https://github.com/AndriSignorell/DescTools/, https://andrisignorell.github.io/DescTools/."
       },
       {
    -    "objectID": "Comp/r-sas_friedman.html#comparison",
    -    "href": "Comp/r-sas_friedman.html#comparison",
    -    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    -    "section": "Comparison",
    -    "text": "Comparison\nThe Row Mean Scores Differ statistic of SAS result is compared with statistic of R result, together with p-value.\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\n\n\n\n\nFriedman Test\nYes\n\n\n\n\n\nYes\nYes"
    +    "objectID": "R/summary_skew_kurt.html",
    +    "href": "R/summary_skew_kurt.html",
    +    "title": "Skewness/Kurtosis",
    +    "section": "",
    +    "text": "Skewness measures the the amount of asymmetry in a distribution, while Kurtosis describes the “tailedness” of the curve. These measures are frequently used to assess the normality of the data. There are several methods to calculate these measures. In R, there are at least four different packages that contain functions for Skewness and Kurtosis. This write-up will examine the following packages: e1071, moments, procs, and sasLM.\n\n\nThe following data was used in this example.\n\n# Create sample data\ndat <- tibble::tribble(\n  ~team, ~points, ~assists,\n  \"A\", 10, 2,\n  \"A\", 17, 5,\n  \"A\", 17, 6,\n  \"A\", 18, 3,\n  \"A\", 15, 0,\n  \"B\", 10, 2,\n  \"B\", 14, 5,\n  \"B\", 13, 4,\n  \"B\", 29, 0,\n  \"B\", 25, 2,\n  \"C\", 12, 1,\n  \"C\", 30, 1,\n  \"C\", 34, 3,\n  \"C\", 12, 4,\n  \"C\", 11, 7 \n)\n\n\n\n\nBase R and the stats package have no native functions for Skewness and Kurtosis. It is therefore necessary to use a packaged function to calculate these statistics. The packages examined use three different methods of calculating Skewness, and four different methods for calculating Kurtosis. Of the available packages, the functions in the e1071 package provide the most flexibility, and have options for three of the different methodologies.\n\n\nThe e1071 package contains miscellaneous statistical functions from the Probability Theory Group at the Vienna University of Technology. The package includes functions for both Skewness and Kurtosis, and each function has a “type” parameter to specify the method. There are three available methods for Skewness, and three methods for Kurtosis. A portion of the documentation for these functions is included below:\n\n\nThe documentation for the skewness() function describes three types of skewness calculations: Joanes and Gill (1998) discusses three methods for estimating skewness:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_1 = m_1/m_2^{3/2}\\]\n\nType 2: Used in SAS and SPSS\n\\[\nG_1 = g_1\\sqrt{n(n-1)}/(n-2)\n\\]\nType 3: Used in MINITAB and BMDP\n\\[\nb_1 = m_3/s^3 = g_1((n-1)/n)^{3/2}\n\\]\n\nAll three skewness measures are unbiased under normality. The three methods are illustrated in the following code:\n\ntype1 <- e1071::skewness(dat$points, type = 1)\nstringr::str_glue(\"Skewness - Type 1: {type1}\")\n\nSkewness - Type 1: 0.905444204379853\n\ntype2 <- e1071::skewness(dat$points, type = 2)\nstringr::str_glue(\"Skewness - Type 2: {type2}\")\n\nSkewness - Type 2: 1.00931792987094\n\ntype3 <- e1071::skewness(dat$points, type = 3)\nstringr::str_glue(\"Skewness - Type 3: {type3}\")\n\nSkewness - Type 3: 0.816426058828937\n\n\nThe default for the e1071 skewness() function is Type 3.\n\n\n\nThe documentation for the kurtosis() function describes three types of kurtosis calculations: Joanes and Gill (1998) discuss three methods for estimating kurtosis:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_2 = m_4/m_2^{2}-3\\]\n\nType 2: Used in SAS and SPSS\n\\[G_2 = ((n+1)g_2+6)*\\frac{(n-1)}{(n-2)(n-3)}\\]\nType 3: Used in MINITAB and BMDP\n\\[b_2 = m_4/s^4-3 = (g_2 + 3)(1-1/n)^2-3\\]\n\nOnly \\(G_2\\) (corresponding to type 2) is unbiased under normality. The three methods are illustrated in the following code:\n\n  # Kurtosis - Type 1\ntype1 <- e1071::kurtosis(dat$points, type = 1)\nstringr::str_glue(\"Kurtosis - Type 1: {type1}\")\n\nKurtosis - Type 1: -0.583341077124784\n\n# Kurtosis - Type 2\ntype2 <- e1071::kurtosis(dat$points, type = 2)\nstringr::str_glue(\"Kurtosis - Type 2: {type2}\")\n\nKurtosis - Type 2: -0.299156418435587\n\n# Kurtosis - Type 3\ntype3 <- e1071::kurtosis(dat$points, type = 3)\nstringr::str_glue(\"Kurtosis - Type 3: {type3}\")\n\nKurtosis - Type 3: -0.894821560517589\n\n\nThe default for the e1071 kurtosis() function is Type 3.\n\n\n\n\nThe moments package is a well-known package with a variety of statistical functions. The package contains functions for both Skewness and Kurtosis. But these functions provide no “type” option. The skewness() function in the moments package corresponds to Type 1 above. The kurtosis() function uses a Pearson’s measure of Kurtosis, which corresponds to none of the three types in the e1071 package.\n\n  library(moments)\n\n  # Skewness - Type 1\n  moments::skewness(dat$points)\n\n[1] 0.9054442\n\n  # [1] 0.9054442\n  \n  # Kurtosis - Pearson's measure\n  moments::kurtosis(dat$points)\n\n[1] 2.416659\n\n  # [1] 2.416659\n\nNote that neither of the functions from the moments package match SAS.\n\n\n\nThe procs package proc_means() function was written specifically to match SAS, and produces a Type 2 Skewness and Type 2 Kurtosis. This package also produces a data frame output, instead of a scalar value.\n\n  library(procs)\n\n  # Skewness and Kurtosis - Type 2 \n  proc_means(dat, var = points,\n             stats = v(skew, kurt))\n\n# A tibble: 1 × 5\n   TYPE  FREQ VAR     SKEW   KURT\n  <dbl> <int> <chr>  <dbl>  <dbl>\n1     0    15 points  1.01 -0.299\n\n\nViewer Output:\n\n\n\n\n\n\n\n\n\n\n\n\nThe sasLM package was also written specifically to match SAS. The Skewness() function produces a Type 2 Skewness, and the Kurtosis() function a Type 2 Kurtosis.\n\n  library(sasLM)\n\n  # Skewness - Type 2\n  Skewness(dat$points)\n\n[1] 1.009318\n\n  # [1] 1.009318\n  \n  # Kurtosis - Type 2\n  Kurtosis(dat$points)\n\n[1] -0.2991564\n\n  # [1] -0.2991564"
       },
       {
    -    "objectID": "Comp/r-sas_friedman.html#comparison-results-from-more-data",
    -    "href": "Comp/r-sas_friedman.html#comparison-results-from-more-data",
    -    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    -    "section": "Comparison Results from more data",
    -    "text": "Comparison Results from more data\nFriedman’s chi-suqare approximation varies when the number of blocks or the number of groups in the randomized block design differs. Similar comparison is done when number of block subjid ranges from 4 to 20 and number of group time_point ranges from 2 to 6. All results yield exact match (Comparison criterion is set to the tenth decimal place)."
    +    "objectID": "R/summary_skew_kurt.html#data-used",
    +    "href": "R/summary_skew_kurt.html#data-used",
    +    "title": "Skewness/Kurtosis",
    +    "section": "",
    +    "text": "The following data was used in this example.\n\n# Create sample data\ndat <- tibble::tribble(\n  ~team, ~points, ~assists,\n  \"A\", 10, 2,\n  \"A\", 17, 5,\n  \"A\", 17, 6,\n  \"A\", 18, 3,\n  \"A\", 15, 0,\n  \"B\", 10, 2,\n  \"B\", 14, 5,\n  \"B\", 13, 4,\n  \"B\", 29, 0,\n  \"B\", 25, 2,\n  \"C\", 12, 1,\n  \"C\", 30, 1,\n  \"C\", 34, 3,\n  \"C\", 12, 4,\n  \"C\", 11, 7 \n)"
       },
       {
    -    "objectID": "Comp/r-sas_chi-sq.html",
    -    "href": "Comp/r-sas_chi-sq.html",
    -    "title": "R/SAS Chi-Squared and Fisher’s Exact Comparision",
    +    "objectID": "R/summary_skew_kurt.html#package-examination",
    +    "href": "R/summary_skew_kurt.html#package-examination",
    +    "title": "Skewness/Kurtosis",
         "section": "",
    -    "text": "Chi-Squared Test\nChi-Squared test is a hypothesis test for independent contingency tables, dependent on rows and column totals. The test assumes:\n\nobservations are independent of each other\nall values are 1 or more and at least 80% of the cells are greater than 5.\ndata should be categorical\n\nThe Chi-Squared statistic is found by:\n\\[\n\\chi^2=\\frac{\\sum(O-E)^2}{E}\n\\]\nWhere O is the observed and E is the expected.\nFor an r x c table (where r is the number of rows and c the number of columns), the Chi-squared distribution’s degrees of freedom is (r-1)*(c-1). The resultant statistic with correct degrees of freedom follows this distribution when its expected values are aligned with the assumptions of the test, under the null hypothesis. The resultant p value informs the magnitude of disagreement with the null hypothesis and not the magnitude of association\nFor this example we will use data about cough symptoms and history of bronchitis.\n\nbronch <- matrix(c(26, 247, 44, 1002), ncol = 2)\nrow.names(bronch) <- c(\"cough\", \"no cough\")\ncolnames(bronch) <- c(\"bronchitis\", \"no bronchitis\")\n\nTo a chi-squared test in R you will use the following code.\n\nchisq.test(bronch)\n\n\n    Pearson's Chi-squared test with Yates' continuity correction\n\ndata:  bronch\nX-squared = 11.145, df = 1, p-value = 0.0008424\n\n\nTo run a chi-squared test in SAS you used the following code.\n\nproc freq data=proj1.bronchitis;\ntables Cough*Bronchitis / chisq;\nrun;\n\nThe result in the “Chi-Square” section of the results table in SAS will not match R, in this case it will be 12.1804 with a p-value of 0.0005. This is because by default R does a Yate’s continuity adjustment. To change this set correct to false.\n\nchisq.test(bronch, correct = FALSE)\n\n\n    Pearson's Chi-squared test\n\ndata:  bronch\nX-squared = 12.18, df = 1, p-value = 0.0004829\n\n\nAlternatively, SAS also produces the correct chi-square value by default. It is the “Continuity Adj. Chi-Square” value in the results table.\n\n\nFisher’s Exact Test\nComparison between the Fisher’s Exact Test in both R and SAS shows that the two software match on the p-value and confidence intervals. The odd ratio does not match. The reason the odds ratio does not match is because R uses an “exact” odds ratio based on the hypergeomtric distribution, while SAS uses a standard AD/BC odds ratio. Note that R always uses an “exact” Fisher test. Therefore, when trying to match SAS, you must use the “exact” statement on the PROC FREQ."
    +    "text": "Base R and the stats package have no native functions for Skewness and Kurtosis. It is therefore necessary to use a packaged function to calculate these statistics. The packages examined use three different methods of calculating Skewness, and four different methods for calculating Kurtosis. Of the available packages, the functions in the e1071 package provide the most flexibility, and have options for three of the different methodologies.\n\n\nThe e1071 package contains miscellaneous statistical functions from the Probability Theory Group at the Vienna University of Technology. The package includes functions for both Skewness and Kurtosis, and each function has a “type” parameter to specify the method. There are three available methods for Skewness, and three methods for Kurtosis. A portion of the documentation for these functions is included below:\n\n\nThe documentation for the skewness() function describes three types of skewness calculations: Joanes and Gill (1998) discusses three methods for estimating skewness:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_1 = m_1/m_2^{3/2}\\]\n\nType 2: Used in SAS and SPSS\n\\[\nG_1 = g_1\\sqrt{n(n-1)}/(n-2)\n\\]\nType 3: Used in MINITAB and BMDP\n\\[\nb_1 = m_3/s^3 = g_1((n-1)/n)^{3/2}\n\\]\n\nAll three skewness measures are unbiased under normality. The three methods are illustrated in the following code:\n\ntype1 <- e1071::skewness(dat$points, type = 1)\nstringr::str_glue(\"Skewness - Type 1: {type1}\")\n\nSkewness - Type 1: 0.905444204379853\n\ntype2 <- e1071::skewness(dat$points, type = 2)\nstringr::str_glue(\"Skewness - Type 2: {type2}\")\n\nSkewness - Type 2: 1.00931792987094\n\ntype3 <- e1071::skewness(dat$points, type = 3)\nstringr::str_glue(\"Skewness - Type 3: {type3}\")\n\nSkewness - Type 3: 0.816426058828937\n\n\nThe default for the e1071 skewness() function is Type 3.\n\n\n\nThe documentation for the kurtosis() function describes three types of kurtosis calculations: Joanes and Gill (1998) discuss three methods for estimating kurtosis:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_2 = m_4/m_2^{2}-3\\]\n\nType 2: Used in SAS and SPSS\n\\[G_2 = ((n+1)g_2+6)*\\frac{(n-1)}{(n-2)(n-3)}\\]\nType 3: Used in MINITAB and BMDP\n\\[b_2 = m_4/s^4-3 = (g_2 + 3)(1-1/n)^2-3\\]\n\nOnly \\(G_2\\) (corresponding to type 2) is unbiased under normality. The three methods are illustrated in the following code:\n\n  # Kurtosis - Type 1\ntype1 <- e1071::kurtosis(dat$points, type = 1)\nstringr::str_glue(\"Kurtosis - Type 1: {type1}\")\n\nKurtosis - Type 1: -0.583341077124784\n\n# Kurtosis - Type 2\ntype2 <- e1071::kurtosis(dat$points, type = 2)\nstringr::str_glue(\"Kurtosis - Type 2: {type2}\")\n\nKurtosis - Type 2: -0.299156418435587\n\n# Kurtosis - Type 3\ntype3 <- e1071::kurtosis(dat$points, type = 3)\nstringr::str_glue(\"Kurtosis - Type 3: {type3}\")\n\nKurtosis - Type 3: -0.894821560517589\n\n\nThe default for the e1071 kurtosis() function is Type 3.\n\n\n\n\nThe moments package is a well-known package with a variety of statistical functions. The package contains functions for both Skewness and Kurtosis. But these functions provide no “type” option. The skewness() function in the moments package corresponds to Type 1 above. The kurtosis() function uses a Pearson’s measure of Kurtosis, which corresponds to none of the three types in the e1071 package.\n\n  library(moments)\n\n  # Skewness - Type 1\n  moments::skewness(dat$points)\n\n[1] 0.9054442\n\n  # [1] 0.9054442\n  \n  # Kurtosis - Pearson's measure\n  moments::kurtosis(dat$points)\n\n[1] 2.416659\n\n  # [1] 2.416659\n\nNote that neither of the functions from the moments package match SAS.\n\n\n\nThe procs package proc_means() function was written specifically to match SAS, and produces a Type 2 Skewness and Type 2 Kurtosis. This package also produces a data frame output, instead of a scalar value.\n\n  library(procs)\n\n  # Skewness and Kurtosis - Type 2 \n  proc_means(dat, var = points,\n             stats = v(skew, kurt))\n\n# A tibble: 1 × 5\n   TYPE  FREQ VAR     SKEW   KURT\n  <dbl> <int> <chr>  <dbl>  <dbl>\n1     0    15 points  1.01 -0.299\n\n\nViewer Output:\n\n\n\n\n\n\n\n\n\n\n\n\nThe sasLM package was also written specifically to match SAS. The Skewness() function produces a Type 2 Skewness, and the Kurtosis() function a Type 2 Kurtosis.\n\n  library(sasLM)\n\n  # Skewness - Type 2\n  Skewness(dat$points)\n\n[1] 1.009318\n\n  # [1] 1.009318\n  \n  # Kurtosis - Type 2\n  Kurtosis(dat$points)\n\n[1] -0.2991564\n\n  # [1] -0.2991564"
       },
       {
    -    "objectID": "Comp/r-sas_linear-regression.html",
    -    "href": "Comp/r-sas_linear-regression.html",
    -    "title": "R vs SAS Linear Regression",
    +    "objectID": "R/PCA_analysis.html",
    +    "href": "R/PCA_analysis.html",
    +    "title": "Principle Component Analysis",
         "section": "",
    -    "text": "Summary of R vs SAS Comparison for Linear Regression\nTo date the lm function in R and proc reg in sas have been found to 100% agree.\nSee R and SAS for more detail."
    +    "text": "Principal Component Analysis (PCA) is a dimensionality reduction technique used to reduce the number of features in a dataset while retaining most of the information.\n\n\n\nWe will load the iris data.\nStandardize the data and then compute PCA.\n\n\nlibrary(factoextra)\n\nLoading required package: ggplot2\n\n\nWelcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa\n\nlibrary(plotly)\n\n\nAttaching package: 'plotly'\n\n\nThe following object is masked from 'package:ggplot2':\n\n    last_plot\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\nThe following object is masked from 'package:graphics':\n\n    layout\n\ndata <- iris\npca_result <- prcomp(data[, 1:4], scale = T)\npca_result\n\nStandard deviations (1, .., p=4):\n[1] 1.7083611 0.9560494 0.3830886 0.1439265\n\nRotation (n x k) = (4 x 4):\n                    PC1         PC2        PC3        PC4\nSepal.Length  0.5210659 -0.37741762  0.7195664  0.2612863\nSepal.Width  -0.2693474 -0.92329566 -0.2443818 -0.1235096\nPetal.Length  0.5804131 -0.02449161 -0.1421264 -0.8014492\nPetal.Width   0.5648565 -0.06694199 -0.6342727  0.5235971\n\n\nWe print the summary of the PCA result, which includes the standard deviation of each principal component and the proportion of variance explained.\n\nsummary(pca_result)\n\nImportance of components:\n                          PC1    PC2     PC3     PC4\nStandard deviation     1.7084 0.9560 0.38309 0.14393\nProportion of Variance 0.7296 0.2285 0.03669 0.00518\nCumulative Proportion  0.7296 0.9581 0.99482 1.00000"
       },
       {
    -    "objectID": "Comp/r-sas_kruskalwallis.html",
    -    "href": "Comp/r-sas_kruskalwallis.html",
    -    "title": "Kruskal Wallis R v SAS",
    +    "objectID": "R/PCA_analysis.html#introduction",
    +    "href": "R/PCA_analysis.html#introduction",
    +    "title": "Principle Component Analysis",
         "section": "",
    -    "text": "From the individual R and SAS pages, performing the Kruskal-Wallis test in R using:\n\nkruskal.test(Sepal_Width~Species, data=iris_sub)\n\nand in SAS using:\n\nproc npar1way data=iris_sub wilcoxon;\nclass Species;\nvar Sepal_Width;\nexact;\nrun;\n\nproduced the same results for the test statistic and asymptotic p-value.\nThere is a difference between languages in that SAS provides the EXACT option to easily output the exact p-value, where R does not seem to have an equivalent. A Monte Carlo permutation test may offer an alternative to the exact test on R. The coin package could help in implementing this."
    +    "text": "Principal Component Analysis (PCA) is a dimensionality reduction technique used to reduce the number of features in a dataset while retaining most of the information.\n\n\n\nWe will load the iris data.\nStandardize the data and then compute PCA.\n\n\nlibrary(factoextra)\n\nLoading required package: ggplot2\n\n\nWelcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa\n\nlibrary(plotly)\n\n\nAttaching package: 'plotly'\n\n\nThe following object is masked from 'package:ggplot2':\n\n    last_plot\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\nThe following object is masked from 'package:graphics':\n\n    layout\n\ndata <- iris\npca_result <- prcomp(data[, 1:4], scale = T)\npca_result\n\nStandard deviations (1, .., p=4):\n[1] 1.7083611 0.9560494 0.3830886 0.1439265\n\nRotation (n x k) = (4 x 4):\n                    PC1         PC2        PC3        PC4\nSepal.Length  0.5210659 -0.37741762  0.7195664  0.2612863\nSepal.Width  -0.2693474 -0.92329566 -0.2443818 -0.1235096\nPetal.Length  0.5804131 -0.02449161 -0.1421264 -0.8014492\nPetal.Width   0.5648565 -0.06694199 -0.6342727  0.5235971\n\n\nWe print the summary of the PCA result, which includes the standard deviation of each principal component and the proportion of variance explained.\n\nsummary(pca_result)\n\nImportance of components:\n                          PC1    PC2     PC3     PC4\nStandard deviation     1.7084 0.9560 0.38309 0.14393\nProportion of Variance 0.7296 0.2285 0.03669 0.00518\nCumulative Proportion  0.7296 0.9581 0.99482 1.00000"
       },
       {
    -    "objectID": "Comp/r-sas_kruskalwallis.html#kruskal-wallis-r-and-sas",
    -    "href": "Comp/r-sas_kruskalwallis.html#kruskal-wallis-r-and-sas",
    -    "title": "Kruskal Wallis R v SAS",
    -    "section": "",
    -    "text": "From the individual R and SAS pages, performing the Kruskal-Wallis test in R using:\n\nkruskal.test(Sepal_Width~Species, data=iris_sub)\n\nand in SAS using:\n\nproc npar1way data=iris_sub wilcoxon;\nclass Species;\nvar Sepal_Width;\nexact;\nrun;\n\nproduced the same results for the test statistic and asymptotic p-value.\nThere is a difference between languages in that SAS provides the EXACT option to easily output the exact p-value, where R does not seem to have an equivalent. A Monte Carlo permutation test may offer an alternative to the exact test on R. The coin package could help in implementing this."
    +    "objectID": "R/PCA_analysis.html#visualize-pca-results",
    +    "href": "R/PCA_analysis.html#visualize-pca-results",
    +    "title": "Principle Component Analysis",
    +    "section": "Visualize PCA Results",
    +    "text": "Visualize PCA Results\n\nScree Plot\nA scree plot shows the proportion of variance explained by each principal component.\n\nfviz_eig(pca_result)\n\n\n\n\n\n\n\n\n\n\nBiplot\nA biplot shows the scores of the samples and the loadings of the variables on the first two principal components.\n\nplt <- fviz_pca_biplot(pca_result, geom.ind = \"point\", pointshape = 21, \n                pointsize = 2, fill.ind = iris$Species, \n                col.var = \"black\", repel = TRUE)\nplt"
       },
       {
    -    "objectID": "Comp/r-sas_ttest_Paired.html",
    -    "href": "Comp/r-sas_ttest_Paired.html",
    -    "title": "R vs SAS Paired T-Test",
    -    "section": "",
    -    "text": "The following table shows the types of Paired t-test analysis, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nPaired t-test, normal data\nYes\nYes\nYes\nIn Base R, use paired = TRUE on t.test() function\n\n\nPaired t-test, lognormal data\nMaybe\nYes\nNA\nMay be supported by envstats package\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n11\n11\n11\nYes\n\n\n\nt value\n-1.089648\n-1.089648\n-1.089648\nYes\n\n\n\np value\n0.2992\n0.2992\n0.2992\nYes\n\n\n\n\n\n\n\nSince there is currently no known support for lognormal t-test in R, this comparison is not applicable."
    +    "objectID": "R/PCA_analysis.html#interpretation",
    +    "href": "R/PCA_analysis.html#interpretation",
    +    "title": "Principle Component Analysis",
    +    "section": "Interpretation",
    +    "text": "Interpretation\n\nThe Scree Plot suggests to decide the number of principle components to retain by looking an elbow point where the explained variance starts to level off.\nThe biplot visualizes both the samples (points) and the variables (arrows). Points that are close to each other represent samples with similar characteristics, while the direction and length of the arrows indicate the contribution of each variable to the principal components."
       },
       {
    -    "objectID": "Comp/r-sas_ttest_Paired.html#comparison-results",
    -    "href": "Comp/r-sas_ttest_Paired.html#comparison-results",
    -    "title": "R vs SAS Paired T-Test",
    -    "section": "",
    -    "text": "Here is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n11\n11\n11\nYes\n\n\n\nt value\n-1.089648\n-1.089648\n-1.089648\nYes\n\n\n\np value\n0.2992\n0.2992\n0.2992\nYes\n\n\n\n\n\n\n\nSince there is currently no known support for lognormal t-test in R, this comparison is not applicable."
    +    "objectID": "R/PCA_analysis.html#visualization-of-pca-in-3d-scatter-plot",
    +    "href": "R/PCA_analysis.html#visualization-of-pca-in-3d-scatter-plot",
    +    "title": "Principle Component Analysis",
    +    "section": "Visualization of PCA in 3d Scatter Plot",
    +    "text": "Visualization of PCA in 3d Scatter Plot\nA 3d scatter plot allows us to see the relationships between three principle components simultaneously and also gives us a better understanding of how much variance is explained by these components.\nIt also allows for interactive exploration where we can rotate the plot and view it from a different angles.\nWe will plot this using plotly package.\n\npca_result2 <- prcomp(data[, 1:4], scale = T, rank. = 3)\npca_result2\n\nStandard deviations (1, .., p=4):\n[1] 1.7083611 0.9560494 0.3830886 0.1439265\n\nRotation (n x k) = (4 x 3):\n                    PC1         PC2        PC3\nSepal.Length  0.5210659 -0.37741762  0.7195664\nSepal.Width  -0.2693474 -0.92329566 -0.2443818\nPetal.Length  0.5804131 -0.02449161 -0.1421264\nPetal.Width   0.5648565 -0.06694199 -0.6342727\n\n\nNext, we will create a dataframe of the 3 principle components and negate PC2 and PC3 for visual preference to make the plot look more organised and symmetric in 3d space.\n\ncomponents <- as.data.frame(pca_result2$x)\ncomponents$PC2 <- -components$PC2\ncomponents$PC3 <- -components$PC3\n\n\nfig <- plot_ly(components, \n               x = ~PC1, \n               y = ~PC2, \n               z = ~PC3, \n               color = ~data$Species, \n               colors = c('darkgreen','darkblue','darkred')) %>%\n  add_markers(size = 12)\n\nfig <- fig %>%\n  layout(title = \"3d Visualization of PCA\",\n         scene = list(bgcolor = \"lightgray\"))\nfig"
       },
       {
    -    "objectID": "Comp/r-sas_ancova.html",
    -    "href": "Comp/r-sas_ancova.html",
    -    "title": "R vs SAS ANCOVA",
    +    "objectID": "R/association.html",
    +    "href": "R/association.html",
    +    "title": "Association Analysis for Count Data Using R",
         "section": "",
    -    "text": "The following table shows the types of One Sample t-test analysis, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nANCOVA using general linear model and lsmeans\nYes\nYes\nYes\nGLM() function from sasLM with EMEANS=TRUE is the easiest to use and matches SAS\n\n\n\n\n\nHere is a table of comparison values between lm() from the stats package, GLM() from the sasLM package, and SAS PROC GLM:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nlm()\nGLM()\nPROC GLM\nMatch\nNotes\n\n\n\n\nType I, Sum sq, drug\n293.6000\n293.6000\n293.6000\nYes\n\n\n\nType I, Sum sq, pre\n577.897\n577.8974\n577.8974\nYes\n\n\n\nType III, Sum sq, drug\n68.554\n68.55371\n68.55371\nYes\n\n\n\nType III, Sum sq, pre\n577.897\n577.89740\n577.89740\nYes\n\n\n\nLSmean drugA\n6.71\n6.714963\n6.714963\nYes\n\n\n\nLSmean drugD\n6.82\n6.823935\n6.823935\nYes\n\n\n\nLSmean drugF\n10.16\n10.161102\n10.161102\nYes"
    +    "text": "The most commonly used association analysis methods for count data/contingency tables compare observed frequencies with those expected under the assumption of independence:\n\\[\nX^2 = \\sum_{i=1}^k \\frac{(x_i-e_i)^2}{e_i},\n\\] where \\(k\\) is the number of contingency table cells.\nOther measures for the correlation of two continuous variables are:"
       },
       {
    -    "objectID": "Comp/r-sas_ancova.html#comp",
    -    "href": "Comp/r-sas_ancova.html#comp",
    -    "title": "R vs SAS ANCOVA",
    +    "objectID": "R/association.html#chi-squared-test",
    +    "href": "R/association.html#chi-squared-test",
    +    "title": "Association Analysis for Count Data Using R",
    +    "section": "Chi-Squared test",
    +    "text": "Chi-Squared test\n\nchisq.test(tab)\n\n\n    Pearson's Chi-squared test with Yates' continuity correction\n\ndata:  tab\nX-squared = 1.8261, df = 1, p-value = 0.1766"
    +  },
    +  {
    +    "objectID": "R/association.html#fisher-exact-test",
    +    "href": "R/association.html#fisher-exact-test",
    +    "title": "Association Analysis for Count Data Using R",
    +    "section": "Fisher Exact Test",
    +    "text": "Fisher Exact Test\nFor \\(2 \\times 2\\) contingency tables, p-values are obtained directly using the hypergeometric distribution.\n\nfisher.test(tab)\n\n\n    Fisher's Exact Test for Count Data\n\ndata:  tab\np-value = 0.135\nalternative hypothesis: true odds ratio is not equal to 1\n95 percent confidence interval:\n 0.8158882 3.2251299\nsample estimates:\nodds ratio \n  1.630576"
    +  },
    +  {
    +    "objectID": "R/association.html#chi-squared-test-1",
    +    "href": "R/association.html#chi-squared-test-1",
    +    "title": "Association Analysis for Count Data Using R",
    +    "section": "Chi-Squared Test",
    +    "text": "Chi-Squared Test\n\nchisq.test(tab2)\n\nWarning in chisq.test(tab2): Chi-squared approximation may be incorrect\n\n\n\n    Pearson's Chi-squared test\n\ndata:  tab2\nX-squared = 260.76, df = 15, p-value < 2.2e-16\n\n\nThe warning means that the smallest expected frequencies is lower than 5. It is recommended to use the Fisher’s exact test in this case."
    +  },
    +  {
    +    "objectID": "R/association.html#fisher-exact-test-1",
    +    "href": "R/association.html#fisher-exact-test-1",
    +    "title": "Association Analysis for Count Data Using R",
    +    "section": "Fisher Exact Test",
    +    "text": "Fisher Exact Test\nFor contingency tables larger than \\(2 \\times 2\\), p-values are based on simulations, which might require a lot of time (see ?fisher.test for details).\n\nfisher.test(tab2, simulate.p.value=TRUE)\n\n\n    Fisher's Exact Test for Count Data with simulated p-value (based on\n    2000 replicates)\n\ndata:  tab2\np-value = 0.0004998\nalternative hypothesis: two.sided"
    +  },
    +  {
    +    "objectID": "R/cmh.html",
    +    "href": "R/cmh.html",
    +    "title": "CMH Test",
         "section": "",
    -    "text": "Here is a table of comparison values between lm() from the stats package, GLM() from the sasLM package, and SAS PROC GLM:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nlm()\nGLM()\nPROC GLM\nMatch\nNotes\n\n\n\n\nType I, Sum sq, drug\n293.6000\n293.6000\n293.6000\nYes\n\n\n\nType I, Sum sq, pre\n577.897\n577.8974\n577.8974\nYes\n\n\n\nType III, Sum sq, drug\n68.554\n68.55371\n68.55371\nYes\n\n\n\nType III, Sum sq, pre\n577.897\n577.89740\n577.89740\nYes\n\n\n\nLSmean drugA\n6.71\n6.714963\n6.714963\nYes\n\n\n\nLSmean drugD\n6.82\n6.823935\n6.823935\nYes\n\n\n\nLSmean drugF\n10.16\n10.161102\n10.161102\nYes"
    +    "text": "The CMH procedure tests for conditional independence in partial contingency tables for a 2 x 2 x K design. However, it can be generalized to tables of X x Y x K dimensions.\n\n\nWe did not find any R package that delivers all the same measures as SAS at once. Therefore, we tried out multiple packages:\n\n\n\n\n\n\n\n\nPackage\nGeneral Association\nRow Means Differ\nNonzero Correlation\nM-H Odds Ratio\nHomogeneity Test\nNote\n\n\n\n\nstats::mantelhaen.test()\n✅\n❌\n❌\n✅\n❌\nWorks well for 2x2xK\n\n\nvcdExtra::CMHtest()\n✅\n✅\n✅\n❌\n❌\nProblems with sparsity, potential bug\n\n\nepiDisplay::mhor()\n❌\n❌\n❌\n✅\n✅\nOR are limited to 2x2xK design\n\n\n\n\n\n\n\n\n\n\nWe will use the CDISC Pilot data set, which is publicly available on the PHUSE Test Data Factory repository. We applied very basic filtering conditions upfront (see below) and this data set served as the basis of the examples to follow.\n\n\n# A tibble: 231 × 36\n   STUDYID SITEID SITEGR1 USUBJID TRTSDT     TRTEDT     TRTP  TRTPN   AGE AGEGR1\n   <chr>   <chr>  <chr>   <chr>   <date>     <date>     <chr> <dbl> <dbl> <chr> \n 1 CDISCP… 701    701     01-701… 2014-01-02 2014-07-02 Plac…     0    63 <65   \n 2 CDISCP… 701    701     01-701… 2012-08-05 2012-09-01 Plac…     0    64 <65   \n 3 CDISCP… 701    701     01-701… 2013-07-19 2014-01-14 Xano…    81    71 65-80 \n 4 CDISCP… 701    701     01-701… 2014-03-18 2014-03-31 Xano…    54    74 65-80 \n 5 CDISCP… 701    701     01-701… 2014-07-01 2014-12-30 Xano…    81    77 65-80 \n 6 CDISCP… 701    701     01-701… 2013-02-12 2013-03-09 Plac…     0    85 >80   \n 7 CDISCP… 701    701     01-701… 2014-01-01 2014-07-09 Xano…    54    68 65-80 \n 8 CDISCP… 701    701     01-701… 2012-09-07 2012-09-16 Xano…    54    81 >80   \n 9 CDISCP… 701    701     01-701… 2012-11-30 2013-01-23 Xano…    54    84 >80   \n10 CDISCP… 701    701     01-701… 2014-03-12 2014-09-09 Plac…     0    52 <65   \n# ℹ 221 more rows\n# ℹ 26 more variables: AGEGR1N <dbl>, RACE <chr>, RACEN <dbl>, SEX <chr>,\n#   ITTFL <chr>, EFFFL <chr>, COMP24FL <chr>, AVISIT <chr>, AVISITN <dbl>,\n#   VISIT <chr>, VISITNUM <dbl>, ADY <dbl>, ADT <date>, PARAMCD <chr>,\n#   PARAM <chr>, PARAMN <dbl>, AVAL <dbl>, ANL01FL <chr>, DTYPE <chr>,\n#   AWRANGE <chr>, AWTARGET <dbl>, AWTDIFF <dbl>, AWLO <dbl>, AWHI <dbl>,\n#   AWU <chr>, QSSEQ <dbl>\n\n\n\n\n\n\n\nThis is included in a base installation of R, as part of the stats package. Requires inputting data as a table or as vectors.\n\nmantelhaen.test(x = data$TRTP, y = data$SEX, z = data$AGEGR1)\n\n\n    Cochran-Mantel-Haenszel test\n\ndata:  data$TRTP and data$SEX and data$AGEGR1\nCochran-Mantel-Haenszel M^2 = 2.482, df = 2, p-value = 0.2891\n\n\n\n\n\nThe vcdExtra package provides results for the generalized CMH test, for each of the three model it outputs the Chi-square value and the respective p-values. Flexible data input methods available: table or formula (aggregated level data in a data frame).\n\nlibrary(vcdExtra)\n\nLoading required package: vcd\n\n\nLoading required package: grid\n\n\nLoading required package: gnm\n\n\n\nAttaching package: 'vcdExtra'\n\n\nThe following object is masked from 'package:dplyr':\n\n    summarise\n\n# Formula: Freq ~ X + Y | K\nCMHtest(Freq ~ TRTP + SEX | AGEGR1 , data=data, overall=TRUE) \n\n$`AGEGR1:<65`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:<65 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.33168  1 0.56467\nrmeans  Row mean scores differ 1.52821  2 0.46575\ncmeans  Col mean scores differ 0.33168  1 0.56467\ngeneral    General association 1.52821  2 0.46575\n\n\n$`AGEGR1:>80`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:>80 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.39433  1 0.53003\nrmeans  Row mean scores differ 3.80104  2 0.14949\ncmeans  Col mean scores differ 0.39433  1 0.53003\ngeneral    General association 3.80104  2 0.14949\n\n\n$`AGEGR1:65-80`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:65-80 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.52744  1 0.46768\nrmeans  Row mean scores differ 0.62921  2 0.73008\ncmeans  Col mean scores differ 0.52744  1 0.46768\ngeneral    General association 0.62921  2 0.73008\n\n\n$ALL\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    Overall tests, controlling for all strata \n\n                 AltHypothesis      Chisq Df    Prob\ncor        Nonzero correlation 0.00086897  1 0.97648\nrmeans  Row mean scores differ      2.482  2 0.28909\ncmeans  Col mean scores differ 0.00086897  1 0.97648\ngeneral    General association      2.482  2 0.28909\n\n\n\n\n\nTo get the M-H common odds ratio and the homogeneity test, the epiDisplay package can be used.\n\nlibrary(epiDisplay) \nmhor(x,y,k, graph = FALSE)\n\n\n\nTo tackle the issue with sparse data it is recommended that a use of solve() is replaced with MASS::ginv. This was implemented in the forked version of vcdExtra which can be installed from here:\n\ndevtools::install_github(\"mstackhouse/vcdExtra\")\n\nHowever, also the forked version for the vcdExtra package works only until a certain level of sparsity. In case of our data, it still works if the data are stratified by the pooled Site ID (SITEGR1 - 11 unique values) whereas using the unpooled Site ID (SITEID - 17 unique values) also throws an error. Note: this version is not up to date and sometimes calculates degrees of freedom incorrectly."
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html",
    -    "href": "Comp/r-sas_negbin.html",
    -    "title": "R vs SAS: Negative Binomial Regression",
    +    "objectID": "R/cmh.html#available-r-packages",
    +    "href": "R/cmh.html#available-r-packages",
    +    "title": "CMH Test",
         "section": "",
    -    "text": "Comparison of implementations and results between SAS vs R for negative binomial regression for count data.\n\n\n\n\n\n\n\n\n\n\n\nMethodologies\n\n\n\n\n\n\nNegative binomial regression\n\n\n\n\n\n\n\n\n\n\n\n\nTechnical implementations\n\n\n\n\n\n\nSAS: PROC GENMOD with option: DIST = NB or DIST = NEGBIN\nR: MASS::glm.nb\n\n\n\n\n\n\n\n\n\n\nBelow are summary of findings from a numerical comparison using dummy data, where possible we specify the same algorithm in R and SAS (see section Numerical Comparisons for details).\n\n\n\n\n\n\nNegative binomial regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm.nb in R vs PROC GENMOD procedure in SAS, for parameter and lsmeans estimates, confidence intervals and p-values after manually adjusting the estimated variance-covariance matrix in R. For the dispersion parameter the MLEs also match, however discrepancies in the confidence intervals are observed.\n\n\n\nIn the following sections the implementations will be compared in tabular fashion followed by a numerical comparison using dummy data."
    +    "text": "We did not find any R package that delivers all the same measures as SAS at once. Therefore, we tried out multiple packages:\n\n\n\n\n\n\n\n\nPackage\nGeneral Association\nRow Means Differ\nNonzero Correlation\nM-H Odds Ratio\nHomogeneity Test\nNote\n\n\n\n\nstats::mantelhaen.test()\n✅\n❌\n❌\n✅\n❌\nWorks well for 2x2xK\n\n\nvcdExtra::CMHtest()\n✅\n✅\n✅\n❌\n❌\nProblems with sparsity, potential bug\n\n\nepiDisplay::mhor()\n❌\n❌\n❌\n✅\n✅\nOR are limited to 2x2xK design"
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#goal",
    -    "href": "Comp/r-sas_negbin.html#goal",
    -    "title": "R vs SAS: Negative Binomial Regression",
    +    "objectID": "R/cmh.html#data-used",
    +    "href": "R/cmh.html#data-used",
    +    "title": "CMH Test",
         "section": "",
    -    "text": "Comparison of implementations and results between SAS vs R for negative binomial regression for count data."
    +    "text": "We will use the CDISC Pilot data set, which is publicly available on the PHUSE Test Data Factory repository. We applied very basic filtering conditions upfront (see below) and this data set served as the basis of the examples to follow.\n\n\n# A tibble: 231 × 36\n   STUDYID SITEID SITEGR1 USUBJID TRTSDT     TRTEDT     TRTP  TRTPN   AGE AGEGR1\n   <chr>   <chr>  <chr>   <chr>   <date>     <date>     <chr> <dbl> <dbl> <chr> \n 1 CDISCP… 701    701     01-701… 2014-01-02 2014-07-02 Plac…     0    63 <65   \n 2 CDISCP… 701    701     01-701… 2012-08-05 2012-09-01 Plac…     0    64 <65   \n 3 CDISCP… 701    701     01-701… 2013-07-19 2014-01-14 Xano…    81    71 65-80 \n 4 CDISCP… 701    701     01-701… 2014-03-18 2014-03-31 Xano…    54    74 65-80 \n 5 CDISCP… 701    701     01-701… 2014-07-01 2014-12-30 Xano…    81    77 65-80 \n 6 CDISCP… 701    701     01-701… 2013-02-12 2013-03-09 Plac…     0    85 >80   \n 7 CDISCP… 701    701     01-701… 2014-01-01 2014-07-09 Xano…    54    68 65-80 \n 8 CDISCP… 701    701     01-701… 2012-09-07 2012-09-16 Xano…    54    81 >80   \n 9 CDISCP… 701    701     01-701… 2012-11-30 2013-01-23 Xano…    54    84 >80   \n10 CDISCP… 701    701     01-701… 2014-03-12 2014-09-09 Plac…     0    52 <65   \n# ℹ 221 more rows\n# ℹ 26 more variables: AGEGR1N <dbl>, RACE <chr>, RACEN <dbl>, SEX <chr>,\n#   ITTFL <chr>, EFFFL <chr>, COMP24FL <chr>, AVISIT <chr>, AVISITN <dbl>,\n#   VISIT <chr>, VISITNUM <dbl>, ADY <dbl>, ADT <date>, PARAMCD <chr>,\n#   PARAM <chr>, PARAMN <dbl>, AVAL <dbl>, ANL01FL <chr>, DTYPE <chr>,\n#   AWRANGE <chr>, AWTARGET <dbl>, AWTDIFF <dbl>, AWLO <dbl>, AWHI <dbl>,\n#   AWU <chr>, QSSEQ <dbl>"
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#scope",
    -    "href": "Comp/r-sas_negbin.html#scope",
    -    "title": "R vs SAS: Negative Binomial Regression",
    +    "objectID": "R/cmh.html#example-code",
    +    "href": "R/cmh.html#example-code",
    +    "title": "CMH Test",
         "section": "",
    -    "text": "Methodologies\n\n\n\n\n\n\nNegative binomial regression\n\n\n\n\n\n\n\n\n\n\n\n\nTechnical implementations\n\n\n\n\n\n\nSAS: PROC GENMOD with option: DIST = NB or DIST = NEGBIN\nR: MASS::glm.nb"
    +    "text": "This is included in a base installation of R, as part of the stats package. Requires inputting data as a table or as vectors.\n\nmantelhaen.test(x = data$TRTP, y = data$SEX, z = data$AGEGR1)\n\n\n    Cochran-Mantel-Haenszel test\n\ndata:  data$TRTP and data$SEX and data$AGEGR1\nCochran-Mantel-Haenszel M^2 = 2.482, df = 2, p-value = 0.2891\n\n\n\n\n\nThe vcdExtra package provides results for the generalized CMH test, for each of the three model it outputs the Chi-square value and the respective p-values. Flexible data input methods available: table or formula (aggregated level data in a data frame).\n\nlibrary(vcdExtra)\n\nLoading required package: vcd\n\n\nLoading required package: grid\n\n\nLoading required package: gnm\n\n\n\nAttaching package: 'vcdExtra'\n\n\nThe following object is masked from 'package:dplyr':\n\n    summarise\n\n# Formula: Freq ~ X + Y | K\nCMHtest(Freq ~ TRTP + SEX | AGEGR1 , data=data, overall=TRUE) \n\n$`AGEGR1:<65`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:<65 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.33168  1 0.56467\nrmeans  Row mean scores differ 1.52821  2 0.46575\ncmeans  Col mean scores differ 0.33168  1 0.56467\ngeneral    General association 1.52821  2 0.46575\n\n\n$`AGEGR1:>80`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:>80 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.39433  1 0.53003\nrmeans  Row mean scores differ 3.80104  2 0.14949\ncmeans  Col mean scores differ 0.39433  1 0.53003\ngeneral    General association 3.80104  2 0.14949\n\n\n$`AGEGR1:65-80`\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    in stratum AGEGR1:65-80 \n\n                 AltHypothesis   Chisq Df    Prob\ncor        Nonzero correlation 0.52744  1 0.46768\nrmeans  Row mean scores differ 0.62921  2 0.73008\ncmeans  Col mean scores differ 0.52744  1 0.46768\ngeneral    General association 0.62921  2 0.73008\n\n\n$ALL\nCochran-Mantel-Haenszel Statistics for TRTP by SEX \n    Overall tests, controlling for all strata \n\n                 AltHypothesis      Chisq Df    Prob\ncor        Nonzero correlation 0.00086897  1 0.97648\nrmeans  Row mean scores differ      2.482  2 0.28909\ncmeans  Col mean scores differ 0.00086897  1 0.97648\ngeneral    General association      2.482  2 0.28909\n\n\n\n\n\nTo get the M-H common odds ratio and the homogeneity test, the epiDisplay package can be used.\n\nlibrary(epiDisplay) \nmhor(x,y,k, graph = FALSE)\n\n\n\nTo tackle the issue with sparse data it is recommended that a use of solve() is replaced with MASS::ginv. This was implemented in the forked version of vcdExtra which can be installed from here:\n\ndevtools::install_github(\"mstackhouse/vcdExtra\")\n\nHowever, also the forked version for the vcdExtra package works only until a certain level of sparsity. In case of our data, it still works if the data are stratified by the pooled Site ID (SITEGR1 - 11 unique values) whereas using the unpooled Site ID (SITEID - 17 unique values) also throws an error. Note: this version is not up to date and sometimes calculates degrees of freedom incorrectly."
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#findings",
    -    "href": "Comp/r-sas_negbin.html#findings",
    -    "title": "R vs SAS: Negative Binomial Regression",
    +    "objectID": "R/ci_for_prop.html",
    +    "href": "R/ci_for_prop.html",
    +    "title": "Confidence Intervals for Proportions in R",
         "section": "",
    -    "text": "Below are summary of findings from a numerical comparison using dummy data, where possible we specify the same algorithm in R and SAS (see section Numerical Comparisons for details).\n\n\n\n\n\n\nNegative binomial regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm.nb in R vs PROC GENMOD procedure in SAS, for parameter and lsmeans estimates, confidence intervals and p-values after manually adjusting the estimated variance-covariance matrix in R. For the dispersion parameter the MLEs also match, however discrepancies in the confidence intervals are observed.\n\n\n\nIn the following sections the implementations will be compared in tabular fashion followed by a numerical comparison using dummy data."
    +    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (different subjects in each of the 2 groups), or can be matched (the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more information about these methods, including which performs better in different scenarios see Five Confidence Intervals for Proportions That You Should Know about1."
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#how-to-read-the-tables",
    -    "href": "Comp/r-sas_negbin.html#how-to-read-the-tables",
    -    "title": "R vs SAS: Negative Binomial Regression",
    -    "section": "How to read the tables:",
    -    "text": "How to read the tables:\nLet’s walk through the conclusions for Table 1:\n\nSAS and R use different parameterizations of the negative binomial\nSAS and R use different likelihood optimization algorithms\nThere are differences in the estimation of the variance-covariance matrix, in particular the covariance between dispersion/scale parameter and model coefficients. It is however possible to obtain the SAS variance-covariance matrix in R.\nConvergence criteria are not generally identical in SAS and R.\nCI estimation methods are by default not identical but by using alternative confint function in R SAS method can be reproduced\n\nMethods for hypothesis testing for model coefficients are equivalent in SAS and R.\nLeast-square or marginal means are not directly available in R but equivalent estimation as in SAS is possible with additional packages\n\n\n\n\nTable 1: Negative binomial regression in SAS vs R\n\n\n\n\n\n\n\n\n\n\n\nAttribute\nSAS  PROC GENMOD\nR MASS::glm.nb\nNote\n\n\n\n\nNegative binomial parameterization\nVariance of the negative binomial is given by \\(\\mu + k\\mu^2\\) and the dispersion parameter k is estimated. Overdispersion increases as k goes to infinity.\nVariance of the negative binomial is given by \\(\\mu + \\frac{\\mu^2}{\\theta}\\) and the scale parameter theta is estimated. Overdispersion increases as theta goes to zero.\n\\(k=\\frac{1}{\\theta}\\)\n\n\nLikelihood optimization algorithm\nRidge-stabilized Newton-Raphson algorithm\nIteratively reweighted least squares (IWLS)\nIt seems SAS performs simultaneous optimization on all parameters (i.e. including dispersion). R uses an alternating process, where glm coefficients are fitted given a fixed theta and then theta is estimated given fixed coefficients until convergence.\n\n\nEstimation of variance-covariance matrix\nObserved (rather than expected) fisher information is used for calculation of standard errors of coefficients, which allows for non-zero covariance between coefficients and dispersion parameter.\nExpected fisher information is used for calculation of standard errors of coefficients, so covariance between coefficients and dispersion parameter is zero (which is asymptotically correct). However identical vcov matrix as in SAS can be obtained “post-hoc”.\nAs shown in the numerical example below in R the variance-covariance matrix corresponding to the PROC GENMOD estimation can be obtained based on the outputs from MASS::glm.nb with the glm.nb.cov function. The “correct” standard errors, confidence intervals and p-values can then be manually calculated based on the new covariance matrix.\n\n\nConvergence criteria\nThe iterations are considered to have converged when the maximum change in the parameter estimates between iteration steps is less than the value specified in CONVERGE option (default: CONVERGENCE = 1E-4)\nBased on relative difference between deviance, specified through epsilon argument in glm.control (default: epsilon = 1e-8).\nPROC GENMOD also checks for relative Hessian convergence and throws a warning if this is larger than the value provided in the CONVH option (default: CONVH = 1E-4 ).\n\n\nConfidence interval (CI) estimation method\nBy default asymptotic Wald CIs are estimated. Profile likelihood CI is estimated if option LRCI is provided.\nconfint function will estimate profile likelihood CIs, Wald CIs can be obtained by using confint.default\nNote that by default confidence intervals can differ even if same method is used if vcov matrix in R is not adjusted as explained above.\n\n\nHypothesis tests for regression coefficients\nAsymptotic Wald test\nAsymptotic Wald test\nPROC GENMOD reports Wald Chi-square statistic, while MASS::glm.nb reports the Z statistic, however the p-values are equivalent. Note that by default test results will differ if vcov matrix in R is not adjusted as explained above.\n\n\nEstimation of least-square/marginal means\nCalculation through lsmeans statement assumes that for classification effects the groups are balanced. OM option can be provided to obtain lsmeans that are using the observed proportions in the data\nNot implemented as part of MASS::glm.nb but can be obtained using emmeans package.\nIn R marginal means can be obtained using the emmeans::emmeans function, setting argument weights = \"equal\" corresponds to the default option in SAS, while weights = \"proportional\" gives the means proportional to observed data"
    +    "objectID": "R/ci_for_prop.html#introduction",
    +    "href": "R/ci_for_prop.html#introduction",
    +    "title": "Confidence Intervals for Proportions in R",
    +    "section": "",
    +    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (different subjects in each of the 2 groups), or can be matched (the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more information about these methods, including which performs better in different scenarios see Five Confidence Intervals for Proportions That You Should Know about1."
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#prerequisites-r-packages",
    -    "href": "Comp/r-sas_negbin.html#prerequisites-r-packages",
    -    "title": "R vs SAS: Negative Binomial Regression",
    -    "section": "Prerequisites: R packages",
    -    "text": "Prerequisites: R packages\nIn order to run these analyses we need to load a few packages.\n\nlibrary(MASS)\nlibrary(dplyr)\n\n\nAttaching package: 'dplyr'\n\n\nThe following object is masked from 'package:MASS':\n\n    select\n\n\nThe following objects are masked from 'package:stats':\n\n    filter, lag\n\n\nThe following objects are masked from 'package:base':\n\n    intersect, setdiff, setequal, union\n\nlibrary(emmeans)\n\nWelcome to emmeans.\nCaution: You lose important information if you filter this package's results.\nSee '? untidy'\n\n\nWe also define the glm_nb_cov function to obtain the SAS variance-covariance matrix in R from here.\n\n## Helper function to compute the variance from negative binomial regression\n## This matches with variance estimated from SAS\nglm_nb_cov <- function(mod) {\n  # given a model fitted by glm.nb in MASS, this function returns a variance covariance matrix for the\n  # regression coefficients and dispersion parameter, without assuming independence between these\n  # note that the model must have been fitted with x=TRUE argument so that design matrix is available\n  \n  # formulae based on p23-p24 of\n  # http://pointer.esalq.usp.br/departamentos/lce/arquivos/aulas/2011/LCE5868/OverdispersionBook.pdf\n  # and http://www.math.mcgill.ca/~dstephens/523/Papers/Lawless-1987-CJS.pdf\n  \n  # lintr: off\n  # please rm -- variable not used!\n  # k <- mod$theta\n  # lintr: on\n  # p is number of regression coefficients\n  p <- dim(vcov(mod))[1]\n  \n  # construct observed information matrix\n  obsInfo <- array(0, dim = c(p + 1, p + 1))\n  \n  # first calculate top left part for regression coefficients\n  for (i in 1:p) {\n    for (j in 1:p) {\n      obsInfo[i, j] <- sum((1 + mod$y / mod$theta) * mod$fitted.values * mod$x[, i] * mod$x[, j] /\n                             (1 + mod$fitted.values / mod$theta)^2)\n    }\n  }\n  \n  # information for dispersion parameter\n  obsInfo[(p + 1), (p + 1)] <- -sum(trigamma(mod$theta + mod$y) - trigamma(mod$theta) -\n                                      1 / (mod$fitted.values + mod$theta) + (mod$theta + mod$y) / (mod$theta + mod$fitted.values)^2 -\n                                      1 / (mod$fitted.values + mod$theta) + 1 / mod$theta)\n  \n  # covariance between regression coefficients and dispersion\n  for (i in 1:p) {\n    obsInfo[(p + 1), i] <- -sum(((mod$y - mod$fitted.values) * mod$fitted.values /\n                                   ((mod$theta + mod$fitted.values)^2)) * mod$x[, i])\n    obsInfo[i, (p + 1)] <- obsInfo[(p + 1), i]\n  }\n  \n  # return variance covariance matrix\n  solve(obsInfo, tol = 1e-20)\n}"
    +    "objectID": "R/ci_for_prop.html#data-used",
    +    "href": "R/ci_for_prop.html#data-used",
    +    "title": "Confidence Intervals for Proportions in R",
    +    "section": "Data used",
    +    "text": "Data used\nThe adcibc data stored here was used in this example, creating a binary treatment variable trt taking the values of ACT or PBO and a binary response variable resp taking the values of Yes or No. For this example, a response is defined as a score greater than 4.\nThe below shows that for the Actual Treatment, there are 36 responders out of 154 subjects = 0.234 (23.4% responders).\n\n\n# A tibble: 4 × 3\n# Groups:   trt [2]\n  trt   resp      n\n  <chr> <chr> <int>\n1 ACT   No      118\n2 ACT   Yes      36\n3 PBO   No       65\n4 PBO   Yes      12"
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#dummy-data",
    -    "href": "Comp/r-sas_negbin.html#dummy-data",
    -    "title": "R vs SAS: Negative Binomial Regression",
    -    "section": "Dummy data",
    -    "text": "Dummy data\nA dummy dataset is simulated, including\n\n100 subjects;\n\\(grp\\): a dummy variable with 1:1 subject assignment to treatment (\\(grp = 1\\)) vs placebo (\\(grp = 0\\)); note, variable \\(grpc\\) is a character version of \\(grp\\), which takes the value of “Trt” or “Plb”.\n\\(x1\\): a continuous variable which follows a normal distribution of mean of 0 and sd of 1;\n\\(x2\\): a categorical variable which take the value of “A” or “B” or “C” with a probability of 0.3, 0.2, 0.5, respectively.\n\\(logtime\\): An offset for the calculation of rates (e.g time in years) on the log-scale\n\\(y\\): a negative binomial outcome giving the event counts;\n\nThe dummy dataset is saved as a csv file, and then the csv file is read into SAS.\n\nN = 100\n\n# set seed for replication\nset.seed(123)\n\n# Treatment Group; 1:1 ratio\ngrp <- rep(c(0,1),each= N/2)\n\n# Covariates (one continuous; one categorical)\nx1 <- rnorm(N)\nx2 <- factor(sample(LETTERS[1:3], N, replace = TRUE, \n                    prob=c(0.3, 0.2, 0.5)))\n\n# Offset\nlogtime <- log(runif(N, 1, 2))\n\n# Model parameter assumption\nbeta0 = 0.6\nbetaTrt = -0.5\nbeta1 = 0.25\nbeta2 = c(-0.1, 0.2)\ntheta = 1/2\n\n\n# Dummy dataset\ndf <- data.frame(grp,x1, x2, logtime) %>% \n   mutate(log_rate = \n            case_when(x2 == \"A\" ~ beta0 + betaTrt*grp + beta1*x1 + logtime,\n                      x2 == \"B\" ~ beta0 + betaTrt*grp + beta1*x1 + beta2[1] + logtime, \n                      x2 == \"C\" ~ beta0 + betaTrt*grp + beta1*x1 + beta2[2] + logtime),\n          y = rnegbin(N, mu = exp(log_rate), theta = theta),\n          grpc = factor(case_when(grp==0 ~\"Plb\",\n                                 grp==1 ~\"Trt\")))\n\n# save the dummy dataset to be imported in SAS\n# write.csv(df, file = \"df_dummy_negbin.csv\")"
    +    "objectID": "R/ci_for_prop.html#packages",
    +    "href": "R/ci_for_prop.html#packages",
    +    "title": "Confidence Intervals for Proportions in R",
    +    "section": "Packages",
    +    "text": "Packages\nThe {cardx} package is an extension of the {cards} package, providing additional functions to create Analysis Results Data Objects (ARDs)1. It was developed as part of {NEST} and pharmaverse. This package requires the binary endpoint to be a logical (TRUE/FALSE) vector or a numeric/integer coded as (0, 1) with 1 (TRUE) being the success you want to calculate the confidence interval for.\nIf calculating the CI for a difference in proportions, the package requires both the response and the treatment variable to be numeric/integer coded as (0, 1) (or logical vector).\nInstead of the code presented below, you can use ard_categorical_ci(data, variables=resp, method ='wilson') for example. This invokes the code below but returns an analysis results dataset format as the output. Methods included are waldcc, wald, clopper-pearson, wilson, wilsoncc, strat_wilson, strat_wilsoncc, agresti-coull and jeffreys.\nCode example: proportion_ci_clopper_pearson(<resp_var>,conf.level=0.95) %>%    as_tibble()\nExample data format needed for {cardx} for a single proportion CI\n\n\n [1] 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0\n\n\nThe {PropCIs} package produces CIs for methods such as Blaker’s exact method and Midp which aren’t available in {cardx} but are available in SAS. We found results agreed with SAS to the 5th decimal place. The package also calculates CIs for Clopper-Pearson, Wald, Wilson, Agresti-coull and these align to results obtained in cardx to at least the 7th decimal place. The {PropsCIs} package requires just the number of events (numerator number of successes) & total number of subjects (denominator) as an input dataset. Given Blaker and Midp are rarely used in practice, and {PropsCIs} isn’t a package commonly downloaded from CRAN, further detail is not provided here.\nCode example for Clopper-pearson:\nexactci(x=<count of successes> , n=<Total>, conf.level=0.95)\nCode example for Mid P method:\nmidPci(x=<count of successes> , n=<Total>, conf.level=0.95)\nCode example for Blaker’s exact method:\nblakerci(x=<count of successes> , n=<Total>, conf.level=0.95, tolerance=1e-05)"
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#negative-binomial-regression-1",
    -    "href": "Comp/r-sas_negbin.html#negative-binomial-regression-1",
    -    "title": "R vs SAS: Negative Binomial Regression",
    -    "section": "Negative binomial regression",
    -    "text": "Negative binomial regression\n\n\n\n\n\n\nConclusion for negative binomial regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm.nb in R vs PROC GENMOD procedure in SAS, for parameters and lsmeans estimates, confidence intervals and p-values after manually adjusting the estimated variance-covariance matrix in R. For the dispersion parameter the MLEs also match, however discrepancies in the confidence intervals are observed.\n\n\n\n\nNegative binomial regression in SAS\nAfter importing the dummy dataset we can run the negative binomial regression in SAS using `PROC GENMOD. We estimate the model parameters and lsmeans for the treatment arms using both the default and OM weights.\n\nproc genmod data=df;\n    class GRPC (ref='Plb') X2 (ref='A');\n    model y = GRPC x1 x2 / dist=negbin link=log offset=logtime;\n    lsmeans GRPC /cl;\n    lsmeans GRPC /cl OM;\nrun;\n\nBelow is a screenshot of output tables summarizing coefficient estimates and lsmeans."
    +    "objectID": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-single-proportion-using-cardx",
    +    "href": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-single-proportion-using-cardx",
    +    "title": "Confidence Intervals for Proportions in R",
    +    "section": "Methods for Calculating Confidence Intervals for a single proportion using cardx",
    +    "text": "Methods for Calculating Confidence Intervals for a single proportion using cardx\nFor more technical derivation and reasons for use of each of the methods listed below, see the corresponding SAS page.\nLet’s start by calculating a Confidence interval for the proportion of successes observed in the Active Treatment group (a single sample).\n\nClopper-Pearson (Exact or binomial CI) Method\nClopper-Pearson Exact CI is one of the most popular methods, it is often good for small sample sizes when the proportion is not close to the tails (0,1), but it can be too conservative (too wide an interval compared to the interval containing the true population proportion 95% of the time).\nThe cardx package calculates the Clopper-Pearson score by calling stats::binom.test() function.\n\nproportion_ci_clopper_pearson(act2,conf.level=0.95) %>% \n  as_tibble()\n\n# A tibble: 1 × 10\n      N conf.level estimate statistic  p.value parameter conf.low conf.high\n  <int>      <dbl>    <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl>\n1   154       0.95    0.234        36 2.21e-11       154    0.169     0.309\n# ℹ 2 more variables: method <chr>, alternative <chr>\n\n\n\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nIn large random samples from independent trials, the sampling distribution of proportions approximately follows the normal distribution. The expectation of a sample proportion is the corresponding population proportion. Therefore, based on a sample of size \\(n\\), a \\((1-\\alpha)\\%\\) confidence interval for population proportion can be calculated using normal approximation as follows:\n\\(p\\approx \\hat p \\pm z_\\alpha \\sqrt{\\hat p(1-\\hat p)}/{n}\\), where \\(\\hat p\\) is the sample proportion, \\(z_\\alpha\\) is the \\(1-\\alpha/2\\) quantile of a standard normal distribution corresponding to level \\(\\alpha\\), and \\(\\sqrt{\\hat p(1-\\hat p)}/{n}\\) is the standard error.\nFor more technical information see the corresponding SAS page.\n\nExample code\nThe following code calculates a confidence interval for a binomial proportion using normal approximation equation manually. This is replicated exactly using the cardx::proportion_ci_wald function which also allows the continuity correction to be applied.\n\n    # sample proportion by trt\nsummary <- adcibc %>% \n           filter(trt==\"ACT\") %>% \n           group_by(resp) %>% \n           tally()  %>% \n           ungroup() %>% \n           mutate(total=sum(n)) %>% \n           mutate(p=n/total)\n\n    # Calculate standard error and 95% wald confidence intervals for population proportion\nwaldci <-summary %>% \n         filter(resp==\"Yes\") %>% \n         mutate(se=sqrt(p*(1-p)/total)) %>% \n         mutate(lower_ci=(p-qnorm(1-0.05/2)*se)) %>% \n         mutate(upper_ci=(p+qnorm(1-0.05/2)*se)) \nwaldci  \n\n# A tibble: 1 × 7\n  resp      n total     p     se lower_ci upper_ci\n  <chr> <int> <int> <dbl>  <dbl>    <dbl>    <dbl>\n1 Yes      36   154 0.234 0.0341    0.167    0.301\n\n#cardx package Wald method without continuity correction\nproportion_ci_wald(act2,conf.level=0.95,correct=FALSE) %>% \n  as_tibble()\n\n# A tibble: 1 × 6\n      N estimate conf.low conf.high conf.level method                           \n  <int>    <dbl>    <dbl>     <dbl>      <dbl> <glue>                           \n1   154    0.234    0.167     0.301       0.95 Wald Confidence Interval without…\n\n#cardx package Wald method with continuity correction\nproportion_ci_wald(act2,conf.level=0.95,correct=TRUE) %>% \n  as_tibble()\n\n# A tibble: 1 × 6\n      N estimate conf.low conf.high conf.level method                           \n  <int>    <dbl>    <dbl>     <dbl>      <dbl> <glue>                           \n1   154    0.234    0.164     0.304       0.95 Wald Confidence Interval with co…\n\n\n\n\n\nWilson Method (Also known as the Score method or the Altman, Newcombe method3 )\nThe cardx package calculates the Wilson (score) method by calling stats::prop.test() function. This method is often used as a compromise between the Clopper-Pearson and the Wald given it was found to be accurate for most parameter values (even those close to 0 and 1), and it does not suffer from being over-conservative. For more technical information see the corresponding SAS page.\nThe package also contains a function for proportion_ci_strat_wilson() which calculates the stratified Wilson CIs for unequal proportions as described on page 47 here.\n\n#cardx package Wilson method without continuity correction\nproportion_ci_wilson(act2,conf.level=0.95,correct=FALSE) %>% \n  as_tibble()\n\n# A tibble: 1 × 10\n      N conf.level estimate statistic  p.value parameter conf.low conf.high\n  <int>      <dbl>    <dbl>     <dbl>    <dbl>     <int>    <dbl>     <dbl>\n1   154       0.95    0.234      43.7 3.90e-11         1    0.174     0.307\n# ℹ 2 more variables: method <glue>, alternative <chr>\n\n#cardx package Wilson method with continuity correction\nproportion_ci_wilson(act2,conf.level=0.95,correct=TRUE) %>% \n  as_tibble()\n\n# A tibble: 1 × 10\n      N conf.level estimate statistic  p.value parameter conf.low conf.high\n  <int>      <dbl>    <dbl>     <dbl>    <dbl>     <int>    <dbl>     <dbl>\n1   154       0.95    0.234      42.6 6.70e-11         1    0.171     0.310\n# ℹ 2 more variables: method <glue>, alternative <chr>\n\n\n\n\nAgresti-Coull Method\nThe cardx package calculates the Agresti-Coull method using the equation from the published method by Alan Agresti & Brent Coull based on adding 2 successes and 2 failures before computing the wald CI. The CI is truncated, when it overshoots the boundary (<0 or >1).\n\n#cardx package agresti_coull method \nproportion_ci_agresti_coull(act2,conf.level=0.95) %>% \n  as_tibble()\n\n# A tibble: 1 × 6\n      N estimate conf.low conf.high conf.level method                           \n  <int>    <dbl>    <dbl>     <dbl>      <dbl> <chr>                            \n1   154    0.234    0.174     0.307       0.95 Agresti-Coull Confidence Interval\n\n\n\n\nJeffreys Method\nJeffreys method is a particular type of Bayesian Highest Probability Density (HPD) Method. For proportions, the beta distribution is generally used for the prior, which consists of two parameters alpha and beta. Setting alpha=beta=0.5 is called Jeffrey’s prior. NOTE: if you want to use any other priors, you can use binom.bayes which estimates a credible interval for proportions.\n\n#cardx package jeffreys method \nproportion_ci_jeffreys(act2,conf.level=0.95) %>% \n  as_tibble()\n\n# A tibble: 1 × 6\n      N estimate conf.low conf.high conf.level method           \n  <int>    <dbl>    <dbl>     <dbl>      <dbl> <glue>           \n1   154    0.234    0.172     0.305       0.95 Jeffreys Interval"
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#negative-binomial-regression-in-r",
    -    "href": "Comp/r-sas_negbin.html#negative-binomial-regression-in-r",
    -    "title": "R vs SAS: Negative Binomial Regression",
    -    "section": "Negative binomial regression in R",
    -    "text": "Negative binomial regression in R\nLets now try to reproduce the results in R using MASS::glm.nb.\n\nfit <- glm.nb(y ~ grpc + x1 + x2 + offset(logtime), data = df, x = TRUE)\n\n# model coefficients summary\nsummary(fit)$coefficients\n\n               Estimate Std. Error    z value   Pr(>|z|)\n(Intercept)  0.72652157  0.3507054  2.0716007 0.03830269\ngrpcTrt     -0.61401736  0.3414815 -1.7980982 0.07216145\nx1           0.25663164  0.1890455  1.3575129 0.17461831\nx2B         -0.37406342  0.5069487 -0.7378723 0.46059203\nx2C         -0.04999267  0.3916689 -0.1276401 0.89843376\n\n\nWe can see that while the estimates are exactly matching those in SAS, the standard errors are slightly smaller. This is a result of the difference in covariance estimation mentioned above. To obtain exactly the same results as in SAS we need to re-estimate the covariance matrix using the glm_nb_cov function we defined earlier. Note that to use this function with the fitted results we needed to specify x = TRUE in the glm.nb function so that the design matrix is available.\n\nsigma_hat <- glm_nb_cov(fit)\n\n## recalculate confidence intervals, and p-values\ncoef_est <- coef(fit)\ncoef_se <- sqrt(diag(sigma_hat)[1:5])\ncoef_lower <- coef_est - qnorm(0.975) * coef_se\ncoef_upper <- coef_est + qnorm(0.975) * coef_se\nzstat <- coef_est/coef_se\npval <- 2 * (1-pnorm(abs(zstat)))\nnew_summary <- cbind(coef_est, coef_se, coef_lower, coef_upper, zstat, pval)\ncolnames(new_summary) <- c(\"Estimate\", \"Std. Error\", \"CI_lower\", \"CI_upper\", \"z value\", \"Pr(>|z|)\")\nrownames(new_summary) <- rownames(summary(fit)$coefficients)\nnew_summary\n\n               Estimate Std. Error    CI_lower   CI_upper    z value   Pr(>|z|)\n(Intercept)  0.72652157  0.3517882  0.03702942 1.41601371  2.0652246 0.03890176\ngrpcTrt     -0.61401736  0.3479606 -1.29600763 0.06797291 -1.7646174 0.07762809\nx1           0.25663164  0.2066499 -0.14839474 0.66165803  1.2418667 0.21428575\nx2B         -0.37406342  0.5073695 -1.36848936 0.62036253 -0.7372604 0.46096404\nx2C         -0.04999267  0.4013463 -0.83661692 0.73663158 -0.1245624 0.90086997\n\n\nNow the estimates, standard errors, 95% confidence interval limits and p-values are exactly matching those in SAS up to the 4th digit. We can also provide an estimate and CI for the dispersion parameter:\n\n# estimate and 95%-CI for k = 1/theta\ntheta_est <- fit$theta\ntheta_se <- sqrt(sigma_hat[6, 6])\ntheta_est_ci <- c(theta_est, theta_est - qnorm(0.975) * theta_se, theta_est + qnorm(0.975) * theta_se)\n1/theta_est_ci[c(1, 3, 2)]\n\n[1] 2.370525 1.672211 4.070264\n\n\nWe see that while the point estimate is the same as in SAS, the CI for the dispersion does not match, most likely due to the different parameterizations used by SAS and R.\nFinally we can replicate the estimation of lsmeans in SAS via the emmeans package. Note that we need to supply the re-estimated covariance matrix, but only provide the rows and columns for the model coefficients without the dispersion parameter as emmeans does not need the latter.\n\n# lsmeans with weights = equal, equivalent to SAS default\nlsmean1 <- emmeans(fit, ~ grpc, data=df, vcov. = sigma_hat[1:5, 1:5], weights = \"equal\", offset = 0)\nlsmean1\n\n grpc   emmean    SE  df asymp.LCL asymp.UCL\n Plb   0.60837 0.245 Inf     0.128     1.088\n Trt  -0.00565 0.268 Inf    -0.531     0.519\n\nResults are averaged over the levels of: x2 \nResults are given on the log (not the response) scale. \nConfidence level used: 0.95 \n\n# lsmeans with weights = proportional, equivalent to SAS OM option\nlsmean2 <- emmeans(fit, ~ grpc, data=df, vcov. = sigma_hat[1:5, 1:5], weights = \"proportional\", offset = 0)\nlsmean2\n\n grpc emmean    SE  df asymp.LCL asymp.UCL\n Plb  0.6527 0.237 Inf     0.188     1.117\n Trt  0.0386 0.250 Inf    -0.451     0.528\n\nResults are averaged over the levels of: x2 \nResults are given on the log (not the response) scale. \nConfidence level used: 0.95 \n\n\nEstimates and CIs are exactly matching those in SAS for both of the options. Finally we can also obtain the z statistic and corresponding p-values:\n\ntest(lsmean1)\n\n grpc   emmean    SE  df z.ratio p.value\n Plb   0.60837 0.245 Inf   2.484  0.0130\n Trt  -0.00565 0.268 Inf  -0.021  0.9832\n\nResults are averaged over the levels of: x2 \nResults are given on the log (not the response) scale. \n\ntest(lsmean2)\n\n grpc emmean    SE  df z.ratio p.value\n Plb  0.6527 0.237 Inf   2.753  0.0059\n Trt  0.0386 0.250 Inf   0.155  0.8770\n\nResults are averaged over the levels of: x2 \nResults are given on the log (not the response) scale. \n\n\nAnd we see that these are also identical to the SAS results."
    +    "objectID": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-matched-pair-proportion",
    +    "href": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-a-matched-pair-proportion",
    +    "title": "Confidence Intervals for Proportions in R",
    +    "section": "Methods for Calculating Confidence Intervals for a matched pair proportion",
    +    "text": "Methods for Calculating Confidence Intervals for a matched pair proportion\nWhen you have 2 measurements on the same subject, the 2 sets of measures are not independent and you have matched pair of responses.\nIt is not usual to calculate the proportions separately for these responses, and then take a difference, instead other statistical methods such as odds ratios, risk ratios and confidence intervals for those statistics are used."
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#discussion",
    -    "href": "Comp/r-sas_negbin.html#discussion",
    -    "title": "R vs SAS: Negative Binomial Regression",
    -    "section": "Discussion",
    -    "text": "Discussion\nAs shown above it is generally possible to obtain exactly matching results in SAS and R for negative binomial regression. Most important to ensure matching is the manual estimation of the covariance matrix in R, as otherwise standard errors will only asymptotically match those in SAS.\nAs shown above lsmeans-type estimates can also be exactly reproduced using the emmeans package in R if options are correctly specified.\nFor the dispersion parameter an exact match in the MLE is possible, however CIs were not matching in our example. Most likely this is due to the different parameterizations used in SAS and R, since the variance for the dispersion parameters can not be transformed exactly between the two parameterizations. As generally the dispersion parameter should be of lesser interest and the other parameter estimates are not affected by this, this may however not be an issue in most applications.\nEven though results matched in the numerical example we have also highlighted that there are differences in the implementations, in particular when it comes to maximum likelihood optimization methods and convergence criteria. It is possible that this may lead to different estimates for data where the MLE is not easy to find and the methods may disagree on convergence or the optima of the likelihood. In addition, the different parameterizations may lead to different results in scenarios, where there is only very little overdispersion, since in those cases the dispersion parameter will go towards zero in SAS and towards infinity in R.\nAs a final point it should be kept in mind when comparing SAS and R results, that the two apply different rules for rounding. R rounds to the even digit (i.e. both 1.5 and 2.5 round to 2), while SAS uses “conventional” rounding rules (i.e 1.5 is rounded to 2 and 2.5 to 3). This can also occasionally lead to differences in results and may need to be addressed by using a custom rounding function in R, that uses SAS rounding rules. An example of such a function is provided in one of the references given below."
    +    "objectID": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-2-independent-samples-proportion-using-cardx",
    +    "href": "R/ci_for_prop.html#methods-for-calculating-confidence-intervals-for-2-independent-samples-proportion-using-cardx",
    +    "title": "Confidence Intervals for Proportions in R",
    +    "section": "Methods for Calculating Confidence Intervals for 2 independent samples proportion using {cardx}",
    +    "text": "Methods for Calculating Confidence Intervals for 2 independent samples proportion using {cardx}\nThis paper4 describes many methods for the calculation of confidence intervals for 2 independent proportions. The most commonly used are: Wald with continuity correction and the Wilson with continuity correction.\n\nNormal Approximation Method (Also known as the Wald or asymptotic CI Method)\nFor more technical information see the corresponding SAS page.\n\nExample code\ncardx::ard_stats_prop_test function uses stats::prop.test which also allows a continuity correction to be applied. More research is needed into this method.\nAlthough this website here and this one here both reference Newcombe for the CI that this function uses, replication of the results by hand and compared to SAS show that the results below match the Normal Approximation (Wald method) not the Newcome method? Further research is needed into this topic.\nBoth the Treatment variable (ACT,PBO) and the Response variable (Yes,No) have to be numeric (0,1) or Logit (TRUE,FALSE) variables.\n\nadcibc2<-select(adcibc,trtn,respn)\ncardx::ard_stats_prop_test(data=adcibc2, by=trtn, variables=respn, conf.level = 0.95, correct=FALSE) \n\n{cards} data frame: 13 x 9\n\n\n   group1 variable   context   stat_name stat_label      stat\n1    trtn    respn stats_pr…    estimate  Rate Dif…    -0.078\n2    trtn    respn stats_pr…   estimate1  Group 1 …     0.156\n3    trtn    respn stats_pr…   estimate2  Group 2 …     0.234\n4    trtn    respn stats_pr…   statistic  X-square…     1.893\n5    trtn    respn stats_pr…     p.value    p-value     0.169\n6    trtn    respn stats_pr…   parameter  Degrees …         1\n7    trtn    respn stats_pr…    conf.low  CI Lower…    -0.183\n8    trtn    respn stats_pr…   conf.high  CI Upper…     0.027\n9    trtn    respn stats_pr…      method     method 2-sample…\n10   trtn    respn stats_pr… alternative  alternat… two.sided\n11   trtn    respn stats_pr…           p          p          \n12   trtn    respn stats_pr…  conf.level  CI Confi…      0.95\n13   trtn    respn stats_pr…     correct  Yates' c…     FALSE\n\n\nℹ 3 more variables: fmt_fn, warning, error\n\ncardx::ard_stats_prop_test(data=adcibc2, by=trtn, variables=respn, conf.level = 0.95, correct=TRUE) \n\n{cards} data frame: 13 x 9\n\n\n   group1 variable   context   stat_name stat_label      stat\n1    trtn    respn stats_pr…    estimate  Rate Dif…    -0.078\n2    trtn    respn stats_pr…   estimate1  Group 1 …     0.156\n3    trtn    respn stats_pr…   estimate2  Group 2 …     0.234\n4    trtn    respn stats_pr…   statistic  X-square…      1.45\n5    trtn    respn stats_pr…     p.value    p-value     0.229\n6    trtn    respn stats_pr…   parameter  Degrees …         1\n7    trtn    respn stats_pr…    conf.low  CI Lower…    -0.193\n8    trtn    respn stats_pr…   conf.high  CI Upper…     0.037\n9    trtn    respn stats_pr…      method     method 2-sample…\n10   trtn    respn stats_pr… alternative  alternat… two.sided\n11   trtn    respn stats_pr…           p          p          \n12   trtn    respn stats_pr…  conf.level  CI Confi…      0.95\n13   trtn    respn stats_pr…     correct  Yates' c…      TRUE\n\n\nℹ 3 more variables: fmt_fn, warning, error\n\n\n\n\n\nWilson Method (Also known as the Score method or the Altman, Newcombe method3 )\nFor more technical information see the corresponding SAS page.\nFurther research is needed into this topic."
       },
       {
    -    "objectID": "Comp/r-sas_negbin.html#references",
    -    "href": "Comp/r-sas_negbin.html#references",
    -    "title": "R vs SAS: Negative Binomial Regression",
    +    "objectID": "R/ci_for_prop.html#references",
    +    "href": "R/ci_for_prop.html#references",
    +    "title": "Confidence Intervals for Proportions in R",
         "section": "References",
    -    "text": "References\n\nSAS PROC GENMOD documentation.\nR glm.nb documentation.\nCrossValidated discussion on covariance estimation (glm.nb.cov function is provided in the answer by Jonathan Bartlett).\nDiscussion of general differences in SAS and R including rounding"
    +    "text": "References\n\npharmaverse cardx package\nPropCIs package\nD. Altman, D. Machin, T. Bryant, M. Gardner (eds). Statistics with Confidence: Confidence Intervals and Statistical Guidelines, 2nd edition. John Wiley and Sons 2000.\nhttps://www.lexjansen.com/wuss/2016/127_Final_Paper_PDF.pdf"
       },
       {
    -    "objectID": "Comp/r-sas_rounding.html",
    -    "href": "Comp/r-sas_rounding.html",
    -    "title": "R v SAS rounding",
    +    "objectID": "R/logistic_regr.html",
    +    "href": "R/logistic_regr.html",
    +    "title": "Logistic Regression",
         "section": "",
    -    "text": "Rounding; R and SAS\nOn comparing the documentation of rounding rules for both languages, it will be noted that the default rounding rule (implemented in the respective language’s round() function) are different. Numerical differences arise in the knife-edge case where the number being rounded is equidistant between the two possible results. The round() function in SAS will round the number ‘away from zero’, meaning that 12.5 rounds to the integer 13. The round() function in Base R will round the number ‘to even’, meaning that 12.5 rounds to the integer 12. SAS does provide the rounde() function which rounds to even and the janitor package in R contains a function round_half_up() that rounds away from zero. In this use case, SAS produces a correct result from its round() function, based on its documentation, as does R. Both are right based on what they say they do, but they produce different results (Rimler, M.S. et al.).\nAs described in R - Rounding and SAS - Rounding, round() in SAS and round_half_up() in R are incorrect in rare different cases. It may need to be considered when comparing results between SAS and R.\nReferences\nRimler M.S., Rickert J., Jen M-H., Stackhouse M. Understanding differences in statistical methodology implementations across programming languages (2022, Fall). ASA Biopharmaceutical Report Issue 3, Volume 29.  Retrieved from https://higherlogicdownload.s3.amazonaws.com/AMSTAT/fa4dd52c-8429-41d0-abdf-0011047bfa19/UploadedImages/BIOP%20Report/BioPharm_fall2022FINAL.pdf"
    +    "text": "A model of the dependence of binary variables on explanatory variables. The logit of expectation is explained as linear for of explanatory variables. If we observed \\((y_i, x_i),\\) where \\(y_i\\) is a Bernoulli variable and \\(x_i\\) a vector of explanatory variables, the model for \\(\\pi_i = P(y_i=1)\\) is\n\\[\n\\text{logit}(\\pi_i)= \\log\\left\\{ \\frac{\\pi_i}{1-\\pi_i}\\right\\} = \\beta_0 + \\beta x_i, i = 1,\\ldots,n\n\\]\nThe model is especially useful in case-control studies and leads to the effect of risk factors by odds ratios.\n\nExample: Lung Cancer Data\nData source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601-7, 1994.\nSurvival in patients with advanced lung cancer from the North Central Cancer Treatment Group. Performance scores rate how well the patient can perform usual daily activities (see ?lung for details).\n\nlibrary(survival) \nglimpse(lung)\n\nRows: 228\nColumns: 10\n$ inst      <dbl> 3, 3, 3, 5, 1, 12, 7, 11, 1, 7, 6, 16, 11, 21, 12, 1, 22, 16…\n$ time      <dbl> 306, 455, 1010, 210, 883, 1022, 310, 361, 218, 166, 170, 654…\n$ status    <dbl> 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …\n$ age       <dbl> 74, 68, 56, 57, 60, 74, 68, 71, 53, 61, 57, 68, 68, 60, 57, …\n$ sex       <dbl> 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, …\n$ ph.ecog   <dbl> 1, 0, 0, 1, 0, 1, 2, 2, 1, 2, 1, 2, 1, NA, 1, 1, 1, 2, 2, 1,…\n$ ph.karno  <dbl> 90, 90, 90, 90, 100, 50, 70, 60, 70, 70, 80, 70, 90, 60, 80,…\n$ pat.karno <dbl> 100, 90, 90, 60, 90, 80, 60, 80, 80, 70, 80, 70, 90, 70, 70,…\n$ meal.cal  <dbl> 1175, 1225, NA, 1150, NA, 513, 384, 538, 825, 271, 1025, NA,…\n$ wt.loss   <dbl> NA, 15, 15, 11, 0, 0, 10, 1, 16, 34, 27, 23, 5, 32, 60, 15, …\n\n\n\n\nModel Fit\nWe analyze the weight loss in lung cancer patients in dependency of age, sex, ECOG performance score and calories consumed at meals.\n\nlung2 <- survival::lung %>% \n  mutate(\n    wt_grp = factor(wt.loss > 0, labels = c(\"weight loss\", \"weight gain\"))\n  ) \n\n\nm1 <- glm(wt_grp ~ age + sex + ph.ecog + meal.cal, data = lung2, family = binomial(link=\"logit\"))\nsummary(m1)\n\n\nCall:\nglm(formula = wt_grp ~ age + sex + ph.ecog + meal.cal, family = binomial(link = \"logit\"), \n    data = lung2)\n\nCoefficients:\n              Estimate Std. Error z value Pr(>|z|)  \n(Intercept)  3.2631673  1.6488207   1.979   0.0478 *\nage         -0.0101717  0.0208107  -0.489   0.6250  \nsex         -0.8717357  0.3714042  -2.347   0.0189 *\nph.ecog      0.4179665  0.2588653   1.615   0.1064  \nmeal.cal    -0.0008869  0.0004467  -1.985   0.0471 *\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for binomial family taken to be 1)\n\n    Null deviance: 202.36  on 169  degrees of freedom\nResidual deviance: 191.50  on 165  degrees of freedom\n  (58 observations deleted due to missingness)\nAIC: 201.5\n\nNumber of Fisher Scoring iterations: 4\n\n\nThe model summary contains the parameter estimates \\(\\beta_j\\) for each explanatory variable \\(x_j\\), corresponding to the log-odds for the response variable to take the value \\(1\\), conditional on all other explanatory variables remaining constant. For better interpretation, we can exponentiate these estimates, to obtain estimates for the odds instead and provide \\(95\\)% confidence intervals:\n\nexp(coef(m1))\n\n(Intercept)         age         sex     ph.ecog    meal.cal \n 26.1321742   0.9898798   0.4182250   1.5188698   0.9991135 \n\nexp(confint(m1))\n\nWaiting for profiling to be done...\n\n\n                2.5 %      97.5 %\n(Intercept) 1.0964330 730.3978786\nage         0.9495388   1.0307216\nsex         0.1996925   0.8617165\nph.ecog     0.9194053   2.5491933\nmeal.cal    0.9982107   0.9999837\n\n\n\n\nModel Comparison\nTo compare two logistic models, one tests the difference in residual variances from both models using a \\(\\chi^2\\)-distribution with a single degree of freedom (here at the \\(5\\)% level):\n\nm2 <- glm(wt_grp ~ sex + ph.ecog + meal.cal, data = lung2, family = binomial(link=\"logit\"))\nsummary(m2)\n\n\nCall:\nglm(formula = wt_grp ~ sex + ph.ecog + meal.cal, family = binomial(link = \"logit\"), \n    data = lung2)\n\nCoefficients:\n              Estimate Std. Error z value Pr(>|z|)   \n(Intercept)  2.5606595  0.7976887   3.210  0.00133 **\nsex         -0.8359241  0.3637378  -2.298  0.02155 * \nph.ecog      0.3794295  0.2469030   1.537  0.12435   \nmeal.cal    -0.0008334  0.0004346  -1.918  0.05517 . \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n(Dispersion parameter for binomial family taken to be 1)\n\n    Null deviance: 202.36  on 169  degrees of freedom\nResidual deviance: 191.74  on 166  degrees of freedom\n  (58 observations deleted due to missingness)\nAIC: 199.74\n\nNumber of Fisher Scoring iterations: 4\n\nanova(m1, m2, test = \"Chisq\")\n\nAnalysis of Deviance Table\n\nModel 1: wt_grp ~ age + sex + ph.ecog + meal.cal\nModel 2: wt_grp ~ sex + ph.ecog + meal.cal\n  Resid. Df Resid. Dev Df Deviance Pr(>Chi)\n1       165     191.50                     \n2       166     191.75 -1 -0.24046   0.6239\n\n\n\n\nPrediction\nPredictions from the model for the log-odds of a patient with new data to experience a weight loss are derived using predict():\n\n# new female, symptomatic but completely ambulatory patient consuming 2500 calories\nnew_pt <- data.frame(sex=2, ph.ecog=1, meal.cal=2500)\npredict(m2, new_pt, type = \"response\")\n\n       1 \n0.306767"
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html",
    -    "href": "Comp/r-sas_logistic-regr.html",
    -    "title": "R vs SAS: Logistic Regression",
    +    "objectID": "R/correlation.html",
    +    "href": "R/correlation.html",
    +    "title": "Correlation Analysis Using R",
         "section": "",
    -    "text": "Comparison of results between SAS vs R for different applications of logistic regression; where possible we try to ensure the same statistical method or algorithm is specified. However, there are some underlying differences between the algorithms in SAS vs R that cannot be (at least not easily) “tweaked”. The document also provides some remarks on what parameters to look out for and what could have caused the numerical differences.\n\n\n\n\n\n\n\n\n\n\n\nMethodologies\n\n\n\n\n\n\nLogistic regression\nFirth’s bias-reduced logistic regression\ng-computation / standardization with covariate adjustment\n\n\n\n\n\n\n\n\n\n\n\nTechnical implementations\n\n\n\n\n\n\nSAS: PROC LOGISTIC (with and without firth option) and %margins macro\n\nR: stats::glm, logistf::logistf and beeca::get_marginal_effect\n\n\n\n\n\n\n\n\n\nBelow are summary of findings from a numerical comparison using example data, where possible we specify the same algorithm in R and SAS.\n\n\n\n\n\n\nLogistic regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm in R vs PROC LOGISTIC procedure (without Firth option) in SAS.\n\n\n\n\n\n\n\n\n\nFirth logistic regression\n\n\n\n\n\nExact match cannot be obtained for all estimates using logistf vs PROC LOGISTIC procedure (with Firth option). More specifically:\n- Coefficient estimate and 95% CI matched at 0.001 level;\n- Standard error are not the same (e.g., 0.02023 for age in R vs 0.02065 in SAS);\n- p-value is not the same (0.6288 in R for age vs 0.6348 in SAS);\n\n\n\n\n\n\n\n\n\n\ng-computation with covariate adjustment\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using get_marginal_effect in R vs %margins macro in SAS.\n\n\n\nIn the following sections, the parameterisation of logistic regression implementation (with an without Firth option) will be compared followed by numerical comparison using example data."
    +    "text": "The most commonly used correlation analysis methods in clinical trials include:\n\nPearson correlation coefficient: product moment coefficient between two continuous variables, measuring linear associations.\n\n\\[\nr = \\frac{\\sum_{i=1}^n (x_i - m_x)(y_i - m_y)}{\\sqrt{\\sum_{i=1}^n (x_i - m_x)^2\\sum_{i=1}^n (y_i - m_y)^2}},\\]\nwhere \\(x\\) and \\(y\\) are observations from two continuous variables of length \\(n\\) and \\(m_x\\) and \\(m_y\\) are their respective means.\nSpearman correlation coefficient: rank correlation defined through the scaled sum of the squared values of the difference between ranks of two continuous variables.\n\\[\n\\rho = \\frac{\\sum_{i=1}^n (x'_i - m_{x'})(y'_i - m_{y'})}{\\sqrt{\\sum_{i=1}^n (x'_i - m_{x'})^2\\sum_{i=1}^n(y'_i - m_{y'})^2}},\n\\]\nwhere \\(x'\\) and \\(y'\\) are the ranks of \\(x\\) and \\(y\\) and \\(m_{x'}\\) and \\(m_{y'}\\) are the mean ranks of \\(x\\) and \\(y\\), respectively.\nKendall’s rank correlation: rank correlation based on the number of inversions in one ranking as compared with another.\n\\[\n\\tau = \\frac{n_c - n_d}{\\frac{1}{2}\\,n\\,(n-1)},\n\\]\nwhere \\(n_c\\) is the total number of concordant pairs, \\(n_d\\) is the total number of disconcordant pairs and \\(n\\) the total size of observations in \\(x\\) and \\(y\\).\n\nOther association measures are available for count data/contingency tables comparing observed frequencies with those expected under the assumption of independence\n\nFisher exact test\nChi-Square statistic\n\n\nExample: Lung Cancer Data\nData source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601-7, 1994.\nSurvival in patients with advanced lung cancer from the North Central Cancer Treatment Group. Performance scores rate how well the patient can perform usual daily activities.\n\nlibrary(survival) \n\nglimpse(lung)\n\nRows: 228\nColumns: 10\n$ inst      <dbl> 3, 3, 3, 5, 1, 12, 7, 11, 1, 7, 6, 16, 11, 21, 12, 1, 22, 16…\n$ time      <dbl> 306, 455, 1010, 210, 883, 1022, 310, 361, 218, 166, 170, 654…\n$ status    <dbl> 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …\n$ age       <dbl> 74, 68, 56, 57, 60, 74, 68, 71, 53, 61, 57, 68, 68, 60, 57, …\n$ sex       <dbl> 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, …\n$ ph.ecog   <dbl> 1, 0, 0, 1, 0, 1, 2, 2, 1, 2, 1, 2, 1, NA, 1, 1, 1, 2, 2, 1,…\n$ ph.karno  <dbl> 90, 90, 90, 90, 100, 50, 70, 60, 70, 70, 80, 70, 90, 60, 80,…\n$ pat.karno <dbl> 100, 90, 90, 60, 90, 80, 60, 80, 80, 70, 80, 70, 90, 70, 70,…\n$ meal.cal  <dbl> 1175, 1225, NA, 1150, NA, 513, 384, 538, 825, 271, 1025, NA,…\n$ wt.loss   <dbl> NA, 15, 15, 11, 0, 0, 10, 1, 16, 34, 27, 23, 5, 32, 60, 15, …\n\n\n\n\nOverview\ncor() computes the correlation coefficient between continuous variables x and y, where method chooses which correlation coefficient is to be computed (default: \"pearson\", \"kendall\", or \"spearman\").\ncor.test() calulates the test for association between paired samples, using one of Pearson’s product moment correlation coefficient, Kendall’s \\(\\tau\\) or Spearman’s \\(\\rho\\). Besides the correlation coefficient itself, it provides additional information.\nMissing values are assumed to be missing completely at random (MCAR). Different strategies are available, see ?cor for details.\n\n\nPearson Correlation\n\ncor.test(x = lung$age, y = lung$meal.cal, method = \"pearson\") \n\n\n    Pearson's product-moment correlation\n\ndata:  lung$age and lung$meal.cal\nt = -3.1824, df = 179, p-value = 0.001722\nalternative hypothesis: true correlation is not equal to 0\n95 percent confidence interval:\n -0.3649503 -0.0885415\nsample estimates:\n       cor \n-0.2314107 \n\n\n\n\nSpearman Correlation\n\ncor.test(x = lung$age, y = lung$meal.cal, method = \"spearman\")\n\nWarning in cor.test.default(x = lung$age, y = lung$meal.cal, method =\n\"spearman\"): Cannot compute exact p-value with ties\n\n\n\n    Spearman's rank correlation rho\n\ndata:  lung$age and lung$meal.cal\nS = 1193189, p-value = 0.005095\nalternative hypothesis: true rho is not equal to 0\nsample estimates:\n       rho \n-0.2073639 \n\n\nNote: Exact p-values require unanimous ranks.\n\n\nKendall’s rank correlation\n\ncor.test(x = lung$age, y = lung$meal.cal, method = \"kendall\")\n\n\n    Kendall's rank correlation tau\n\ndata:  lung$age and lung$meal.cal\nz = -2.7919, p-value = 0.00524\nalternative hypothesis: true tau is not equal to 0\nsample estimates:\n       tau \n-0.1443877 \n\n\n\n\nInterpretation of correlation coefficients\nCorrelation coefficient is comprised between -1 and 1:\n\n\\(-1\\) indicates a strong negative correlation\n\\(0\\) means that there is no association between the two variables\n\\(1\\) indicates a strong positive correlation"
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#goal",
    -    "href": "Comp/r-sas_logistic-regr.html#goal",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "",
    -    "text": "Comparison of results between SAS vs R for different applications of logistic regression; where possible we try to ensure the same statistical method or algorithm is specified. However, there are some underlying differences between the algorithms in SAS vs R that cannot be (at least not easily) “tweaked”. The document also provides some remarks on what parameters to look out for and what could have caused the numerical differences."
    +    "objectID": "R/binomial_test.html",
    +    "href": "R/binomial_test.html",
    +    "title": "Binomial Test",
    +    "section": "",
    +    "text": "The statistical test used to determine whether the proportion in a binary outcome experiment is equal to a specific value. It is appropriate when we have a small sample size and want to test the success probability \\(p\\) against a hypothesized value \\(p_0\\)."
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#scope",
    -    "href": "Comp/r-sas_logistic-regr.html#scope",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "",
    -    "text": "Methodologies\n\n\n\n\n\n\nLogistic regression\nFirth’s bias-reduced logistic regression\ng-computation / standardization with covariate adjustment\n\n\n\n\n\n\n\n\n\n\n\nTechnical implementations\n\n\n\n\n\n\nSAS: PROC LOGISTIC (with and without firth option) and %margins macro\n\nR: stats::glm, logistf::logistf and beeca::get_marginal_effect"
    +    "objectID": "R/binomial_test.html#creating-a-sample-dataset",
    +    "href": "R/binomial_test.html#creating-a-sample-dataset",
    +    "title": "Binomial Test",
    +    "section": "Creating a sample dataset",
    +    "text": "Creating a sample dataset\n\nWe will generate a dataset where we record the outcomes of 1000 coin flips.\nWe will use the binom.test function to test if the proportion of heads is significantly different from 0.5.\n\n\nset.seed(19)\ncoin_flips <- sample(c(\"H\", \"T\"), \n                     size = 1000, \n                     replace = T,\n                     prob = c(0.5, 0.5))\n\nNow, we will count the heads and tails and summarize the data.\n\nheads_count <- sum(coin_flips == \"H\")\ntails_count <- sum(coin_flips == \"T\")\ntotal_flips <- length(coin_flips)\n\n\nheads_count\n\n[1] 513\n\ntails_count\n\n[1] 487\n\ntotal_flips\n\n[1] 1000"
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#findings",
    -    "href": "Comp/r-sas_logistic-regr.html#findings",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "",
    -    "text": "Below are summary of findings from a numerical comparison using example data, where possible we specify the same algorithm in R and SAS.\n\n\n\n\n\n\nLogistic regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm in R vs PROC LOGISTIC procedure (without Firth option) in SAS.\n\n\n\n\n\n\n\n\n\nFirth logistic regression\n\n\n\n\n\nExact match cannot be obtained for all estimates using logistf vs PROC LOGISTIC procedure (with Firth option). More specifically:\n- Coefficient estimate and 95% CI matched at 0.001 level;\n- Standard error are not the same (e.g., 0.02023 for age in R vs 0.02065 in SAS);\n- p-value is not the same (0.6288 in R for age vs 0.6348 in SAS);\n\n\n\n\n\n\n\n\n\n\ng-computation with covariate adjustment\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using get_marginal_effect in R vs %margins macro in SAS.\n\n\n\nIn the following sections, the parameterisation of logistic regression implementation (with an without Firth option) will be compared followed by numerical comparison using example data."
    +    "objectID": "R/binomial_test.html#conducting-binomial-test",
    +    "href": "R/binomial_test.html#conducting-binomial-test",
    +    "title": "Binomial Test",
    +    "section": "Conducting Binomial Test",
    +    "text": "Conducting Binomial Test\n\nbinom_test_result <- binom.test(heads_count, total_flips, p = 0.5)\nbinom_test_result\n\n\n    Exact binomial test\n\ndata:  heads_count and total_flips\nnumber of successes = 513, number of trials = 1000, p-value = 0.4292\nalternative hypothesis: true probability of success is not equal to 0.5\n95 percent confidence interval:\n 0.4815213 0.5444020\nsample estimates:\nprobability of success \n                 0.513 \n\n\n\nResults:\nThe output has a p-value 0.4292098 \\(> 0.05\\) (chosen level of significance). Hence, we fail to reject the null hypothesis and conclude that the coin is fair."
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#r-packages",
    -    "href": "Comp/r-sas_logistic-regr.html#r-packages",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "R packages",
    -    "text": "R packages\n\nlibrary(tidyverse)\n\n── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──\n✔ dplyr     1.1.4     ✔ readr     2.1.5\n✔ forcats   1.0.0     ✔ stringr   1.5.1\n✔ ggplot2   3.5.1     ✔ tibble    3.2.1\n✔ lubridate 1.9.3     ✔ tidyr     1.3.1\n✔ purrr     1.0.2     \n── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag()    masks stats::lag()\nℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors\n\nlibrary(survival) # for example data\nlibrary(logistf) # for firth regression\nlibrary(beeca) # for covariate adjustment"
    +    "objectID": "R/binomial_test.html#conduct-the-binomial-test",
    +    "href": "R/binomial_test.html#conduct-the-binomial-test",
    +    "title": "Binomial Test",
    +    "section": "Conduct the Binomial Test",
    +    "text": "Conduct the Binomial Test\nWe will conduct the Binomial test and hypothesize that the proportin of death should be 19%.\n\nbinom_test <- binom.test(num_deaths, total_pat, p = 0.19)\nbinom_test\n\n\n    Exact binomial test\n\ndata:  num_deaths and total_pat\nnumber of successes = 63, number of trials = 228, p-value = 0.001683\nalternative hypothesis: true probability of success is not equal to 0.19\n95 percent confidence interval:\n 0.2193322 0.3392187\nsample estimates:\nprobability of success \n             0.2763158"
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#data",
    -    "href": "Comp/r-sas_logistic-regr.html#data",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "Data",
    -    "text": "Data\n\nLogistic regressions\nWe use the lung dataset provided with {survival} R package. Initial data preparation involves generating a new binary outcome based on the weight change.\n\n# the lung dataset is available in ./data/lung_cancer.csv\nlung2 <- survival::lung %>% \n  mutate(\n    wt_grp = factor(wt.loss > 0, labels = c(\"weight loss\", \"weight gain\"))\n  ) \nglimpse(lung2)\n\nRows: 228\nColumns: 11\n$ inst      <dbl> 3, 3, 3, 5, 1, 12, 7, 11, 1, 7, 6, 16, 11, 21, 12, 1, 22, 16…\n$ time      <dbl> 306, 455, 1010, 210, 883, 1022, 310, 361, 218, 166, 170, 654…\n$ status    <dbl> 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …\n$ age       <dbl> 74, 68, 56, 57, 60, 74, 68, 71, 53, 61, 57, 68, 68, 60, 57, …\n$ sex       <dbl> 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, …\n$ ph.ecog   <dbl> 1, 0, 0, 1, 0, 1, 2, 2, 1, 2, 1, 2, 1, NA, 1, 1, 1, 2, 2, 1,…\n$ ph.karno  <dbl> 90, 90, 90, 90, 100, 50, 70, 60, 70, 70, 80, 70, 90, 60, 80,…\n$ pat.karno <dbl> 100, 90, 90, 60, 90, 80, 60, 80, 80, 70, 80, 70, 90, 70, 70,…\n$ meal.cal  <dbl> 1175, 1225, NA, 1150, NA, 513, 384, 538, 825, 271, 1025, NA,…\n$ wt.loss   <dbl> NA, 15, 15, 11, 0, 0, 10, 1, 16, 34, 27, 23, 5, 32, 60, 15, …\n$ wt_grp    <fct> NA, weight gain, weight gain, weight gain, weight loss, weig…\n\n\n\n\ng-computation\nWe use the trial01 dataset provided with {beeca} R package. Initial data preparation involves setting the treatment indicator as a categorical variable and removing any incomplete cases.\n\ndata(\"trial01\")\n\ntrial01$trtp <- factor(trial01$trtp) ## set treatment to a factor\n\ntrial01 <- trial01 %>% filter(!is.na(aval)) ## remove missing data i.e complete cases analysis\n# save the dataset to be imported in SAS\n# write.csv(trial01, file = \"data/trial01.csv\", na = \".\")"
    +    "objectID": "R/binomial_test.html#results-1",
    +    "href": "R/binomial_test.html#results-1",
    +    "title": "Binomial Test",
    +    "section": "Results:",
    +    "text": "Results:\nThe output has a p-value 0.0016829 \\(< 0.05\\) (chosen level of significance). Hence, we reject the null hypothesis and conclude that the propotion of death is significantly different from 19%."
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#parameterisation-comparison",
    -    "href": "Comp/r-sas_logistic-regr.html#parameterisation-comparison",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "Parameterisation Comparison",
    -    "text": "Parameterisation Comparison\nThe following set of tables compare how to configure particular parameters / attributes of the methodologies.\n\n\n\nTable 1: Standard Logistic Regression in SAS vs R\n\n\n\n\n\n\n\n\n\n\n\n\nAttribute\nSAS  PROC LOGISTIC\nR stats::glm\nDescription\nNote\n\n\n\n\nLikelihood optimization algorithm\nDefault\nDefault\nFisher’s scoring method (i.e., iteratively reweighted least squares (IRLS))\nFor logistic regression, parameter estimates and covariance matrices estimated should be the same for both Fisher’s and Newton-Raphson algorithm for maximum likelihood.\n\n\nConvergence criteria\nDefault\nNA\nSpecifies relative gradient convergence criterion (GCONV=1E–8)\nInPROC LOGISTIC there are three other convergence criteria which can be specified. However, there is no exact criterion that matches the criteria in stats::glm.\n\n\nConvergence criteria\nNA\nDefault\nSpecifies relative difference between deviance < 1E–8.\n\n\n\nConfidence interval (CI) estimation method\nDefault\nconfint.default()\nWald CI\nIn stats::glm in R, function confint.default() gives the Wald confidence limits; whereas function confint() gives the profile-likelihood limits.\n\n\nHypothesis tests for regression coefficients\nDefault\nDefault\nWald tests, which are based on estimates for the regression coefficients and its corresponding standard error."
    +    "objectID": "R/gsd-tte.html",
    +    "href": "R/gsd-tte.html",
    +    "title": "Group sequential design in R",
    +    "section": "",
    +    "text": "While a group sequential design (GSD) could be applied for different types of endpoints, here we focus on time-to-event endpoints."
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#sec-num-comp",
    -    "href": "Comp/r-sas_logistic-regr.html#sec-num-comp",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "Numerical Comparison",
    -    "text": "Numerical Comparison\nEvery effort is made to ensure that the R code employs estimation methods/ optimization algorithms/ other components that closely match (as much as possible) those used in the SAS code.\n\nglm in R\nNote, the default fitting method in glm is consistent with the default fitting method in PROC LOGISTIC procedure.\n\nDefault fitting method in glm is iteratively reweighted least squares, and the documentation can be found here.\nDefault fitting method for PROC LOGISTIC procedure is Fisher’s scoring method, which is reported as part of the SAS default output, and it is equivalent to “Iteratively reweighted least squares” method as reported in this documentation.\n\n\n# stats::glm function\nm1 <- glm(wt_grp ~ age + sex + ph.ecog + meal.cal, data = lung2, family = binomial(link=\"logit\"))\n# model coefficients summary\nsummary(m1)$coefficients\n\n                 Estimate   Std. Error    z value   Pr(>|z|)\n(Intercept)  3.2631672833 1.6488206996  1.9790917 0.04780569\nage         -0.0101717451 0.0208107243 -0.4887742 0.62500157\nsex         -0.8717357187 0.3714041991 -2.3471348 0.01891841\nph.ecog      0.4179665342 0.2588653214  1.6146100 0.10639518\nmeal.cal    -0.0008869427 0.0004467405 -1.9853642 0.04710397\n\n\nNote, function confint.default gives the Wald confidence limits, which is the default option in SAS PROC LOGISTIC procedure; whereas confint gives the profile-likelihood limits. Conditional odds ratio is calculated by taking the exponential of the model parameters.\n\ncbind(est = coef(m1), \n          confint.default(m1))\n\n                      est        2.5 %        97.5 %\n(Intercept)  3.2631672833  0.031538095  6.494796e+00\nage         -0.0101717451 -0.050960015  3.061653e-02\nsex         -0.8717357187 -1.599674572 -1.437969e-01\nph.ecog      0.4179665342 -0.089400173  9.253332e-01\nmeal.cal    -0.0008869427 -0.001762538 -1.134731e-05\n\n\n\n\nPROC LOGISTIC in SAS (without firth option)\n\nPROC LOGISTIC DATA=LUNG2; # import lung\n    MODEL WT_GRP(EVENT=\"weight_gain\") = AGE SEX PH_ECOG MEAL_CAL;\n    ods output ESTIMATEs=estimates;\nrun;\n\nBelow is screenshot of output tables summarizing coefficient estimates and confidence intervals\n\n\n\n\n\n\n\n\n\n\n\n\nComment on model selection\nAs indicated in Logistic regression in R and Logistic regression in SAS, the chi-Sq test statistics and p-values are different when performing model selections in R vs. SAS. The reason for this discrepancy is that the chi-Sq statistics from anova() in R is based on deviance test using residual deviance while the chi-Sq statistics from PROC LOGISTIC w/ SELECTION option in SAS is based on Wald test using z-values squared.\n\n\n\n\n\n\nConclusion for logistic regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm in R vs PROC LOGISTIC procedure (without Firth option) in SAS, for coefficient estimates, 95% CI, and for p-value."
    +    "objectID": "R/gsd-tte.html#group-sequential-design-time-to-event-endpoint",
    +    "href": "R/gsd-tte.html#group-sequential-design-time-to-event-endpoint",
    +    "title": "Group sequential design in R",
    +    "section": "",
    +    "text": "While a group sequential design (GSD) could be applied for different types of endpoints, here we focus on time-to-event endpoints."
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#parameterisation-comparison-1",
    -    "href": "Comp/r-sas_logistic-regr.html#parameterisation-comparison-1",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "Parameterisation Comparison",
    -    "text": "Parameterisation Comparison\n\n\n\nTable 2: Firth’s Bias-Reduced Logistic Regression in SAS vs R\n\n\n\n\n\n\n\n\n\n\n\n\nAttribute\nSAS  PROC LOGISTIC w/ Firth option\nR logistf::logistf\nDescription\nNote\n\n\n\n\nLikelihood optimization algorithm\nDefault\ncontrol =logistf.control (fit =“IRLS”)\nFisher’s scoring method (i.e., iteratively reweighted least squares (IRLS))\n\n\n\nLikelihood optimization algorithm\nTECHNIQUE = NEWTON\nDefault\nNewton-Raphson algorithm\n\n\n\nConvergence criteria\nDefault\nNA\nSpecifies relative gradient convergence criterion (GCONV=1E–8).\nInPROC LOGISTIC there are three other convergence criteria which can be specified. If more than one convergence criterion is specified, the optimization is terminated as soon as one of the criteria is satisfied.\n\n\nConvergence criteria\nNA\nDefault\nSpecifies three criteria that need to be met: the change in log likelihood is less than lconv (default is 1E-5), the maximum absolute element of the score vector is less than gconv (default is 1E-5), and the maximum absolute change in beta is less than xconv (default is 1E-5).\nThe gconv criteria in logistif is different from GCONV in SAS. The lconv criteria is also not exactly the same as the ABSFCONV or FCONV in PROC LOGISTIC in SAS, although the criteria use log likelihood. However, the xconv in R and XCONV in SAS seems to be consistent.\n\n\nConvergence criteria\nXCONV = 1E–8\ncontrol = logistf.control( xconv = 1E–8, lconv = 1, gconv = 1)\nSpecifies the maximum absolute change in beta < 1E–8.\nIn logistf, three convergence criteria are checked at the same time. So here we use a large convergence criteria value for lconv and gconv to mimic the scenario where only xconv is checked.\n\n\nConfidence interval (CI) estimation method\nDefault\npl= FALSE\nWald CI\nFor logistf: “Note that from version 1.24.1 on, the variance-covariance matrix is based on the second derivative of the likelihood of the augmented data rather than the original data, which proved to be a better approximation if the user chooses to set a higher value for the penalty strength.” This could cause differences in standard error estimates in R vs SAS for Firth logistic regression, and consequently results in differences in the corresponding Wald CI estimates and hypothesis tests results (e.g., p-values).\n\n\nConfidence interval (CI) estimation method\nCLPARM = PL  CLODDS = PL\nDefault\nProfile likelihood-based CI\nFor Firth’s bias-reduced logistic regression, it makes more sense to use penalized likelihood-based CI so it is consistent with the parameter estimation method which uses penalized maximum likelihood.\n\n\nHypothesis tests for regression coefficients\nDefault\npl= FALSE\nWald tests, which are based on estimates for the regression coefficients and its corresponding standard error.\n\n\n\nHypothesis tests for regression coefficients\nNA\nDefault\n“Likelihood ratio tests”, which are based on profile penalized log likelihood.\nIn SAS, when the model statement option CLPARM = PL is specified, the CI will be calculated based on profile likelihood. However, the hypothesis testing method is still a Wald method. This could cause results mismatch in the p-value."
    +    "objectID": "R/gsd-tte.html#available-r-packages",
    +    "href": "R/gsd-tte.html#available-r-packages",
    +    "title": "Group sequential design in R",
    +    "section": "Available R packages",
    +    "text": "Available R packages\nThe commonly used R packages for power and sample size calculations utilizing a GSD are: gsDesign (also has a web interface), gsDesign2, and rpact."
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#numerical-comparison",
    -    "href": "Comp/r-sas_logistic-regr.html#numerical-comparison",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "Numerical Comparison",
    -    "text": "Numerical Comparison\nNote that while Firth logistic regression is not required for our example dataset nonetheless we use it for demonstration purposes only.\n\nlogistf in R\n\nBy default, the convergence criteria in logistf specifies that three criteria need to be met at the same time, i.e., the change in log likelihood is less than lconv (default is 1E-5), the maximum absolute element of the score vector is less than gconv (default is 1E-5), and the maximum absolute change in beta is less than xconv (default is 1E-5). In SAS, the default convergence criteria in PROC LOGISTIC specifies relative gradient convergence criterion (GCONV=1E–8); while SAS also support three other convergence criteria but when there are more than one convergence criterion specified, the optimization is terminated as soon as one of the criteria is satisfied. By looking at the R pacakge/SAS documentation, the gconv criteria in logistif function is different from the GCONV in SAS. The lconv criteria is also not exactly the same as the ABSFCONV or FCONV in PROC LOGISTIC in SAS, although the criteria use log likelihood. However, similar convergence criteria might be obtained by using the maximum absolute change in parameter estimates (i.e., xconv in R and SAS). Therefore, for comparison with the SAS output, in logistf function, we use a large convergence criteria value for lconv and gconv to mimic the scenario where only xconv is checked, i.e., specify logistf.control(xconv = 0.00000001, gconv = 1, lconv = 1) for the control argument.\nBy default, logistf function in R computes the confidence interval estimates and hypothesis tests (including p-value) for each parameter based on profile likelihood, which is also reported in the output below. However, Wald method (confidence interval and tests) can be specified by specifying the control argument with pl = FALSE.\n\n\nfirth_mod <- logistf(wt_grp ~ age + sex + ph.ecog + meal.cal,\n                     data=lung2, \n                     control = logistf.control(fit =\"IRLS\", \n                                               xconv = 0.00000001, \n                                               gconv = 1, \n                                               lconv = 1))\nsummary(firth_mod)$coefficients\n\nlogistf(formula = wt_grp ~ age + sex + ph.ecog + meal.cal, data = lung2, \n    control = logistf.control(fit = \"IRLS\", xconv = 1e-08, gconv = 1, \n        lconv = 1))\n\nModel fitted by Penalized ML\nCoefficients:\n                     coef     se(coef)   lower 0.95    upper 0.95     Chisq\n(Intercept)  3.1532937589 1.6031659729  0.051844703  6.410119e+00 3.9726447\nage         -0.0098111679 0.0202315630 -0.050518148  2.974343e-02 0.2337368\nsex         -0.8455619163 0.3632129422 -1.571158740 -1.356810e-01 5.4536777\nph.ecog      0.4018229715 0.2520090355 -0.090278518  9.093255e-01 2.5553004\nmeal.cal    -0.0008495327 0.0004288525 -0.001722033 -7.098976e-06 3.9058205\n                     p method\n(Intercept) 0.04624509      2\nage         0.62876680      2\nsex         0.01952718      2\nph.ecog     0.10992492      2\nmeal.cal    0.04811912      2\n\nMethod: 1-Wald, 2-Profile penalized log-likelihood, 3-None\n\nLikelihood ratio test=10.54964 on 4 df, p=0.03212009, n=170\nWald test = 33.85701 on 4 df, p = 7.972359e-07\n\n\n  (Intercept)           age           sex       ph.ecog      meal.cal \n 3.1532937589 -0.0098111679 -0.8455619163  0.4018229715 -0.0008495327 \n\n## Code below would give Wald CI and tests results by adding `pl = FALSE`\n# logistf(..., pl = FALSE)\n\nNote, function confint gives the profile-likelihood limits. Given the parameters from Firth’s bias-reduced logistic regression is estimated using penalized maximum likelihood, confint function is used. Conditional odds ratio is calculated by taking the exponential of the model parameters.\n\ncbind(est = coef(firth_mod), \n          confint(firth_mod))\n\n                      est    Lower 95%     Upper 95%\n(Intercept)  3.1532937589  0.051844703  6.410119e+00\nage         -0.0098111679 -0.050518148  2.974343e-02\nsex         -0.8455619163 -1.571158740 -1.356810e-01\nph.ecog      0.4018229715 -0.090278518  9.093255e-01\nmeal.cal    -0.0008495327 -0.001722033 -7.098976e-06\n\n\n\n\nPROC LOGISTIC in SAS (with firth option)\n\nNote, by default, SAS computes confidence interval based on Wald tests. Given the parameters from Firth’s method is estimated using penalized maximum likelihood, below specifies CLODDS = PL CLPARM=PL (based on profile likelihood), which is consistent with the maximization method and the R code above. However, the default hypothesis test for the regression coefficients is still a Wald test, and the Chi-square statistics is calculated based on coefficient estimate and its corresponding standard error.\nXCONV specifies relative parameter convergence criterion, which should correspond to the xconv in logistf function in R. We specify XCONV = 0.00000001 so it should be consistent with the R code above.\n\n\nPROC LOGISTIC DATA=LUNG2;\n    MODEL WT_GRP(EVENT=\"weight gain\") = AGE SEX PH_ECOG MEAL_CAL / firth clodds=PL clparm=PL xconv = 0.00000001;\n    ods output ESTIMATEs=estimates;\nrun;\n\nBelow is screenshot of output tables summarizing coefficient estimates and it’s 95% CI\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nConclusion for Firth logistic regression\n\n\n\n\n\nExact match cannot be obtained for all estimates using logistf vs PROC LOGISTIC procedure with Firth option. More specifically:\n- Coefficient estimate and its 95% CI matched at 0.001 level;\n- Standard error are not the same (e.g., 0.02023 for age in R vs 0.02065 in SAS);\n- p-value is not the same (0.6288 in R for age vs 0.6348 in SAS);"
    +    "objectID": "R/gsd-tte.html#design-assumptions",
    +    "href": "R/gsd-tte.html#design-assumptions",
    +    "title": "Group sequential design in R",
    +    "section": "Design assumptions",
    +    "text": "Design assumptions\nUsing a toy example, we will assume that a primary objective of a phase III oncology trial is to compare a new therapy to a control in terms of progression-free survival (PFS) and overall survival (OS). Note that, in this example, we have a family of primary endpoints, i.e., if at least one of the endpoints is successful, the study will be declared a success. A GSD will be utilized for each endpoint. PFS will be tested at one interim analysis (IA) for both efficacy and non-binding futility, while OS will be tested at two IAs for efficacy only. An O’Brien-Fleming spending function will be used for efficacy testing and a Hwang-Shih-Decani spending function with \\(\\gamma = -10\\) will be used for futility.\nFurther design assumptions are as follows:\n\n# PFS HR = 0.6\nhr1_pfs <- 0.6\n# Median PFS of 9.4 months in the control arm\nmed_pfs <- 9.4\n# Median follow-up of 10 months for PFS\nminfu_pfs <- 10\n# Monthly dropout of 0.019 for PFS\ndo_rate_pfs <- 0.019\n# IA timing for PFS is at 75% information fraction\ntiming_pfs <- c(0.75, 1)\n# Power of 95% for PFS\npower_pfs <- 0.95\n\n# OS HR = 0.65\nhr1_os <- 0.65\n# Median OS of 3 years in the control arm\nmed_os <- 12 * 3\n# Median follow-up of 42 months for OS\nminfu_os <- 42\n# Monthly dropout of 0.001 for OS\ndo_rate_os <- 0.001\n# IA timing for OS is at 60% and 80% information fraction\ntiming_os <- c(0.6, 0.8, 1)\n# Power of 82% for OS\npower_os <- 0.82\n\n# Enrollment period of 24 months\nenroll_dur <- 24\n# 1:1 randomization ratio\nrand_ratio <- 1\n# alpha level of 1.25% for each endpoint\nalphal <- 0.0125\n\nWe assume that given the above assumptions, we need to calculate the target number of events for each analysis as well as the total sample size."
       },
       {
    -    "objectID": "Comp/r-sas_logistic-regr.html#numerical-comparison-1",
    -    "href": "Comp/r-sas_logistic-regr.html#numerical-comparison-1",
    -    "title": "R vs SAS: Logistic Regression",
    -    "section": "Numerical Comparison",
    -    "text": "Numerical Comparison\n\nget_marginal_effect in R\nWe fit a logistic regression model with covariate adjustment to estimate the marginal treatment effect using the delta method for variance estimation: as outlined in Ge et al (2011).\n\n## fit the model including model based variance estimation with delta method\nfit1 <-\n  glm(aval ~ trtp + bl_cov, family = \"binomial\", data = trial01) %>% \n  get_marginal_effect(\n    trt = \"trtp\",\n    method = \"Ge\",\n    contrast = \"diff\",\n    reference = \"0\",\n    type = \"model-based\"\n  )\ncat(\"Marginal treatment effect = \", fit1$marginal_est, \"\\n\",\n    \"Standard error = \", fit1$marginal_se, \"\\n\"\n    )\n\nMarginal treatment effect =  -0.06836399 \n Standard error =  0.06071641 \n\n\n\n\n%Margins macro in SAS\nWe now use the SAS [%Margins] (https://support.sas.com/kb/63/038.html) macro to perform the Ge et al. (2011) method on trial01 to estimate the marginal risk difference and it’s standard error.\n\n%Margins(data      = myWork.trial01,\n         class     = trtp,\n         classgref = first, /*Set reference to first level*/\n         response  = avaln,\n         roptions  = event='1', /*Ensure event is set to 1 = Yes */\n         dist      = binomial,  \n         model     = trtp bl_cov,\n         margins   = trtp, \n         options   = cl diff reverse, /*Specify risk difference contrast and \n                                      direction of treatment effect is correct*/\n         link      = logit);  /*Specify logit link function */\n    \n** Store output data sets ; \ndata myWork.margins_trt_estimates;\n  set work._MARGINS;\nrun;\n         \ndata myWork.margins_trt_diffs;\n  set work._DIFFSPM;\nrun;\n\n\n\n\n\n\n\n\n%LR macro in SAS (Ge et al, 2011)\n\n%LR(data = myWork.trial01, /* input data set */\n    var1 = bl_cov, /* continuous covariates in the logistic regression */\n    var2 = trtp, /* categorical covariates in the logistic regression */\n    p1 = 1, /* number of continuous covariates in the logistic regression */\n    p2 = 1, /* number of categorical covariates in the logistic regression */\n    resp = avaln, /* binary response variable in the logistic regression */\n    ntrt = 1); /* position of the treatment variable in the categorical covariates */\n    \ndata myWork.ge_macro_trt_diffs;\n  set work.geout;\nrun;\n\n\n\n\n\n\n\n\n\n\n\n\nConclusion for g-computation with covariate adjustment\n\n\n\n\n\nExact match at the 0.001 level."
    +    "objectID": "R/gsd-tte.html#example-code",
    +    "href": "R/gsd-tte.html#example-code",
    +    "title": "Group sequential design in R",
    +    "section": "Example code",
    +    "text": "Example code\n\nExample using gsDesign\n\nPFS calculations:\n\n\nlibrary(gsDesign)\n\n\npfs_gsDesign <- gsSurv(\n  k = length(timing_pfs),\n  timing = timing_pfs,\n  R = enroll_dur,\n  eta = do_rate_pfs,\n  minfup = minfu_pfs,\n  T = enroll_dur + minfu_pfs,\n  lambdaC = log(2) / med_pfs,\n  hr = hr1_pfs,\n  beta = 1 - power_pfs,\n  alpha = alphal,\n  sfu = sfLDOF,\n  sfl = sfHSD,\n  sflpar = -10,\n  test.type = 4\n)\n\npfs_gsDesign |> gsBoundSummary()\n\n    Analysis              Value Efficacy Futility\n   IA 1: 75%                  Z   2.6584   0.7432\n      N: 398        p (1-sided)   0.0039   0.2287\n Events: 176       ~HR at bound   0.6693   0.8938\n   Month: 25   P(Cross) if HR=1   0.0039   0.7713\n             P(Cross) if HR=0.6   0.7668   0.0041\n       Final                  Z   2.2801   2.2801\n      N: 398        p (1-sided)   0.0113   0.0113\n Events: 234       ~HR at bound   0.7421   0.7421\n   Month: 34   P(Cross) if HR=1   0.0125   0.9875\n             P(Cross) if HR=0.6   0.9500   0.0500\n\n\n\nOS calculations:\n\n\nos_gsDesign <- gsSurv(\n  k = length(timing_os),\n  timing = timing_os,\n  R = enroll_dur,\n  eta = do_rate_os,\n  minfup = minfu_os,\n  T = enroll_dur + minfu_os,\n  lambdaC = log(2) / med_os,\n  hr = hr1_os,\n  beta = 1 - power_os,\n  alpha = alphal,\n  sfu = sfLDOF,\n  test.type = 1\n)\n\nos_gsDesign |> gsBoundSummary()\n\n    Analysis               Value Efficacy\n   IA 1: 60%                   Z   3.0205\n      N: 394         p (1-sided)   0.0013\n Events: 131        ~HR at bound   0.5896\n   Month: 38    P(Cross) if HR=1   0.0013\n             P(Cross) if HR=0.65   0.2899\n   IA 2: 80%                   Z   2.5874\n      N: 394         p (1-sided)   0.0048\n Events: 175        ~HR at bound   0.6758\n   Month: 51    P(Cross) if HR=1   0.0052\n             P(Cross) if HR=0.65   0.6082\n       Final                   Z   2.2958\n      N: 394         p (1-sided)   0.0108\n Events: 218        ~HR at bound   0.7327\n   Month: 66    P(Cross) if HR=1   0.0125\n             P(Cross) if HR=0.65   0.8200\n\n\n\n\nExample using gsDesign2\n\nPFS calculations:\n\n\nlibrary(gsDesign2)\nlibrary(tibble)\n\n\nenroll_rate <- tibble(\n  stratum = \"All\",\n  duration = enroll_dur,\n  rate = 1\n)\nfail_rate_pfs <- tibble(\n  stratum = \"All\",\n  duration = Inf, # Can be set to `Inf` when proportional hazard is assumed\n  fail_rate = log(2) / med_pfs,\n  hr = hr1_pfs,\n  dropout_rate = do_rate_pfs\n)\n\npfs_gsDesign2 <- gs_design_ahr(\n  enroll_rate = enroll_rate,\n  fail_rate = fail_rate_pfs,\n  ratio = rand_ratio,\n  beta = 1 - power_pfs,\n  alpha = alphal,\n  info_frac = timing_pfs,\n  analysis_time = enroll_dur + minfu_pfs,\n  upper = gs_spending_bound,\n  upar = list(\n    sf = gsDesign::sfLDOF,\n    total_spend = alphal\n  ),\n  lower = gs_spending_bound,\n  lpar = list(\n    sf = gsDesign::sfHSD,\n    total_spend = 1 - power_pfs,\n    param = -10\n  ),\n  info_scale = \"h0_info\"\n)\n\npfs_gsDesign2 |>\n  summary() |>\n  as_gt()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nBound summary for AHR design\n\n\nAHR approximations of ~HR at bound\n\n\nBound\nZ\nNominal p1\n~HR at bound2\n\nCumulative boundary crossing probability\n\n\n\nAlternate hypothesis\nNull hypothesis\n\n\n\n\nAnalysis: 1 Time: 25.3 N: 405.8 Event: 179.2 AHR: 0.6 Information fraction: 0.75\n\n\nFutility\n0.74\n0.2287\n0.8940\n0.0041\n0.7713\n\n\nEfficacy\n2.66\n0.0039\n0.6697\n0.7668\n0.0039\n\n\nAnalysis: 2 Time: 34 N: 405.8 Event: 238.9 AHR: 0.6 Information fraction: 1\n\n\nFutility\n2.28\n0.0113\n0.7424\n0.0500\n0.9875\n\n\nEfficacy\n2.28\n0.0113\n0.7424\n0.9500\n3 0.0125\n\n\n\n1 One-sided p-value for experimental vs control treatment. Value < 0.5 favors experimental, > 0.5 favors control.\n\n\n2 Approximate hazard ratio to cross bound.\n\n\n3 Cumulative alpha for final analysis (0.0125) is less than the full alpha (0.025) when the futility bound is non-binding. The smaller value subtracts the probability of crossing a futility bound before crossing an efficacy bound at a later analysis (0.025 - 0.0125 = 0.0125) under the null hypothesis.\n\n\n\n\n\n\n\n\n\nOS calculations:\n\n\nfail_rate_os <- tibble(\n  stratum = \"All\",\n  duration = Inf, # Can be set to `Inf` when proportional hazard is assumed\n  fail_rate = log(2) / med_os,\n  hr = hr1_os,\n  dropout_rate = do_rate_os\n)\n\nos_gsDesign2 <- gs_design_ahr(\n  enroll_rate = pfs_gsDesign2$enroll_rate,\n  fail_rate = fail_rate_os,\n  ratio = rand_ratio,\n  beta = 1 - power_os,\n  alpha = alphal,\n  info_frac = timing_os,\n  analysis_time = enroll_dur + minfu_os,\n  test_lower = FALSE,\n  upper = gs_spending_bound,\n  upar = list(\n    sf = gsDesign::sfLDOF,\n    total_spend = alphal\n  ),\n  info_scale = \"h0_info\"\n)\n\nos_gsDesign2 |>\n  summary() |>\n  as_gt()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nBound summary for AHR design\n\n\nAHR approximations of ~HR at bound\n\n\nBound\nZ\nNominal p1\n~HR at bound2\n\nCumulative boundary crossing probability\n\n\n\nAlternate hypothesis\nNull hypothesis\n\n\n\n\nAnalysis: 1 Time: 38.4 N: 402.6 Event: 133.7 AHR: 0.65 Information fraction: 0.6\n\n\nEfficacy\n3.02\n0.0013\n0.5901\n0.2899\n0.0013\n\n\nAnalysis: 2 Time: 50.6 N: 402.6 Event: 178.2 AHR: 0.65 Information fraction: 0.8\n\n\nEfficacy\n2.59\n0.0048\n0.6762\n0.6082\n0.0052\n\n\nAnalysis: 3 Time: 66 N: 402.6 Event: 222.8 AHR: 0.65 Information fraction: 1\n\n\nEfficacy\n2.30\n0.0108\n0.7330\n0.8200\n3 0.0125\n\n\n\n1 One-sided p-value for experimental vs control treatment. Value < 0.5 favors experimental, > 0.5 favors control.\n\n\n2 Approximate hazard ratio to cross bound.\n\n\n3 Cumulative alpha for final analysis (0.0125) is less than the full alpha (0.025) when the futility bound is non-binding. The smaller value subtracts the probability of crossing a futility bound before crossing an efficacy bound at a later analysis (0.025 - 0.0125 = 0.0125) under the null hypothesis.\n\n\n\n\n\n\n\n\n\n\nExample using rpact\n\nPFS calculations:\n\n\nlibrary(rpact)\n\n\npfs_rpact_gsd <- getDesignGroupSequential(\n  sided = 1,\n  alpha = alphal,\n  informationRates = timing_pfs,\n  typeOfDesign = \"asOF\",\n  beta = 1 - power_pfs,\n  typeBetaSpending = \"bsHSD\",\n  gammaB = -10,\n  bindingFutility = FALSE\n)\n\npfs_rpact <- getSampleSizeSurvival(\n  design = pfs_rpact_gsd,\n  accrualTime = enroll_dur,\n  followUpTime = minfu_pfs,\n  lambda2 = log(2) / med_pfs,\n  hazardRatio = hr1_pfs,\n  dropoutRate1 = 0.2,\n  dropoutRate2 = 0.2,\n  dropoutTime = 12\n)\n\nkable(summary(pfs_rpact))\n\nWarning in kable.ParameterSet(summary(pfs_rpact)): Manual use of kable() for\nrpact result objects is no longer needed, as the formatting and display will be\nhandled automatically by the rpact package\n\n\nSample size calculation for a survival endpoint\nSequential analysis with a maximum of 2 looks (group sequential design), one-sided overall significance level 1.25%, power 95%. The results were calculated for a two-sample logrank test, H0: hazard ratio = 1, H1: hazard ratio = 0.6, control lambda(2) = 0.074, accrual time = 24, accrual intensity = 16.5, follow-up time = 10, dropout rate(1) = 0.2, dropout rate(2) = 0.2, dropout time = 12.\n\n\n\nStage\n1\n2\n\n\n\n\nPlanned information rate\n75%\n100%\n\n\nCumulative alpha spent\n0.0039\n0.0125\n\n\nCumulative beta spent\n0.0041\n0.0500\n\n\nStage levels (one-sided)\n0.0039\n0.0113\n\n\nEfficacy boundary (z-value scale)\n2.658\n2.280\n\n\nFutility boundary (z-value scale)\n0.743\n\n\n\nEfficacy boundary (t)\n0.670\n0.742\n\n\nFutility boundary (t)\n0.894\n\n\n\nCumulative power\n0.7668\n0.9500\n\n\nNumber of subjects\n396.9\n396.9\n\n\nExpected number of subjects under H1\n\n396.9\n\n\nCumulative number of events\n175.8\n234.4\n\n\nExpected number of events under H1\n189.2\n\n\n\nAnalysis time\n25.36\n34.00\n\n\nExpected study duration under H1\n\n27.34\n\n\nOverall exit probability (under H0)\n0.7752\n\n\n\nOverall exit probability (under H1)\n0.7709\n\n\n\nExit probability for efficacy (under H0)\n0.0039\n\n\n\nExit probability for efficacy (under H1)\n0.7668\n\n\n\nExit probability for futility (under H0)\n0.7713\n\n\n\nExit probability for futility (under H1)\n0.0041\n\n\n\n\nLegend:\n\n(t): treatment effect scale\n\n\n\nNote: the dropoutRate1, dropoutRate2 arguments in getSampleSizeSurvival() refer to the % of drop-outs by the dropoutTime, while the eta argument in gsDesign::gsSurv() and the dropout_rate value in the fail_rate argument in gsDesign2::gs_design_ahr() refer to the annual drop-out rate parameter under the exponential distribution. In our example, if \\(X\\) is a drop-out time and \\(X \\sim \\text{Exponential} (\\lambda)\\), we assume that by month 12 the drop-out rate was 20%, which implies: \\(P(X\\le12) = 1 - e^{-12\\lambda} = 0.2 \\Rightarrow \\lambda = 0.019\\). Due to the above differences, the value \\(\\lambda = 0.019\\) was used in the gsDesign and gsDesign2 example, while 0.2 was used in the rpact example.\n\nOS calculations:\n\n\nos_rpact_gsd <- getDesignGroupSequential(\n  sided = 1,\n  alpha = alphal,\n  informationRates = timing_os,\n  typeOfDesign = \"asOF\",\n  beta = 1 - power_os\n)\n\nos_rpact <- getSampleSizeSurvival(\n  design = os_rpact_gsd,\n  accrualTime = enroll_dur,\n  followUpTime = minfu_os,\n  lambda2 = log(2) / med_os,\n  hazardRatio = hr1_os,\n  dropoutRate1 = 1 - exp(-do_rate_os * 12),\n  dropoutRate2 = 1 - exp(-do_rate_os * 12),\n  dropoutTime = 12\n)\n\nkable(summary(os_rpact))\n\nSample size calculation for a survival endpoint\nSequential analysis with a maximum of 3 looks (group sequential design), one-sided overall significance level 1.25%, power 82%. The results were calculated for a two-sample logrank test, H0: hazard ratio = 1, H1: hazard ratio = 0.65, control lambda(2) = 0.019, accrual time = 24, accrual intensity = 16.5, follow-up time = 42, dropout rate(1) = 0.012, dropout rate(2) = 0.012, dropout time = 12.\n\n\n\nStage\n1\n2\n3\n\n\n\n\nPlanned information rate\n60%\n80%\n100%\n\n\nCumulative alpha spent\n0.0013\n0.0052\n0.0125\n\n\nStage levels (one-sided)\n0.0013\n0.0048\n0.0108\n\n\nEfficacy boundary (z-value scale)\n3.020\n2.587\n2.296\n\n\nEfficacy boundary (t)\n0.590\n0.676\n0.733\n\n\nCumulative power\n0.2899\n0.6082\n0.8200\n\n\nNumber of subjects\n395.1\n395.1\n395.1\n\n\nExpected number of subjects under H1\n\n\n395.1\n\n\nCumulative number of events\n131.2\n174.9\n218.6\n\n\nExpected number of events under H1\n179.4\n\n\n\n\nAnalysis time\n38.44\n50.60\n66.00\n\n\nExpected study duration under H1\n\n\n53.11\n\n\nExit probability for efficacy (under H0)\n0.0013\n0.0040\n\n\n\nExit probability for efficacy (under H1)\n0.2899\n0.3182\n\n\n\n\nLegend:\n\n(t): treatment effect scale"
       },
       {
    -    "objectID": "python/Rounding.html",
    -    "href": "python/Rounding.html",
    -    "title": "Rounding in Python",
    +    "objectID": "R/wilcoxonsr_hodges_lehman.html",
    +    "href": "R/wilcoxonsr_hodges_lehman.html",
    +    "title": "Wilcoxon signed-rank test",
         "section": "",
    -    "text": "Python has a built-in round() function that takes two numeric arguments, number and ndigits, and returns a floating point number that is a rounded version of the number up to the specified number of decimals.\nThe default number of decimal is 0, meaning that the function will return the nearest integer.\n\n# For integers\nx= 12\nprint(round(x))\n \n# For floating point\nx= 12.3\nprint(round(22.7))  \n \n# if the second parameter is present\n \n# when the (ndigit+1)th digit is =5 \nx=4.465\nprint(round(x, 2)) \n   \n# when the (ndigit+1)th digit is >=5 \nx=4.476\nprint(round(x, 2))   \n   \n# when the (ndigit+1)th digit is <5 \nx=4.473\nprint(round(x, 2))\n\n12\n23\n4.46\n4.48\n4.47"
    +    "text": "Introduction\nWilcoxon signed-rank test is a non-parametric test which is sometimes used instead of the paired Student’s t-test when assumptions regarding a normal distribution are not valid. It is a rank test, designed for analyzing repeated measures or paired observations by a paired comparison (a type of location test) to assess whether their population means differ. Whilst it does not ‘compare’ means or medians for a set of paired data, it ranks the results on A and ranks the results on B, then compares if Prob(A>B) > Prob(B>A).\nTies are when you have two observations with the same result. For example, in a 2-period cross-over study, you take the difference between result on Treatment A minus result on Treatment B and find that two or more subjects have the same difference.\nAdditionally, “0s” can cause some trouble as well. For example when the difference between result on Treatment A minus result on Treatment B equals 0.\n\n\nData\nAnalysis will be conducted on the example of anonymized data from 2-period, cross-over study comparing treatments A and B in patients with asthma and acute airway obstruction induced by repeated mannitol challenges.\nWilcoxon signed rank test was applied to analyse the time to return to baseline FEV1 post-mannitol challenge 2. Median difference, p value and 95% CI were provided using the Hodges-Lehmann estimate.\n\nhead(blood_p)\n\n  patient  sex agegrp bp_before bp_after\n1       1 Male  30-45   143.670  153.316\n2       2 Male  30-45   163.082  170.576\n3       3 Male  30-45   153.393  168.599\n4       4 Male  30-45   153.082  142.358\n5       5 Male  30-45   146.720  141.193\n6       6 Male  30-45   150.668  147.204\n\n\n\n\nDataset without ties\nLet’s consider a case where the dataset has no ties.\n\n\nAvailable packages\nIn R Wilcoxon signed rank test can be performed using for example DOS (version 0.5.2) or stats (version 3.6.2) package.\n\nstats\nFunction wilcox.test used for Wilcoxon Rank Sum and Signed Rank Tests will be applied. For more information about that function go here\nWe will focus on the below arguments: - alternative - paired - exact - correct - conf.int.\n\n\n\nExamples\n\n# Exact \nstats::wilcox.test(x = blood_p$bp_after, y = blood_p$bp_before, \n                                   paired = TRUE, \n                                   conf.int = TRUE, \n                                   conf.level = 0.9, \n                                   alterative = \"two.sided\", \n                                   exact = TRUE)\n\n\n    Wilcoxon signed rank exact test\n\ndata:  blood_p$bp_after and blood_p$bp_before\nV = 17251, p-value = 0.009379\nalternative hypothesis: true location shift is not equal to 0\n90 percent confidence interval:\n 1.5045 5.9945\nsample estimates:\n(pseudo)median \n       3.68875 \n\n# No exact & continuity correction\nstats::wilcox.test(x = blood_p$bp_after, y = blood_p$bp_before, \n                                   paired = TRUE, \n                                   conf.int = TRUE, \n                                   conf.level = 0.9, \n                                   alterative = \"two.sided\", \n                                   exact = FALSE, \n                                   correct = TRUE)\n\n\n    Wilcoxon signed rank test with continuity correction\n\ndata:  blood_p$bp_after and blood_p$bp_before\nV = 17251, p-value = 0.009548\nalternative hypothesis: true location shift is not equal to 0\n90 percent confidence interval:\n 1.504565 5.994467\nsample estimates:\n(pseudo)median \n      3.688796 \n\n# No exact & No continuity correction\nstats::wilcox.test(x = blood_p$bp_after, y = blood_p$bp_before, \n                                     paired = TRUE, \n                                     conf.int = TRUE, \n                                     conf.level = 0.9, \n                                     alterative = \"two.sided\" , \n                                     exact = FALSE, \n                                     correct = FALSE)\n\n\n    Wilcoxon signed rank test\n\ndata:  blood_p$bp_after and blood_p$bp_before\nV = 17251, p-value = 0.009535\nalternative hypothesis: true location shift is not equal to 0\n90 percent confidence interval:\n 1.504991 5.993011\nsample estimates:\n(pseudo)median \n      3.688796 \n\n\n\n\nImportant notes on stats:wilcox.test\n\nBy default an exact p-value is computed if the samples size is less than 50 and there are no ties. Otherwise, a normal approximation is used.\nIf exact p-values are available, an exact confidence interval is obtained by the algorithm described in Bauer (1972), and the Hodges-Lehmann estimator is employed. Otherwise, the returned confidence interval and point estimate are based on normal approximations.\nIf non-exact p-value is calculated, continuity correction in the normal approximation for the p-value can be applied with correct argument.\nStatistic V is provided, which is a test statistic based on Sprent (1993) algorithm\n\n\nDOS2\nFunction senWilcox used for Sensitivity Analysis for Wilcoxon’s Signed-rank Statistic will be applied. For more information about that function go here\n\n\n\nExamples\n\nDOS2::senWilcox(blood_p$bp_after - blood_p$bp_before, \n                   gamma = 1, \n                   conf.int = TRUE, \n                   alpha = 0.1, \n                   alternative = \"twosided\")\n\n$pval\n[1] 0.009534732\n\n$estimate\n     low     high \n3.688796 3.688796 \n\n$ci\n    low    high \n1.50494 5.99305 \n\n\n\n\nImportant notes on DOS2:senWilcox\n\nGamma >= 1 is the value of the sensitivity parameter. If gamma=1, then you are assuming ignorable treatment assignment or equivalently no unmeasured confounding - that is the considered scenario in our example, sensitivity analysis is not performed.\nOnly p value, estimate and CI are provided\n\n\n\nCoin package - coming soon!"
       },
       {
    -    "objectID": "python/linear_regression.html",
    -    "href": "python/linear_regression.html",
    -    "title": "Linear Regression",
    +    "objectID": "R/survival_cif.html",
    +    "href": "R/survival_cif.html",
    +    "title": "Estimating Cumulative Incidence Functions Using R",
         "section": "",
    -    "text": "To demonstrate the use of linear regression we examine a dataset that illustrates the relationship between Height and Weight in a group of 237 teen-aged boys and girls. The dataset is available here and is imported to the workspace.\n\nDescriptive Statistics\nThe first step is to obtain the simple descriptive statistics for the numeric variables of htwt data, and one-way frequencies for categorical variables. This is accomplished by employing summary function. There are 237 participants who are from 13.9 to 25 years old. It is a cross-sectional study, with each participant having one observation. We can use this data set to examine the relationship of participants’ height to their age and sex.\n\nimport pandas as pd\nimport statsmodels.api as sm\n\n# Importing CSV\nhtwt = pd.read_csv(\"../data/htwt.csv\")\n\nIn order to create a regression model to demonstrate the relationship between age and height for females, we first need to create a flag variable identifying females and an interaction variable between age and female gender flag.\n\nhtwt['female'] = (htwt['SEX'] == 'f').astype(int)\nhtwt['fem_age'] = htwt['AGE'] * htwt['female']\nhtwt.head()\n\n\n\n\n\n\n\n\nROW\nSEX\nAGE\nHEIGHT\nWEIGHT\nfemale\nfem_age\n\n\n\n\n0\n1\nf\n14.3\n56.3\n85.0\n1\n14.3\n\n\n1\n2\nf\n15.5\n62.3\n105.0\n1\n15.5\n\n\n2\n3\nf\n15.3\n63.3\n108.0\n1\n15.3\n\n\n3\n4\nf\n16.1\n59.0\n92.0\n1\n16.1\n\n\n4\n5\nf\n19.1\n62.5\n112.5\n1\n19.1\n\n\n\n\n\n\n\n\n\nRegression Analysis\nNext, we fit a regression model, representing the relationships between gender, age, height and the interaction variable created in the datastep above. We again use a where statement to restrict the analysis to those who are less than or equal to 19 years old. We use the clb option to get a 95% confidence interval for each of the parameters in the model. The model that we are fitting is height = b0 + b1 x female + b2 x age + b3 x fem_age + e\n\nX = htwt[['female', 'AGE', 'fem_age']][htwt['AGE'] <= 19]\nX = sm.add_constant(X)\nY = htwt['HEIGHT'][htwt['AGE'] <= 19]\n\nmodel = sm.OLS(Y, X).fit()\n\nmodel.summary()\n\n\nOLS Regression Results\n\n\nDep. Variable:\nHEIGHT\nR-squared:\n0.460\n\n\nModel:\nOLS\nAdj. R-squared:\n0.452\n\n\nMethod:\nLeast Squares\nF-statistic:\n60.93\n\n\nDate:\nThu, 10 Oct 2024\nProb (F-statistic):\n1.50e-28\n\n\nTime:\n16:52:29\nLog-Likelihood:\n-534.17\n\n\nNo. Observations:\n219\nAIC:\n1076.\n\n\nDf Residuals:\n215\nBIC:\n1090.\n\n\nDf Model:\n3\n\n\n\n\nCovariance Type:\nnonrobust\n\n\n\n\n\n\n\n\n\n\n\ncoef\nstd err\nt\nP>|t|\n[0.025\n0.975]\n\n\nconst\n28.8828\n2.873\n10.052\n0.000\n23.219\n34.547\n\n\nfemale\n13.6123\n4.019\n3.387\n0.001\n5.690\n21.534\n\n\nAGE\n2.0313\n0.178\n11.435\n0.000\n1.681\n2.381\n\n\nfem_age\n-0.9294\n0.248\n-3.750\n0.000\n-1.418\n-0.441\n\n\n\n\n\n\n\n\nOmnibus:\n1.300\nDurbin-Watson:\n2.284\n\n\nProb(Omnibus):\n0.522\nJarque-Bera (JB):\n0.981\n\n\nSkew:\n-0.133\nProb(JB):\n0.612\n\n\nKurtosis:\n3.191\nCond. No.\n450.\n\n\n\nNotes:[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n\n\nFrom the coefficients table b0,b1,b2,b3 are estimated as b0=28.88 b1=13.61 b2=2.03 b3=-0.92942\nThe resulting regression model for height, age and gender based on the available data is height=28.8828 + 13.6123 x female + 2.0313 x age -0.9294 x fem_age"
    +    "text": "In this document we present how to estimate the cumulative incidence function (CIF) in R. We focus on the competing risks model where each subject experiences only one out of k possible events as depicted in the figure below."
       },
       {
    -    "objectID": "python/two_samples_t_test.html",
    -    "href": "python/two_samples_t_test.html",
    -    "title": "Two Sample t-test",
    +    "objectID": "R/survival_cif.html#objective",
    +    "href": "R/survival_cif.html#objective",
    +    "title": "Estimating Cumulative Incidence Functions Using R",
         "section": "",
    -    "text": "The Two Sample t-test is used to compare two independent samples against each other. In the Two Sample t-test, the mean of the first sample is compared against the mean of the second sample. In Python, a Two Sample t-test can be performed using the stats package from scipy.\n\n\nThe following data was used in this example.\n\nimport pandas as pd\nimport numpy as np\nfrom scipy import stats\n\n# Create sample data\ndata = {\n    'trt_grp': ['placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment'],\n    'WtGain': [94, 12, 26, 89, 88, 96, 85, 130, 75, 54, 112, 69, 104, 95, 53, 21, 45, 62, 96, 128, 120, 99, 28, 50, 109, 115, 39, 96, 87, 100, 76, 80]\n}\n\ndf = pd.DataFrame(data)\n\n\n\n\nIf we have normalized data, we can use the classic Student’s t-test. For a Two sample test where the variances are not equal, we should use the Welch’s t-test. Both of those options are available in the scipy stats package.\n\n\n\n\nThe following code was used to test the comparison in Python. Note that we must separate the single variable into two variables to satisfy the scipy stats package syntax.\n\n# Separate data into two groups\ngroup1 = df[df['trt_grp'] == 'placebo']['WtGain']\ngroup2 = df[df['trt_grp'] == 'treatment']['WtGain']\n\n# Perform Student's t-test assuming equal variances\nt_stat, p_value_equal_var = stats.ttest_ind(group1, group2, equal_var=True)\n\nprint(\"Student's T-Test assuming equal variances:\")\nprint(f\"T-statistic: {t_stat}\")\nprint(f\"P-value: {p_value_equal_var}\")\n\nStudent's T-Test assuming equal variances:\nT-statistic: -0.6969002027708538\nP-value: 0.4912306166204561\n\n\n\n\n\n\n\n\nThe following code was used to test the comparison in Python using Welch’s t-test.\n\n# Perform Welch's t-test assuming unequal variances\nt_stat_welch, p_value_unequal_var = stats.ttest_ind(group1, group2, equal_var=False)\n\nprint(\"\\nWelch's T-Test assuming unequal variances:\")\nprint(f\"T-statistic: {t_stat_welch}\")\nprint(f\"P-value: {p_value_unequal_var}\")\n\n\nWelch's T-Test assuming unequal variances:\nT-statistic: -0.6969002027708538\nP-value: 0.4912856152047901"
    +    "text": "In this document we present how to estimate the cumulative incidence function (CIF) in R. We focus on the competing risks model where each subject experiences only one out of k possible events as depicted in the figure below."
       },
       {
    -    "objectID": "python/two_samples_t_test.html#python",
    -    "href": "python/two_samples_t_test.html#python",
    -    "title": "Two Sample t-test",
    -    "section": "",
    -    "text": "If we have normalized data, we can use the classic Student’s t-test. For a Two sample test where the variances are not equal, we should use the Welch’s t-test. Both of those options are available in the scipy stats package.\n\n\n\n\nThe following code was used to test the comparison in Python. Note that we must separate the single variable into two variables to satisfy the scipy stats package syntax.\n\n# Separate data into two groups\ngroup1 = df[df['trt_grp'] == 'placebo']['WtGain']\ngroup2 = df[df['trt_grp'] == 'treatment']['WtGain']\n\n# Perform Student's t-test assuming equal variances\nt_stat, p_value_equal_var = stats.ttest_ind(group1, group2, equal_var=True)\n\nprint(\"Student's T-Test assuming equal variances:\")\nprint(f\"T-statistic: {t_stat}\")\nprint(f\"P-value: {p_value_equal_var}\")\n\nStudent's T-Test assuming equal variances:\nT-statistic: -0.6969002027708538\nP-value: 0.4912306166204561\n\n\n\n\n\n\n\n\nThe following code was used to test the comparison in Python using Welch’s t-test.\n\n# Perform Welch's t-test assuming unequal variances\nt_stat_welch, p_value_unequal_var = stats.ttest_ind(group1, group2, equal_var=False)\n\nprint(\"\\nWelch's T-Test assuming unequal variances:\")\nprint(f\"T-statistic: {t_stat_welch}\")\nprint(f\"P-value: {p_value_unequal_var}\")\n\n\nWelch's T-Test assuming unequal variances:\nT-statistic: -0.6969002027708538\nP-value: 0.4912856152047901"
    +    "objectID": "R/survival_cif.html#r-packages",
    +    "href": "R/survival_cif.html#r-packages",
    +    "title": "Estimating Cumulative Incidence Functions Using R",
    +    "section": "R Packages",
    +    "text": "R Packages\nWe identify three packages:\n\ncmprsk\ntidycmprsk\nsurvival\n\nThe cmprsk package implements the methods described in Gray (1988) for testing CIFs across different groups. The tidycmprsk package is a wrapper for cmprsk. It uses syntax similar to other survival analysis packages, and returns survival objects. In this document, we illustrate how to use the tidycmprsk package for estimating and testing CIFs. More details and other functionalities can be found here.\nThe survival package is a general purpose survival analysis package. Its scope is far beyond the competing risks model. We will demonstrate how to estimate the CIFs using this package.\n\nData used\nThe bone marrow transplant (BTM) dataset as presented by Guo & So (2018) is used. The dataset has the following variables:\n\nGroup has three levels, indicating three disease groups: ALL, AML-Low Risk, AML-High Risk.\nT is the disease-free survival time in days. A derived variable TYears = T/365.25 is used in the analysis.\nStatus has value 0 if T is censored; 1 if T is time to relapse; 2 if T is time to death.\nWaitTime is the waiting time to transplant in days. This variable is not used here.\nA new variable ID is created.\n\n\nrequire(dplyr)\nbmt <- haven::read_sas(file.path(\"../data/bmt.sas7bdat\")) %>%\n  mutate(\n    Group = factor(Group, \n                   levels = c(1, 2, 3), \n                   labels = c('ALL', 'AML-Low Risk', 'AML-High Risk')\n    ),\n    Status = factor(Status,\n                    levels = c(0, 1, 2),\n                    labels = c('Censored', 'Relapse', 'Death')),\n    TYears = T / 365.25,\n    ID = row_number()\n  )"
       },
       {
    -    "objectID": "python/survey-stats-summary.html",
    -    "href": "python/survey-stats-summary.html",
    -    "title": "Survey Summary Statistics using Python",
    +    "objectID": "R/survival_cif.html#estimating-cifs",
    +    "href": "R/survival_cif.html#estimating-cifs",
    +    "title": "Estimating Cumulative Incidence Functions Using R",
    +    "section": "Estimating CIFs",
    +    "text": "Estimating CIFs\n\nThe tidycmprsk Package\n\nCIF Estimates and Gray’s Test\nThe tidycmprsk::cuminc() function requires a Surv object. Therefore, the first level of the event status variable (in this example Status) must represent censoring.\n\nrequire(survival)\nrequire(tidycmprsk)\nrequire(tidyverse)\ncif.1 <- cuminc(Surv(TYears, Status) ~ Group, data = bmt) \n\nGray’s test statistics and p-value:\n\nknitr::kable(\n  glance(cif.1) %>% \n  pivot_longer(\n    everything(),\n    names_to = c(\".value\", \"outcome_id\"),\n    names_pattern = \"(.*)_(.*)\"\n  )\n)\n\n\n\n\noutcome_id\noutcome\nstatistic\ndf\np.value\n\n\n\n\n1\nRelapse\n11.9228820\n2\n0.0025762\n\n\n2\nDeath\n0.1374108\n2\n0.9336017\n\n\n\n\n\nCIF estimates for time to relapse at selected timepoints for ‘AML-Low Risk’ patients:\n\nknitr::kable(\n  cif.1 %>% \n  tidy(times = c(0.5, 1, 1.5, 2, 3)) %>%\n  select(time, outcome, strata, estimate, std.error, conf.low, conf.high) %>% \n  filter(outcome == 'Relapse' & strata == 'AML-Low Risk') %>%\n  mutate(time = as.character(time),\n         across(where(is.numeric), ~ num(., digits = 4))\n  )\n)\n\n\n\n\ntime\noutcome\nstrata\nestimate\nstd.error\nconf.low\nconf.high\n\n\n\n\n0.5\nRelapse\nAML-Low Risk\n0.0000\n0.0000\nNA\nNA\n\n\n1\nRelapse\nAML-Low Risk\n0.0741\n0.0360\n0.0234\n0.1646\n\n\n1.5\nRelapse\nAML-Low Risk\n0.1296\n0.0463\n0.0563\n0.2344\n\n\n2\nRelapse\nAML-Low Risk\n0.1481\n0.0489\n0.0685\n0.2565\n\n\n3\nRelapse\nAML-Low Risk\n0.1667\n0.0514\n0.0813\n0.2783\n\n\n\n\n\nTwo points to note:\n\nThe current version of cmprsk, and hence tidycmprsk, estimates the variance of the CIF estimates asymptotically as in Aalen (1978). There is no option to change it to other methods.\ntidycmprsk::cuminc() offers pointwise CIs for the CIF estimates using the log-log transforms. There is no other options.\n\n\n\nCIF Plots\n\nrequire(ggsurvfit)\ncif.1 %>%\n  ggcuminc(outcome = 'Death') +\n  ## add_confidence_interval() +\n  add_risktable() +\n  xlab('Time (years) to death')\n\n\n\n\n\n\n\ncif.1 %>%\n  ggcuminc(outcome = 'Relapse') +\n  ## add_confidence_interval() +\n  add_risktable() +\n  xlab('Time (years) to relapse')\n\n\n\n\n\n\n\n\n\n\n\nThe survival Package\n\nCIF Estimates\nUsing the bone marrow transplant example, the following code shows how to estimate the CIF for time to relapse or to death:\n\ncif.2 <- survfit(Surv(TYears, Status) ~ Group,\n                 data = bmt,\n                 se.fit = TRUE,\n                 conf.type = 'log-log', ## default is 'log'\n                 id = ID,\n                 robust = TRUE ## default for multi-state model\n                 )\n## summary(cif.2)\n\nA few points to note:\n\nsurvfit() returns the probability of being in a state (pstate). The CIF is its complement, i.e., CIF = 1 - pstate.\nGray’s test for testing equality across groups is not performed.\nIn this example survfit() recognizes that the input are in multi-state model format; therefore, it estimates the variances of the CIFs with an infinitesimal jackknife (see Therneau (2024)). The CIs, as a result, are different from that estimated based on Aalen’s or the delta method as done in SAS PROC LIFETEST.\nThe survival package also offers a different syntax for estimating CIFs. Users need to first call finegray() separately for each event to reformat the data, then apply survfit() for each event. The CIF estimates are identical since the same estimation method is used; the variances can be different from directly calling survfit() with data in multi-state model format, since finegray() artificially extends the observed time for the competing events (see Therneau (2024)).\n\n\n\nCIF Plots\nThe same ggcuminc() syntax can be applied to the survfit() output cif.2."
    +  },
    +  {
    +    "objectID": "R/survival_cif.html#summary",
    +    "href": "R/survival_cif.html#summary",
    +    "title": "Estimating Cumulative Incidence Functions Using R",
    +    "section": "Summary",
    +    "text": "Summary\nBoth tidycmprsk::cminc() (as inherited from cmprsk::cuminc()) and survival::survfit() implement Aalen-Johansen estimator. For competing risks it reduces to CIF, which has a closed form formulation. The results are identical as produced by SAS PROC LIFETEST.\nCertain options in SAS, e.g., the delta method for variance estimation or other types of transformation for calculating the CIs, are not available in the current versions of tidycmprsk::cuminc() or survival::survfit(). However, the outputs from both contain enough information that these options can be manually implemented by users. For example, Pintilie (2006) provides R code for deriving the variances for the estimated CIFs based on the delta method.\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n #| echo: false\n si <- sessioninfo::session_info(\n c(\"cmprsk\", \"tidycmprsk\", \"survival\" ) #Vector of packages used \n , dependencies = FALSE)\n si\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 24.04.1 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-15\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package    * version date (UTC) lib source\n P cmprsk       2.2-12  2024-05-19 [?] RSPM (R 4.4.0)\n P survival   * 3.7-0   2024-06-05 [?] RSPM (R 4.4.0)\n P tidycmprsk * 1.1.0   2024-08-17 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────"
    +  },
    +  {
    +    "objectID": "R/survival_cif.html#reference",
    +    "href": "R/survival_cif.html#reference",
    +    "title": "Estimating Cumulative Incidence Functions Using R",
    +    "section": "Reference",
    +    "text": "Reference\nAalen O. (1978). Nonparametric Estimation of Partial Transition Probabilities in Multiple Decrement Models, Annals of Statistics, 6:534-545.\nGray R. (1988). A Class of K-Sample Tests for Comparing the Cumulative Incidence of a Competing Risk, Annals of Statistics, 16:1141-1154.\nGray R. (2024). cmprsk: Subdistribution Analysis of Competing Risks. R package version 2.2-12. https://cran.r-project.org/web/packages/cmprsk/cmprsk.pdf\nGuo C and So Y. (2018). Cause-Specific Analysis of Competing Risks Using the PHREG Procedure. In Proceedings of the SAS Global Forum 2018 Conference. Cary, NC: SAS Institute Inc. https://support.sas.com/resources/papers/proceedings18/2159-2018.pdf.\nPintilie M. (2006). Competing Risks: A Practical Perspective. Wiley.\nhttp://dx.doi.org/10.1002/9780470870709\nSjoberg D and Fei T. (2023). tidycmprsk: Competing Risks Estimation. https://github.com/MSKCC-Epi-Bio/tidycmprsk\nTherneau T. (2024). A Package for Survival Analysis in R. R package version 3.7-0, https://CRAN.R-project.org/package=survival."
    +  },
    +  {
    +    "objectID": "R/survey-stats-summary.html",
    +    "href": "R/survey-stats-summary.html",
    +    "title": "Survey Summary Statistics using R",
         "section": "",
    -    "text": "When conducting large-scale trials on samples of the population, it can be necessary to use a more complex sampling design than a simple random sample.\nAll of these designs need to be taken into account when calculating statistics, and when producing models. Only summary statistics are discussed in this document, and variances are calculated using Taylor series linearisation methods. For a more detailed introduction to calculating survey statistics using statistical software, see (Lohr 2022).\nThe ecosystem of survey statistics packages is less mature in Python than in R or SAS, however there is a package that provides a subset of the functionality: samplics."
    +    "text": "When conducting large-scale trials on samples of the population, it can be necessary to use a more complex sampling design than a simple random sample.\nAll of these designs need to be taken into account when calculating statistics, and when producing models. Only summary statistics are discussed in this document, and variances are calculated using the default Taylor series linearisation methods. For a more detailed introduction to survey statistics in R, see (Lohr 2022) or (Lumley 2004).\nWe will use the {survey} package, which is the standard for survey statistics in R. Note that for those who prefer the tidyverse, the {srvyr} package is a wrapper around {survey} with {dplyr} like syntax."
       },
       {
    -    "objectID": "python/survey-stats-summary.html#mean",
    -    "href": "python/survey-stats-summary.html#mean",
    -    "title": "Survey Summary Statistics using Python",
    +    "objectID": "R/survey-stats-summary.html#mean",
    +    "href": "R/survey-stats-summary.html#mean",
    +    "title": "Survey Summary Statistics using R",
         "section": "Mean",
    -    "text": "Mean\nIf we want to calculate a mean of a variable in a dataset using samplics, we need to create an estimator object using the estimation method we will use - here Taylor Series estimation - and the parameter we are estimating. Then, we can specify the survey design by passing columns which define our strata and PSUs, and a column to estimate:\n\nimport numpy as np\nimport pandas as pd\n\nfrom samplics import TaylorEstimator\nfrom samplics.utils.types import PopParam\n\nnhanes = pd.read_csv(\"../data/nhanes.csv\")\n\nmean_estimator = TaylorEstimator(PopParam.mean)\n\nmean_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    remove_nan=True,\n)\nprint(mean_estimator.to_dataframe())\n\n          _param  _estimate  _stderror      _lci      _uci       _cv\n0  PopParam.mean   0.112143   0.005446  0.100598  0.123688  0.048562"
    +    "text": "Mean\nIf we want to calculate a mean of a variable in a dataset which has been obtained from a simple random sample such as apisrs, in R we can create a design object using the survey::svydesign function (specifying that there is no PSU using id = ~1 and the finite population correction using fpc=~fpc).\n\nsrs_design <- svydesign(id = ~1, fpc = ~fpc, data = apisrs)\n\nThis design object stores all metadata about the sample alongside the data, and is used by all subsequent functions in the {survey} package. To calculate the mean, standard error, and confidence intervals of the growth variable, we can use the survey::svymean and confint functions:\n\n# Calculate mean and SE of growth. The standard error will be corrected by the finite population correction specified in the design\nsrs_means <- svymean(~growth, srs_design)\n\nsrs_means\n\n       mean     SE\ngrowth 31.9 2.0905\n\n# Use degf() to get the degrees of freedom\nconfint(srs_means, df=degf(srs_design))\n\n          2.5 %   97.5 %\ngrowth 27.77764 36.02236\n\n\nNote that to obtain correct results, we had to specify the degrees of freedom using the design object."
       },
       {
    -    "objectID": "python/survey-stats-summary.html#total",
    -    "href": "python/survey-stats-summary.html#total",
    -    "title": "Survey Summary Statistics using Python",
    +    "objectID": "R/survey-stats-summary.html#total",
    +    "href": "R/survey-stats-summary.html#total",
    +    "title": "Survey Summary Statistics using R",
         "section": "Total",
    -    "text": "Total\nCalculating population totals can be done by changing the TaylorEstimator parameter to PopParam.total:\n\ntotal_estimator = TaylorEstimator(PopParam.total)\n\ntotal_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    remove_nan=True,\n)\nprint(total_estimator.to_dataframe())\n\n           _param     _estimate  ...          _uci       _cv\n0  PopParam.total  2.863525e+07  ...  3.291896e+07  0.070567\n\n[1 rows x 6 columns]"
    +    "text": "Total\nCalculating population totals can be done using the survey::svytotal function in R.\n\nsvytotal(~growth, srs_design)\n\n        total    SE\ngrowth 197589 12949"
       },
       {
    -    "objectID": "python/survey-stats-summary.html#ratios",
    -    "href": "python/survey-stats-summary.html#ratios",
    -    "title": "Survey Summary Statistics using Python",
    +    "objectID": "R/survey-stats-summary.html#ratios",
    +    "href": "R/survey-stats-summary.html#ratios",
    +    "title": "Survey Summary Statistics using R",
         "section": "Ratios",
    -    "text": "Ratios\nCalculating population ratios can be done by changing the TaylorEstimator parameter to PopParam.ratio, and additionally specifying an x parameter in the estimate method:\n\nratio_estimator = TaylorEstimator(PopParam.ratio)\n\nratio_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"],\n    x=nhanes[\"RIAGENDR\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    remove_nan=True,\n)\nprint(ratio_estimator.to_dataframe())\n\n           _param  _estimate  _stderror      _lci      _uci       _cv\n0  PopParam.ratio   0.074222   0.003715  0.066347  0.082097  0.050049"
    +    "text": "Ratios\nTo perform ratio analysis for means or proportions of analysis variables in R, we can survey::svyratio, here requesting that we do not separate the ratio estimation per Strata as this design is not stratified.\n\nsvy_ratio <- svyratio(\n  ~api00,\n  ~api99,\n  srs_design,\n  se=TRUE,\n  df=degf(srs_design),\n  separate=FALSE\n)\n\nsvy_ratio\n\nRatio estimator: svyratio.survey.design2(~api00, ~api99, srs_design, se = TRUE, \n    df = degf(srs_design), separate = FALSE)\nRatios=\n         api99\napi00 1.051066\nSEs=\n            api99\napi00 0.003603991\n\nconfint(svy_ratio, df=degf(srs_design))\n\n               2.5 %   97.5 %\napi00/api99 1.043959 1.058173"
       },
       {
    -    "objectID": "python/survey-stats-summary.html#proportions",
    -    "href": "python/survey-stats-summary.html#proportions",
    -    "title": "Survey Summary Statistics using Python",
    +    "objectID": "R/survey-stats-summary.html#proportions",
    +    "href": "R/survey-stats-summary.html#proportions",
    +    "title": "Survey Summary Statistics using R",
         "section": "Proportions",
    -    "text": "Proportions\nCalculating proportions can be done by changing the TaylorEstimator parameter to PopParam.prop:\n\nprop_estimator = TaylorEstimator(PopParam.prop)\n\nprop_estimator.estimate(\n    y=nhanes[\"agecat\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    remove_nan=True,\n)\nprop_estimator.to_dataframe()\n\n          _param    _level  _estimate  _stderror      _lci      _uci       _cv\n0  PopParam.prop    (0,19]   0.207749   0.006130  0.195054  0.221044  0.029506\n1  PopParam.prop   (19,39]   0.293408   0.009561  0.273557  0.314077  0.032585\n2  PopParam.prop   (39,59]   0.303290   0.004519  0.293795  0.312955  0.014901\n3  PopParam.prop  (59,Inf]   0.195553   0.008093  0.178965  0.213280  0.041383"
    +    "text": "Proportions\nTo calculate a proportion in R, we use the svymean function on a factor or character column:\n\nprops <- svymean(~sch.wide, srs_design)\n\nprops\n\n             mean     SE\nsch.wideNo  0.185 0.0271\nsch.wideYes 0.815 0.0271\n\nconfint(props, df=degf(srs_design))\n\n                2.5 %    97.5 %\nsch.wideNo  0.1316041 0.2383959\nsch.wideYes 0.7616041 0.8683959\n\n\nFor proportions close to 0, it can be that survey::svyciprop is more accurate at producing confidence intervals than confint."
       },
       {
    -    "objectID": "python/survey-stats-summary.html#quantiles",
    -    "href": "python/survey-stats-summary.html#quantiles",
    -    "title": "Survey Summary Statistics using Python",
    +    "objectID": "R/survey-stats-summary.html#quantiles",
    +    "href": "R/survey-stats-summary.html#quantiles",
    +    "title": "Survey Summary Statistics using R",
         "section": "Quantiles",
    -    "text": "Quantiles\nsamplics currently does not have a method to calculate quantiles."
    -  },
    -  {
    -    "objectID": "python/survey-stats-summary.html#domain-estimations",
    -    "href": "python/survey-stats-summary.html#domain-estimations",
    -    "title": "Survey Summary Statistics using Python",
    -    "section": "Domain Estimations",
    -    "text": "Domain Estimations\nWe can perform domain estimations of different sub-populations by passing our domain column as a parameter to the estimate method:\n\nmean_estimator = TaylorEstimator(PopParam.mean)\n\nmean_estimator.estimate(\n    y=nhanes[\"HI_CHOL\"],\n    samp_weight=nhanes[\"WTMEC2YR\"],\n    psu=nhanes[\"SDMVPSU\"],\n    stratum=nhanes[\"SDMVSTRA\"],\n    domain=nhanes[\"race\"],\n    remove_nan=True,\n)\nmean_estimator.to_dataframe()\n\n          _param  _domain  _estimate  _stderror      _lci      _uci       _cv\n0  PopParam.mean        1   0.101492   0.006246  0.088251  0.114732  0.061540\n1  PopParam.mean        2   0.121649   0.006604  0.107649  0.135649  0.054288\n2  PopParam.mean        3   0.078640   0.010385  0.056626  0.100655  0.132053\n3  PopParam.mean        4   0.099679   0.024666  0.047389  0.151969  0.247458\n\n\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 22.04.5 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-10\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package * version date (UTC) lib source\n P survey  * 4.4-2   2024-03-20 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────\n\n\n\n\n─ Python configuration ────────────────────────────────────────────────────────\n Python    3.12.7 (main, Oct  1 2024, 15:17:55) [GCC 11.4.0]\n samplics  0.4.22"
    +    "text": "Quantiles\nTo calculate quantiles in R, we can use the survey::svyquantile function. Note that this function was reworked in version 4.1 of {survey}, and prior to this had different arguments and results. The current version of svyquantile has an qrule which is similar to the type argument in quantile, and can be used to change how the quantiles are calculated. For more information, see vignette(\"qrule\", package=\"survey\").\n\nsvyquantile(\n  ~growth,\n  srs_design,\n  quantiles = c(0.025, 0.5, 0.975),\n  ci=TRUE,\n  se=TRUE\n)\n\n$growth\n      quantile ci.2.5 ci.97.5        se\n0.025      -16    -21     -12  2.281998\n0.5         27     24      31  1.774887\n0.975       99     84     189 26.623305\n\nattr(,\"hasci\")\n[1] TRUE\nattr(,\"class\")\n[1] \"newsvyquantile\""
       },
       {
    -    "objectID": "python/one_sample_t_test.html",
    -    "href": "python/one_sample_t_test.html",
    -    "title": "One Sample t-test",
    +    "objectID": "R/xgboost.html",
    +    "href": "R/xgboost.html",
    +    "title": "XGBoost",
         "section": "",
    -    "text": "The One Sample t-test is used to compare a single sample against an expected hypothesis value. In the One Sample t-test, the mean of the sample is compared against the hypothesis value. In Python, a One Sample t-test can be performed using the scipy.stats.ttest_1samp(…) function from the scipy package, which accepts the following parameters:\n1.a: Sample observations.\n2.popmean: Expected value in null hypothesis. If array_like, then its length along axis must equal 1, and it must otherwise be broadcastable with a.\n3.nan_policy: Defines how to handle input NaNs.\n4.alternative (optional): Defines the alternative hypothesis.\n5.keepdims: If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array."
    +    "text": "XGBoost which stands for eXtreme Gradient Boosting is an efficent implementation of gradient boosting. Gradient boosting is an ensemble technique in machine learning. Unlike traditional models that learn from the data independently, boosting combines the predictions of multiple weak learners to create a single, more accurate strong learner.\nAn XGBoost model is based on trees, so we don’t need to do much preprocessing for our data; we don’t need to worry about the factors or centering or scaling our data.\n\n\nThere are multiple packages that can be used to to implement xgboost in R.\n\n{tidymodels}\n{xgboost}\n{caret}\n\n{tidymodels} and {caret} easy ways to access xgboost easily. This example will use {tidymodels} because of the functionality included in {tidymodels} and is being heavily supported by Posit.\n\n\n\nData used for this example is birthwt which is part of the {MASS} package. This data-set considers a number of risk factors associated with birth weight in infants.\n\nlibrary(tidyverse)\n\n── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──\n✔ dplyr     1.1.4     ✔ readr     2.1.5\n✔ forcats   1.0.0     ✔ stringr   1.5.1\n✔ ggplot2   3.5.1     ✔ tibble    3.2.1\n✔ lubridate 1.9.3     ✔ tidyr     1.3.1\n✔ purrr     1.0.2     \n── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag()    masks stats::lag()\nℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors\n\nlibrary(MASS)\n\n\nAttaching package: 'MASS'\n\nThe following object is masked from 'package:dplyr':\n\n    select\n\nlibrary(tidymodels)\n\n── Attaching packages ────────────────────────────────────── tidymodels 1.2.0 ──\n✔ broom        1.0.7     ✔ rsample      1.2.1\n✔ dials        1.3.0     ✔ tune         1.2.1\n✔ infer        1.0.7     ✔ workflows    1.1.4\n✔ modeldata    1.4.0     ✔ workflowsets 1.1.0\n✔ parsnip      1.2.1     ✔ yardstick    1.3.1\n✔ recipes      1.1.0     \n── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──\n✖ scales::discard() masks purrr::discard()\n✖ dplyr::filter()   masks stats::filter()\n✖ recipes::fixed()  masks stringr::fixed()\n✖ dplyr::lag()      masks stats::lag()\n✖ MASS::select()    masks dplyr::select()\n✖ yardstick::spec() masks readr::spec()\n✖ recipes::step()   masks stats::step()\n• Dig deeper into tidy modeling with R at https://www.tmwr.org\n\nlibrary(xgboost)\n\n\nAttaching package: 'xgboost'\n\nThe following object is masked from 'package:dplyr':\n\n    slice\n\nhead(birthwt)\n\n   low age lwt race smoke ptl ht ui ftv  bwt\n85   0  19 182    2     0   0  0  1   0 2523\n86   0  33 155    3     0   0  0  0   3 2551\n87   0  20 105    1     1   0  0  0   1 2557\n88   0  21 108    1     1   0  0  1   2 2594\n89   0  18 107    1     1   0  0  1   0 2600\n91   0  21 124    3     0   0  0  0   0 2622\n\n\nOur modeling goal using the birthwt dataset is to predict whether the birth weight is low or not low based on factors such as mother’s age, smoking status, and history of hypertension.\n\n\n\nUse {tidymodels} metadata package to split the data into training and testing data. For classification, we need to change the Low variable into a factor, since currently coded as an integer (0,1).\n\nbirthwt <- \n  birthwt %>% \n  mutate(\n    low_f = lvls_revalue(factor(low), c(\"Not Low\", \"Low\")),\n    smoke_f = lvls_revalue(factor(smoke), c(\"Non-smoker\", \"Smoker\"))\n  )\n\n\nbrthwt_split <- initial_split(birthwt, strata = low)\nbrthwt_train <- training(brthwt_split)\nbrthwt_test <- testing(brthwt_split)\n\n\n\nAfter creating the data split, we setup the params of the model.\n\nxgboost_spec <- \n  boost_tree(trees = 15) %>% \n  # This model can be used for classification or regression, so set mode\n  set_mode(\"classification\") %>% \n  set_engine(\"xgboost\")\n\nxgboost_spec\n\nBoosted Tree Model Specification (classification)\n\nMain Arguments:\n  trees = 15\n\nComputational engine: xgboost \n\nxgboost_cls_fit <- xgboost_spec %>% fit(low_f ~ ., data = brthwt_train)\nxgboost_cls_fit\n\nparsnip model object\n\n##### xgb.Booster\nraw: 15.2 Kb \ncall:\n  xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, \n    colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, \n    subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, \n    verbose = 0, nthread = 1, objective = \"binary:logistic\")\nparams (as set within xgb.train):\n  eta = \"0.3\", max_depth = \"6\", gamma = \"0\", colsample_bytree = \"1\", colsample_bynode = \"1\", min_child_weight = \"1\", subsample = \"1\", nthread = \"1\", objective = \"binary:logistic\", validate_parameters = \"TRUE\"\nxgb.attributes:\n  niter\ncallbacks:\n  cb.evaluation.log()\n# of features: 12 \nniter: 15\nnfeatures : 12 \nevaluation_log:\n  iter training_logloss\n <num>            <num>\n     1       0.44894346\n     2       0.31033704\n   ---              ---\n    14       0.01571681\n    15       0.01396153\n\nbind_cols(\n  predict(xgboost_cls_fit, brthwt_test),\n  predict(xgboost_cls_fit, brthwt_test, type = \"prob\")\n)\n\n# A tibble: 48 × 3\n   .pred_class `.pred_Not Low` .pred_Low\n   <fct>                 <dbl>     <dbl>\n 1 Not Low               0.979    0.0209\n 2 Not Low               0.985    0.0151\n 3 Not Low               0.985    0.0151\n 4 Not Low               0.985    0.0151\n 5 Not Low               0.985    0.0151\n 6 Not Low               0.985    0.0151\n 7 Not Low               0.985    0.0151\n 8 Not Low               0.985    0.0151\n 9 Not Low               0.988    0.0116\n10 Not Low               0.988    0.0116\n# ℹ 38 more rows\n\n\n\n\n\nTo perform xgboost with regression, when setting up the parameter of the model, set the mode of xgboost to regression. After that switch and then changing the variable of interest back to an integer, the rest of the code is the same.\n\nxgboost_reg_spec <- \n  boost_tree(trees = 15) %>% \n  # This model can be used for classification or regression, so set mode\n  set_mode(\"regression\") %>% \n  set_engine(\"xgboost\")\n\nxgboost_reg_spec\n\nBoosted Tree Model Specification (regression)\n\nMain Arguments:\n  trees = 15\n\nComputational engine: xgboost \n\n# For a regression model, the outcome should be `numeric`, not a `factor`.\nxgboost_reg_fit <- xgboost_reg_spec %>% fit(low~ ., data = brthwt_train)\nxgboost_reg_fit \n\nparsnip model object\n\n##### xgb.Booster\nraw: 15.2 Kb \ncall:\n  xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, \n    colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, \n    subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, \n    verbose = 0, nthread = 1, objective = \"reg:squarederror\")\nparams (as set within xgb.train):\n  eta = \"0.3\", max_depth = \"6\", gamma = \"0\", colsample_bytree = \"1\", colsample_bynode = \"1\", min_child_weight = \"1\", subsample = \"1\", nthread = \"1\", objective = \"reg:squarederror\", validate_parameters = \"TRUE\"\nxgb.attributes:\n  niter\ncallbacks:\n  cb.evaluation.log()\n# of features: 13 \nniter: 15\nnfeatures : 13 \nevaluation_log:\n  iter training_rmse\n <num>         <num>\n     1   0.352094163\n     2   0.247943366\n   ---           ---\n    14   0.003690328\n    15   0.002599106\n\npredict(xgboost_reg_fit , brthwt_test)\n\n# A tibble: 48 × 1\n     .pred\n     <dbl>\n 1 0.00253\n 2 0.00253\n 3 0.00253\n 4 0.00253\n 5 0.00253\n 6 0.00253\n 7 0.00253\n 8 0.00253\n 9 0.00253\n10 0.00253\n# ℹ 38 more rows\n\n\n\n\n\n\n\nXGBoost with tidymodels by Julia Silge\n\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 24.04.1 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-15\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package      * version    date (UTC) lib source\n P backports      1.5.0      2024-05-23 [?] RSPM (R 4.4.0)\n P broom        * 1.0.7      2024-09-26 [?] RSPM (R 4.4.0)\n   class          7.3-22     2023-05-03 [2] CRAN (R 4.4.0)\n P cli            3.6.3      2024-06-21 [?] RSPM (R 4.4.0)\n   codetools      0.2-20     2024-03-31 [2] CRAN (R 4.4.0)\n P colorspace     2.1-1      2024-07-26 [?] RSPM (R 4.4.0)\n P data.table     1.16.0     2024-08-27 [?] RSPM (R 4.4.0)\n P dials        * 1.3.0      2024-07-30 [?] RSPM (R 4.4.0)\n P DiceDesign     1.10       2023-12-07 [?] RSPM (R 4.4.0)\n P digest         0.6.37     2024-08-19 [?] RSPM (R 4.4.0)\n P dplyr        * 1.1.4      2023-11-17 [?] RSPM (R 4.4.0)\n P evaluate       1.0.0      2024-09-17 [?] RSPM (R 4.4.0)\n P fansi          1.0.6      2023-12-08 [?] RSPM (R 4.4.0)\n P fastmap        1.2.0      2024-05-15 [?] RSPM (R 4.4.0)\n P forcats      * 1.0.0      2023-01-29 [?] RSPM (R 4.4.0)\n P foreach        1.5.2      2022-02-02 [?] RSPM (R 4.4.0)\n P furrr          0.3.1      2022-08-15 [?] RSPM (R 4.4.0)\n P future         1.34.0     2024-07-29 [?] RSPM (R 4.4.0)\n P future.apply   1.11.2     2024-03-28 [?] RSPM (R 4.4.0)\n P generics       0.1.3      2022-07-05 [?] RSPM (R 4.4.0)\n P ggplot2      * 3.5.1      2024-04-23 [?] RSPM (R 4.4.0)\n P globals        0.16.3     2024-03-08 [?] RSPM (R 4.4.0)\n P glue           1.8.0      2024-09-30 [?] RSPM (R 4.4.0)\n P gower          1.0.1      2022-12-22 [?] RSPM (R 4.4.0)\n P GPfit          1.0-8      2019-02-08 [?] RSPM (R 4.4.0)\n P gtable         0.3.5      2024-04-22 [?] RSPM (R 4.4.0)\n P hardhat        1.4.0      2024-06-02 [?] RSPM (R 4.4.0)\n P hms            1.1.3      2023-03-21 [?] RSPM (R 4.4.0)\n P htmltools      0.5.8.1    2024-04-04 [?] RSPM (R 4.4.0)\n P htmlwidgets    1.6.4      2023-12-06 [?] RSPM (R 4.4.0)\n P infer        * 1.0.7      2024-03-25 [?] RSPM (R 4.4.0)\n P ipred          0.9-15     2024-07-18 [?] RSPM (R 4.4.0)\n P iterators      1.0.14     2022-02-05 [?] RSPM (R 4.4.0)\n P jsonlite       1.8.9      2024-09-20 [?] RSPM (R 4.4.0)\n P knitr          1.48       2024-07-07 [?] RSPM (R 4.4.0)\n   lattice        0.22-6     2024-03-20 [2] CRAN (R 4.4.0)\n P lava           1.8.0      2024-03-05 [?] RSPM (R 4.4.0)\n P lhs            1.2.0      2024-06-30 [?] RSPM (R 4.4.0)\n P lifecycle      1.0.4      2023-11-07 [?] RSPM (R 4.4.0)\n P listenv        0.9.1      2024-01-29 [?] RSPM (R 4.4.0)\n P lubridate    * 1.9.3      2023-09-27 [?] RSPM (R 4.4.0)\n P magrittr       2.0.3      2022-03-30 [?] RSPM (R 4.4.0)\n   MASS         * 7.3-60.2   2024-08-22 [2] local\n   Matrix         1.7-0      2024-03-22 [2] CRAN (R 4.4.0)\n P modeldata    * 1.4.0      2024-06-19 [?] RSPM (R 4.4.0)\n P munsell        0.5.1      2024-04-01 [?] RSPM (R 4.4.0)\n   nnet           7.3-19     2023-05-03 [2] CRAN (R 4.4.0)\n P parallelly     1.38.0     2024-07-27 [?] RSPM (R 4.4.0)\n P parsnip      * 1.2.1      2024-03-22 [?] RSPM (R 4.4.0)\n P pillar         1.9.0      2023-03-22 [?] RSPM (R 4.4.0)\n P pkgconfig      2.0.3      2019-09-22 [?] RSPM (R 4.4.0)\n P prodlim        2024.06.25 2024-06-24 [?] RSPM (R 4.4.0)\n P purrr        * 1.0.2      2023-08-10 [?] RSPM (R 4.4.0)\n P R6             2.5.1      2021-08-19 [?] RSPM (R 4.4.0)\n P Rcpp           1.0.13     2024-07-17 [?] RSPM (R 4.4.0)\n P readr        * 2.1.5      2024-01-10 [?] RSPM (R 4.4.0)\n P recipes      * 1.1.0      2024-07-04 [?] RSPM (R 4.4.0)\n   renv           1.0.10     2024-10-05 [1] RSPM (R 4.4.0)\n P rlang          1.1.4      2024-06-04 [?] RSPM (R 4.4.0)\n P rmarkdown      2.28       2024-08-17 [?] RSPM (R 4.4.0)\n   rpart          4.1.23     2023-12-05 [2] CRAN (R 4.4.0)\n P rsample      * 1.2.1      2024-03-25 [?] RSPM (R 4.4.0)\n P rstudioapi     0.16.0     2024-03-24 [?] RSPM (R 4.4.0)\n P scales       * 1.3.0      2023-11-28 [?] RSPM (R 4.4.0)\n P sessioninfo    1.2.2      2021-12-06 [?] RSPM (R 4.4.0)\n P stringi        1.8.4      2024-05-06 [?] RSPM (R 4.4.0)\n P stringr      * 1.5.1      2023-11-14 [?] RSPM (R 4.4.0)\n P survival       3.7-0      2024-06-05 [?] RSPM (R 4.4.0)\n P tibble       * 3.2.1      2023-03-20 [?] RSPM (R 4.4.0)\n P tidymodels   * 1.2.0      2024-03-25 [?] RSPM (R 4.4.0)\n P tidyr        * 1.3.1      2024-01-24 [?] RSPM (R 4.4.0)\n P tidyselect     1.2.1      2024-03-11 [?] RSPM (R 4.4.0)\n P tidyverse    * 2.0.0      2023-02-22 [?] RSPM (R 4.4.0)\n P timechange     0.3.0      2024-01-18 [?] RSPM (R 4.4.0)\n P timeDate       4041.110   2024-09-22 [?] RSPM (R 4.4.0)\n P tune         * 1.2.1      2024-04-18 [?] RSPM (R 4.4.0)\n P tzdb           0.4.0      2023-05-12 [?] RSPM (R 4.4.0)\n P utf8           1.2.4      2023-10-22 [?] RSPM (R 4.4.0)\n P vctrs          0.6.5      2023-12-01 [?] RSPM (R 4.4.0)\n P withr          3.0.1      2024-07-31 [?] RSPM (R 4.4.0)\n P workflows    * 1.1.4      2024-02-19 [?] RSPM (R 4.4.0)\n P workflowsets * 1.1.0      2024-03-21 [?] RSPM (R 4.4.0)\n P xfun           0.48       2024-10-03 [?] RSPM (R 4.4.0)\n P xgboost      * 1.7.8.1    2024-07-24 [?] RSPM (R 4.4.0)\n P yaml           2.3.10     2024-07-26 [?] RSPM (R 4.4.0)\n P yardstick    * 1.3.1      2024-03-21 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────"
       },
       {
    -    "objectID": "python/one_sample_t_test.html#one-sample-t-test-in-python",
    -    "href": "python/one_sample_t_test.html#one-sample-t-test-in-python",
    -    "title": "One Sample t-test",
    +    "objectID": "R/xgboost.html#available-r-packages",
    +    "href": "R/xgboost.html#available-r-packages",
    +    "title": "XGBoost",
         "section": "",
    -    "text": "The One Sample t-test is used to compare a single sample against an expected hypothesis value. In the One Sample t-test, the mean of the sample is compared against the hypothesis value. In Python, a One Sample t-test can be performed using the scipy.stats.ttest_1samp(…) function from the scipy package, which accepts the following parameters:\n1.a: Sample observations.\n2.popmean: Expected value in null hypothesis. If array_like, then its length along axis must equal 1, and it must otherwise be broadcastable with a.\n3.nan_policy: Defines how to handle input NaNs.\n4.alternative (optional): Defines the alternative hypothesis.\n5.keepdims: If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array."
    +    "text": "There are multiple packages that can be used to to implement xgboost in R.\n\n{tidymodels}\n{xgboost}\n{caret}\n\n{tidymodels} and {caret} easy ways to access xgboost easily. This example will use {tidymodels} because of the functionality included in {tidymodels} and is being heavily supported by Posit."
       },
       {
    -    "objectID": "python/one_sample_t_test.html#data-used",
    -    "href": "python/one_sample_t_test.html#data-used",
    -    "title": "One Sample t-test",
    -    "section": "Data Used",
    -    "text": "Data Used\n\nimport pandas as pd\n\n# Create sample data\ndata = {\n    'score': [40, 47, 52, 26, 19, 25, 35, 39, 26, 48, 14, 22, 42, 34, 33, 18, 15, 29, 41, 44, 51, 43, 27, 46, 28, 49, 31, 28, 54, 45],\n    'count': [2, 2, 2, 1, 2, 2, 4, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1]\n}\n\ndf = pd.DataFrame(data)\n\n\nsubsubtitle: “t-test”\n\nThe following code was used to test the comparison in Python. Note that the baseline null hypothesis goes in the “popmean” parameter.\n\nimport pandas as pd\nfrom scipy import stats\n\n# Perform one-sample t-test\nsample_mean = df['score'].mean()\nnull_mean = 30  # Hypothetical null hypothesis mean for comparison\nalpha = 0.05  # Significance level\n\nt_statistic, p_value = stats.ttest_1samp(df['score'], null_mean)\n\nprint(f\"t: {t_statistic}\")\nprint(f\"p-value: {p_value}\")\nprint(f\"mean of x: {sample_mean}\")\n\nif p_value < alpha:\n    print(\"Reject null hypothesis: There is a significant difference.\")\nelse:\n    print(\"Fail to reject null hypothesis: There is no significant difference.\")\n\nt: 2.364306444879101\np-value: 0.02497410401836272\nmean of x: 35.03333333333333\nReject null hypothesis: There is a significant difference."
    +    "objectID": "R/xgboost.html#data-used",
    +    "href": "R/xgboost.html#data-used",
    +    "title": "XGBoost",
    +    "section": "",
    +    "text": "Data used for this example is birthwt which is part of the {MASS} package. This data-set considers a number of risk factors associated with birth weight in infants.\n\nlibrary(tidyverse)\n\n── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──\n✔ dplyr     1.1.4     ✔ readr     2.1.5\n✔ forcats   1.0.0     ✔ stringr   1.5.1\n✔ ggplot2   3.5.1     ✔ tibble    3.2.1\n✔ lubridate 1.9.3     ✔ tidyr     1.3.1\n✔ purrr     1.0.2     \n── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag()    masks stats::lag()\nℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors\n\nlibrary(MASS)\n\n\nAttaching package: 'MASS'\n\nThe following object is masked from 'package:dplyr':\n\n    select\n\nlibrary(tidymodels)\n\n── Attaching packages ────────────────────────────────────── tidymodels 1.2.0 ──\n✔ broom        1.0.7     ✔ rsample      1.2.1\n✔ dials        1.3.0     ✔ tune         1.2.1\n✔ infer        1.0.7     ✔ workflows    1.1.4\n✔ modeldata    1.4.0     ✔ workflowsets 1.1.0\n✔ parsnip      1.2.1     ✔ yardstick    1.3.1\n✔ recipes      1.1.0     \n── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──\n✖ scales::discard() masks purrr::discard()\n✖ dplyr::filter()   masks stats::filter()\n✖ recipes::fixed()  masks stringr::fixed()\n✖ dplyr::lag()      masks stats::lag()\n✖ MASS::select()    masks dplyr::select()\n✖ yardstick::spec() masks readr::spec()\n✖ recipes::step()   masks stats::step()\n• Dig deeper into tidy modeling with R at https://www.tmwr.org\n\nlibrary(xgboost)\n\n\nAttaching package: 'xgboost'\n\nThe following object is masked from 'package:dplyr':\n\n    slice\n\nhead(birthwt)\n\n   low age lwt race smoke ptl ht ui ftv  bwt\n85   0  19 182    2     0   0  0  1   0 2523\n86   0  33 155    3     0   0  0  0   3 2551\n87   0  20 105    1     1   0  0  0   1 2557\n88   0  21 108    1     1   0  0  1   2 2594\n89   0  18 107    1     1   0  0  1   0 2600\n91   0  21 124    3     0   0  0  0   0 2622\n\n\nOur modeling goal using the birthwt dataset is to predict whether the birth weight is low or not low based on factors such as mother’s age, smoking status, and history of hypertension."
       },
       {
    -    "objectID": "python/skewness_kurtosis.html",
    -    "href": "python/skewness_kurtosis.html",
    -    "title": "Skewness/Kurtosis",
    +    "objectID": "R/xgboost.html#example-code",
    +    "href": "R/xgboost.html#example-code",
    +    "title": "XGBoost",
         "section": "",
    -    "text": "Skewness measures the the amount of asymmetry in a distribution, while Kurtosis describes the “tailedness” of the curve. These measures are frequently used to assess the normality of the data. There are several methods to calculate these measures. In Python, the packages pandas, scipy.stats.skew and scipy.stats.kurtosis can be used.\n\n\n\nimport pandas as pd\nfrom scipy.stats import skew, kurtosis\n\n# Create sample data\ndata = {\n    'team': [\"A\"]*5 + [\"B\"]*5 + [\"C\"]*5,\n    'points': [10, 17, 17, 18, 15, 10, 14, 13, 29, 25, 12, 30, 34, 12, 11],\n    'assists': [2, 5, 6, 3, 0, 2, 5, 4, 0, 2, 1, 1, 3, 4, 7]\n}\ndf = pd.DataFrame(data)\n\n\n\nJoanes and Gill (1998) discusses three methods for estimating skewness:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_1 = m_1/m_2^{3/2}\\]\n\nType 2: Used in SAS and SPSS\n\\[\nG_1 = g_1\\sqrt{n(n-1)}/(n-2)\n\\]\nType 3: Used in MINITAB and BMDP\n\\[\nb_1 = m_3/s^3 = g_1((n-1)/n)^{3/2}\n\\]\n\nAll three skewness measures are unbiased under normality. The three methods are illustrated in the following code:\n\n# Skewness\ntype1_skew = skew(df['points'])\ntype2_skew = df['points'].skew()\ntype3_skew = skew(df['points']) * ((len(df['points']) - 1) / len(df['points'])) ** (3/2)\n\nprint(f\"Skewness - Type 1: {type1_skew}\")\nprint(f\"Skewness - Type 2: {type2_skew}\")\nprint(f\"Skewness - Type 3: {type3_skew}\")\n\nSkewness - Type 1: 0.9054442043798532\nSkewness - Type 2: 1.0093179298709385\nSkewness - Type 3: 0.816426058828937\n\n\nThe default for the scipy.stats.skew function is type 1.\n\n\n\nJoanes and Gill (1998) discuss three methods for estimating kurtosis:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_2 = m_4/m_2^{2}-3\\]\n\nType 2: Used in SAS and SPSS\n\\[G_2 = ((n+1)g_2+6)*\\frac{(n-1)}{(n-2)(n-3)}\\]\nType 3: Used in MINITAB and BMDP\n\\[b_2 = m_4/s^4-3 = (g_2 + 3)(1-1/n)^2-3\\]\n\nOnly \\(G_2\\) (corresponding to type 2) is unbiased under normality. The three methods are illustrated in the following code:\n\n# Kurtosis\ntype1_kurt = kurtosis(df['points'])\n\nn = len(df['points'])\ng2 = kurtosis(df['points'], fisher=True)  # Fisher's kurtosis\n\n# Calculate the kurtosis type using the formula G2\ntype2_kurt = ((n + 1) * g2 + 6) * ((n - 1) / ((n - 2) * (n - 3)))\n\n# Calculate the kurtosis type using the formula b2\nn = len(df['points'])\ng2 = kurtosis(df['points'], fisher=True)  # Fisher's kurtosis\n\ntype3_kurt = (g2 + 3) * ((1 - 1/n) ** 2) - 3\n\nprint(f\"Kurtosis - Type 1: {type1_kurt}\")\nprint(f\"Kurtosis - Type 2: {type2_kurt}\")\nprint(f\"Kurtosis - Type 3: {type3_kurt}\")\n\nKurtosis - Type 1: -0.5833410771247833\nKurtosis - Type 2: -0.2991564184355863\nKurtosis - Type 3: -0.8948215605175891\n\n\nThe default for the scipy.stats.kurtosis function is type 1."
    +    "text": "Use {tidymodels} metadata package to split the data into training and testing data. For classification, we need to change the Low variable into a factor, since currently coded as an integer (0,1).\n\nbirthwt <- \n  birthwt %>% \n  mutate(\n    low_f = lvls_revalue(factor(low), c(\"Not Low\", \"Low\")),\n    smoke_f = lvls_revalue(factor(smoke), c(\"Non-smoker\", \"Smoker\"))\n  )\n\n\nbrthwt_split <- initial_split(birthwt, strata = low)\nbrthwt_train <- training(brthwt_split)\nbrthwt_test <- testing(brthwt_split)\n\n\n\nAfter creating the data split, we setup the params of the model.\n\nxgboost_spec <- \n  boost_tree(trees = 15) %>% \n  # This model can be used for classification or regression, so set mode\n  set_mode(\"classification\") %>% \n  set_engine(\"xgboost\")\n\nxgboost_spec\n\nBoosted Tree Model Specification (classification)\n\nMain Arguments:\n  trees = 15\n\nComputational engine: xgboost \n\nxgboost_cls_fit <- xgboost_spec %>% fit(low_f ~ ., data = brthwt_train)\nxgboost_cls_fit\n\nparsnip model object\n\n##### xgb.Booster\nraw: 15.2 Kb \ncall:\n  xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, \n    colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, \n    subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, \n    verbose = 0, nthread = 1, objective = \"binary:logistic\")\nparams (as set within xgb.train):\n  eta = \"0.3\", max_depth = \"6\", gamma = \"0\", colsample_bytree = \"1\", colsample_bynode = \"1\", min_child_weight = \"1\", subsample = \"1\", nthread = \"1\", objective = \"binary:logistic\", validate_parameters = \"TRUE\"\nxgb.attributes:\n  niter\ncallbacks:\n  cb.evaluation.log()\n# of features: 12 \nniter: 15\nnfeatures : 12 \nevaluation_log:\n  iter training_logloss\n <num>            <num>\n     1       0.44894346\n     2       0.31033704\n   ---              ---\n    14       0.01571681\n    15       0.01396153\n\nbind_cols(\n  predict(xgboost_cls_fit, brthwt_test),\n  predict(xgboost_cls_fit, brthwt_test, type = \"prob\")\n)\n\n# A tibble: 48 × 3\n   .pred_class `.pred_Not Low` .pred_Low\n   <fct>                 <dbl>     <dbl>\n 1 Not Low               0.979    0.0209\n 2 Not Low               0.985    0.0151\n 3 Not Low               0.985    0.0151\n 4 Not Low               0.985    0.0151\n 5 Not Low               0.985    0.0151\n 6 Not Low               0.985    0.0151\n 7 Not Low               0.985    0.0151\n 8 Not Low               0.985    0.0151\n 9 Not Low               0.988    0.0116\n10 Not Low               0.988    0.0116\n# ℹ 38 more rows\n\n\n\n\n\nTo perform xgboost with regression, when setting up the parameter of the model, set the mode of xgboost to regression. After that switch and then changing the variable of interest back to an integer, the rest of the code is the same.\n\nxgboost_reg_spec <- \n  boost_tree(trees = 15) %>% \n  # This model can be used for classification or regression, so set mode\n  set_mode(\"regression\") %>% \n  set_engine(\"xgboost\")\n\nxgboost_reg_spec\n\nBoosted Tree Model Specification (regression)\n\nMain Arguments:\n  trees = 15\n\nComputational engine: xgboost \n\n# For a regression model, the outcome should be `numeric`, not a `factor`.\nxgboost_reg_fit <- xgboost_reg_spec %>% fit(low~ ., data = brthwt_train)\nxgboost_reg_fit \n\nparsnip model object\n\n##### xgb.Booster\nraw: 15.2 Kb \ncall:\n  xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, \n    colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, \n    subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, \n    verbose = 0, nthread = 1, objective = \"reg:squarederror\")\nparams (as set within xgb.train):\n  eta = \"0.3\", max_depth = \"6\", gamma = \"0\", colsample_bytree = \"1\", colsample_bynode = \"1\", min_child_weight = \"1\", subsample = \"1\", nthread = \"1\", objective = \"reg:squarederror\", validate_parameters = \"TRUE\"\nxgb.attributes:\n  niter\ncallbacks:\n  cb.evaluation.log()\n# of features: 13 \nniter: 15\nnfeatures : 13 \nevaluation_log:\n  iter training_rmse\n <num>         <num>\n     1   0.352094163\n     2   0.247943366\n   ---           ---\n    14   0.003690328\n    15   0.002599106\n\npredict(xgboost_reg_fit , brthwt_test)\n\n# A tibble: 48 × 1\n     .pred\n     <dbl>\n 1 0.00253\n 2 0.00253\n 3 0.00253\n 4 0.00253\n 5 0.00253\n 6 0.00253\n 7 0.00253\n 8 0.00253\n 9 0.00253\n10 0.00253\n# ℹ 38 more rows"
       },
       {
    -    "objectID": "python/skewness_kurtosis.html#data-used",
    -    "href": "python/skewness_kurtosis.html#data-used",
    -    "title": "Skewness/Kurtosis",
    +    "objectID": "R/xgboost.html#reference",
    +    "href": "R/xgboost.html#reference",
    +    "title": "XGBoost",
         "section": "",
    -    "text": "import pandas as pd\nfrom scipy.stats import skew, kurtosis\n\n# Create sample data\ndata = {\n    'team': [\"A\"]*5 + [\"B\"]*5 + [\"C\"]*5,\n    'points': [10, 17, 17, 18, 15, 10, 14, 13, 29, 25, 12, 30, 34, 12, 11],\n    'assists': [2, 5, 6, 3, 0, 2, 5, 4, 0, 2, 1, 1, 3, 4, 7]\n}\ndf = pd.DataFrame(data)\n\n\n\nJoanes and Gill (1998) discusses three methods for estimating skewness:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_1 = m_1/m_2^{3/2}\\]\n\nType 2: Used in SAS and SPSS\n\\[\nG_1 = g_1\\sqrt{n(n-1)}/(n-2)\n\\]\nType 3: Used in MINITAB and BMDP\n\\[\nb_1 = m_3/s^3 = g_1((n-1)/n)^{3/2}\n\\]\n\nAll three skewness measures are unbiased under normality. The three methods are illustrated in the following code:\n\n# Skewness\ntype1_skew = skew(df['points'])\ntype2_skew = df['points'].skew()\ntype3_skew = skew(df['points']) * ((len(df['points']) - 1) / len(df['points'])) ** (3/2)\n\nprint(f\"Skewness - Type 1: {type1_skew}\")\nprint(f\"Skewness - Type 2: {type2_skew}\")\nprint(f\"Skewness - Type 3: {type3_skew}\")\n\nSkewness - Type 1: 0.9054442043798532\nSkewness - Type 2: 1.0093179298709385\nSkewness - Type 3: 0.816426058828937\n\n\nThe default for the scipy.stats.skew function is type 1.\n\n\n\nJoanes and Gill (1998) discuss three methods for estimating kurtosis:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_2 = m_4/m_2^{2}-3\\]\n\nType 2: Used in SAS and SPSS\n\\[G_2 = ((n+1)g_2+6)*\\frac{(n-1)}{(n-2)(n-3)}\\]\nType 3: Used in MINITAB and BMDP\n\\[b_2 = m_4/s^4-3 = (g_2 + 3)(1-1/n)^2-3\\]\n\nOnly \\(G_2\\) (corresponding to type 2) is unbiased under normality. The three methods are illustrated in the following code:\n\n# Kurtosis\ntype1_kurt = kurtosis(df['points'])\n\nn = len(df['points'])\ng2 = kurtosis(df['points'], fisher=True)  # Fisher's kurtosis\n\n# Calculate the kurtosis type using the formula G2\ntype2_kurt = ((n + 1) * g2 + 6) * ((n - 1) / ((n - 2) * (n - 3)))\n\n# Calculate the kurtosis type using the formula b2\nn = len(df['points'])\ng2 = kurtosis(df['points'], fisher=True)  # Fisher's kurtosis\n\ntype3_kurt = (g2 + 3) * ((1 - 1/n) ** 2) - 3\n\nprint(f\"Kurtosis - Type 1: {type1_kurt}\")\nprint(f\"Kurtosis - Type 2: {type2_kurt}\")\nprint(f\"Kurtosis - Type 3: {type3_kurt}\")\n\nKurtosis - Type 1: -0.5833410771247833\nKurtosis - Type 2: -0.2991564184355863\nKurtosis - Type 3: -0.8948215605175891\n\n\nThe default for the scipy.stats.kurtosis function is type 1."
    +    "text": "XGBoost with tidymodels by Julia Silge\n\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 24.04.1 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-15\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package      * version    date (UTC) lib source\n P backports      1.5.0      2024-05-23 [?] RSPM (R 4.4.0)\n P broom        * 1.0.7      2024-09-26 [?] RSPM (R 4.4.0)\n   class          7.3-22     2023-05-03 [2] CRAN (R 4.4.0)\n P cli            3.6.3      2024-06-21 [?] RSPM (R 4.4.0)\n   codetools      0.2-20     2024-03-31 [2] CRAN (R 4.4.0)\n P colorspace     2.1-1      2024-07-26 [?] RSPM (R 4.4.0)\n P data.table     1.16.0     2024-08-27 [?] RSPM (R 4.4.0)\n P dials        * 1.3.0      2024-07-30 [?] RSPM (R 4.4.0)\n P DiceDesign     1.10       2023-12-07 [?] RSPM (R 4.4.0)\n P digest         0.6.37     2024-08-19 [?] RSPM (R 4.4.0)\n P dplyr        * 1.1.4      2023-11-17 [?] RSPM (R 4.4.0)\n P evaluate       1.0.0      2024-09-17 [?] RSPM (R 4.4.0)\n P fansi          1.0.6      2023-12-08 [?] RSPM (R 4.4.0)\n P fastmap        1.2.0      2024-05-15 [?] RSPM (R 4.4.0)\n P forcats      * 1.0.0      2023-01-29 [?] RSPM (R 4.4.0)\n P foreach        1.5.2      2022-02-02 [?] RSPM (R 4.4.0)\n P furrr          0.3.1      2022-08-15 [?] RSPM (R 4.4.0)\n P future         1.34.0     2024-07-29 [?] RSPM (R 4.4.0)\n P future.apply   1.11.2     2024-03-28 [?] RSPM (R 4.4.0)\n P generics       0.1.3      2022-07-05 [?] RSPM (R 4.4.0)\n P ggplot2      * 3.5.1      2024-04-23 [?] RSPM (R 4.4.0)\n P globals        0.16.3     2024-03-08 [?] RSPM (R 4.4.0)\n P glue           1.8.0      2024-09-30 [?] RSPM (R 4.4.0)\n P gower          1.0.1      2022-12-22 [?] RSPM (R 4.4.0)\n P GPfit          1.0-8      2019-02-08 [?] RSPM (R 4.4.0)\n P gtable         0.3.5      2024-04-22 [?] RSPM (R 4.4.0)\n P hardhat        1.4.0      2024-06-02 [?] RSPM (R 4.4.0)\n P hms            1.1.3      2023-03-21 [?] RSPM (R 4.4.0)\n P htmltools      0.5.8.1    2024-04-04 [?] RSPM (R 4.4.0)\n P htmlwidgets    1.6.4      2023-12-06 [?] RSPM (R 4.4.0)\n P infer        * 1.0.7      2024-03-25 [?] RSPM (R 4.4.0)\n P ipred          0.9-15     2024-07-18 [?] RSPM (R 4.4.0)\n P iterators      1.0.14     2022-02-05 [?] RSPM (R 4.4.0)\n P jsonlite       1.8.9      2024-09-20 [?] RSPM (R 4.4.0)\n P knitr          1.48       2024-07-07 [?] RSPM (R 4.4.0)\n   lattice        0.22-6     2024-03-20 [2] CRAN (R 4.4.0)\n P lava           1.8.0      2024-03-05 [?] RSPM (R 4.4.0)\n P lhs            1.2.0      2024-06-30 [?] RSPM (R 4.4.0)\n P lifecycle      1.0.4      2023-11-07 [?] RSPM (R 4.4.0)\n P listenv        0.9.1      2024-01-29 [?] RSPM (R 4.4.0)\n P lubridate    * 1.9.3      2023-09-27 [?] RSPM (R 4.4.0)\n P magrittr       2.0.3      2022-03-30 [?] RSPM (R 4.4.0)\n   MASS         * 7.3-60.2   2024-08-22 [2] local\n   Matrix         1.7-0      2024-03-22 [2] CRAN (R 4.4.0)\n P modeldata    * 1.4.0      2024-06-19 [?] RSPM (R 4.4.0)\n P munsell        0.5.1      2024-04-01 [?] RSPM (R 4.4.0)\n   nnet           7.3-19     2023-05-03 [2] CRAN (R 4.4.0)\n P parallelly     1.38.0     2024-07-27 [?] RSPM (R 4.4.0)\n P parsnip      * 1.2.1      2024-03-22 [?] RSPM (R 4.4.0)\n P pillar         1.9.0      2023-03-22 [?] RSPM (R 4.4.0)\n P pkgconfig      2.0.3      2019-09-22 [?] RSPM (R 4.4.0)\n P prodlim        2024.06.25 2024-06-24 [?] RSPM (R 4.4.0)\n P purrr        * 1.0.2      2023-08-10 [?] RSPM (R 4.4.0)\n P R6             2.5.1      2021-08-19 [?] RSPM (R 4.4.0)\n P Rcpp           1.0.13     2024-07-17 [?] RSPM (R 4.4.0)\n P readr        * 2.1.5      2024-01-10 [?] RSPM (R 4.4.0)\n P recipes      * 1.1.0      2024-07-04 [?] RSPM (R 4.4.0)\n   renv           1.0.10     2024-10-05 [1] RSPM (R 4.4.0)\n P rlang          1.1.4      2024-06-04 [?] RSPM (R 4.4.0)\n P rmarkdown      2.28       2024-08-17 [?] RSPM (R 4.4.0)\n   rpart          4.1.23     2023-12-05 [2] CRAN (R 4.4.0)\n P rsample      * 1.2.1      2024-03-25 [?] RSPM (R 4.4.0)\n P rstudioapi     0.16.0     2024-03-24 [?] RSPM (R 4.4.0)\n P scales       * 1.3.0      2023-11-28 [?] RSPM (R 4.4.0)\n P sessioninfo    1.2.2      2021-12-06 [?] RSPM (R 4.4.0)\n P stringi        1.8.4      2024-05-06 [?] RSPM (R 4.4.0)\n P stringr      * 1.5.1      2023-11-14 [?] RSPM (R 4.4.0)\n P survival       3.7-0      2024-06-05 [?] RSPM (R 4.4.0)\n P tibble       * 3.2.1      2023-03-20 [?] RSPM (R 4.4.0)\n P tidymodels   * 1.2.0      2024-03-25 [?] RSPM (R 4.4.0)\n P tidyr        * 1.3.1      2024-01-24 [?] RSPM (R 4.4.0)\n P tidyselect     1.2.1      2024-03-11 [?] RSPM (R 4.4.0)\n P tidyverse    * 2.0.0      2023-02-22 [?] RSPM (R 4.4.0)\n P timechange     0.3.0      2024-01-18 [?] RSPM (R 4.4.0)\n P timeDate       4041.110   2024-09-22 [?] RSPM (R 4.4.0)\n P tune         * 1.2.1      2024-04-18 [?] RSPM (R 4.4.0)\n P tzdb           0.4.0      2023-05-12 [?] RSPM (R 4.4.0)\n P utf8           1.2.4      2023-10-22 [?] RSPM (R 4.4.0)\n P vctrs          0.6.5      2023-12-01 [?] RSPM (R 4.4.0)\n P withr          3.0.1      2024-07-31 [?] RSPM (R 4.4.0)\n P workflows    * 1.1.4      2024-02-19 [?] RSPM (R 4.4.0)\n P workflowsets * 1.1.0      2024-03-21 [?] RSPM (R 4.4.0)\n P xfun           0.48       2024-10-03 [?] RSPM (R 4.4.0)\n P xgboost      * 1.7.8.1    2024-07-24 [?] RSPM (R 4.4.0)\n P yaml           2.3.10     2024-07-26 [?] RSPM (R 4.4.0)\n P yardstick    * 1.3.1      2024-03-21 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────"
       },
       {
    -    "objectID": "python/ancova.html",
    -    "href": "python/ancova.html",
    -    "title": "Ancova",
    +    "objectID": "non_website_content/conferences/2024/abstract_useR2024.html",
    +    "href": "non_website_content/conferences/2024/abstract_useR2024.html",
    +    "title": "Conference information",
         "section": "",
    -    "text": "In this example, we’re looking at Analysis of Covariance. ANCOVA is typically used to analyse treatment differences, to see examples of prediction models go to the simple linear regression page."
    +    "text": "Conference information\nUseR 2024 (Salzburg)\nJuly 8-11 2024\nhttps://events.linuxfoundation.org/user/\n\nSubmission\nDeadline: March 11\nWho is submitting: Chi Zhang\n\n\n\nTitle\nIntroducing CAMIS: an open-source, community endeavor for Comparing Analysis Method Implementations in Software\n\n\nAbstract\n(No longer than 1200 characters)\nStatisticians using multiple softwares (SAS, R, Python) will have found differences in analysis results that warrant further justification. Whilst some industries may accept results not being the same as long as they are “close”, the highly regulated pharmaceutical industry would require an identical match in results. Yet, discrepancies might still occur, and knowing the reasons (different methods, options, algorithms etc) is critical to the modern statistician and subsequent regulatory submissions.\nIn this talk I will introduce CAMIS: Comparing Analysis Method Implementations in Software (CAMIS). https://psiaims.github.io/CAMIS/. It is a joint-project between PHUSE DVOST, the R Validation Hub, PSI AIMS, R consortium and ASA openstatsware. The aim of CAMIS is to investigate and document differences and similarities between different statistical softwares such as SAS and R. We use Quarto and Github to document methods, algorithms and comparisons between softwares through small case studies, and all articles are contributed by the community. In the transition from proprietary to open source technology in the industry, CAMIS can serve as a guidebook to navigate this process.\n\nkeywords: cross industry collaboration, multi-lingua, open-source, quarto\n\n\n\nLearning outcomes\n\nCAMIS is a cross-industry collaboration, focusing on documenting differences between statistical softwares (SAS, R)\nWe use open source technology (Quarto, Github, R), all articles are contributed by the community\nCAMIS aims to facilitate the transition from proprietary to open source in the industry"
       },
       {
    -    "objectID": "python/ancova.html#introduction",
    -    "href": "python/ancova.html#introduction",
    -    "title": "Ancova",
    +    "objectID": "contribution/contribution.html",
    +    "href": "contribution/contribution.html",
    +    "title": "Get Involved",
         "section": "",
    -    "text": "In this example, we’re looking at Analysis of Covariance. ANCOVA is typically used to analyse treatment differences, to see examples of prediction models go to the simple linear regression page."
    +    "text": "CAMIS is a community effort. Although this project does have a core team, the endeavor of tracking all these comparisons will fail without community contributions. We appreciate all contributions, big or small!\nYou can get involved in the following ways:\n\njoin our monthly online meetings\nreport a difference or request a new method by filing an issue\ncontribute to our documentation"
       },
       {
    -    "objectID": "python/ancova.html#data-summary",
    -    "href": "python/ancova.html#data-summary",
    -    "title": "Ancova",
    -    "section": "Data Summary",
    -    "text": "Data Summary\n\nimport pandas as pd\n\n# Input data\ndata = {\n    'drug': [\"A\", \"A\", \"A\", \"A\", \"A\", \"A\", \"A\", \"A\", \"A\", \"A\",\n             \"D\", \"D\", \"D\", \"D\", \"D\", \"D\", \"D\", \"D\", \"D\", \"D\",\n             \"F\", \"F\", \"F\", \"F\", \"F\", \"F\", \"F\", \"F\", \"F\", \"F\"],\n    'pre': [11, 8, 5, 14, 19, 6, 10, 6, 11, 3,\n            6, 6, 7, 8, 18, 8, 19, 8, 5, 15,\n            16, 13, 11, 9, 21, 16, 12, 12, 7, 12],\n    'post': [6, 0, 2, 8, 11, 4, 13, 1, 8, 0,\n             0, 2, 3, 1, 18, 4, 14, 9, 1, 9,\n             13, 10, 18, 5, 23, 12, 5, 16, 1, 20]\n}\n\ndf = pd.DataFrame(data)\n\n\n# Descriptive statistics\nsummary_stats = df.describe()\n\n# Calculate median\nmedian_pre = df['pre'].median()\nmedian_post = df['post'].median()\n\n# Add median to the summary statistics\nsummary_stats.loc['median'] = [median_pre, median_post]\n\nprint(summary_stats)\n\n              pre       post\ncount   30.000000  30.000000\nmean    10.733333   7.900000\nstd      4.791755   6.666178\nmin      3.000000   0.000000\n25%      7.000000   2.000000\n50%     10.500000   7.000000\n75%     13.750000  12.750000\nmax     21.000000  23.000000\nmedian  10.500000   7.000000"
    +    "objectID": "contribution/contribution.html#how-to-get-involved",
    +    "href": "contribution/contribution.html#how-to-get-involved",
    +    "title": "Get Involved",
    +    "section": "",
    +    "text": "CAMIS is a community effort. Although this project does have a core team, the endeavor of tracking all these comparisons will fail without community contributions. We appreciate all contributions, big or small!\nYou can get involved in the following ways:\n\njoin our monthly online meetings\nreport a difference or request a new method by filing an issue\ncontribute to our documentation"
       },
       {
    -    "objectID": "python/ancova.html#ancova-in-python",
    -    "href": "python/ancova.html#ancova-in-python",
    -    "title": "Ancova",
    -    "section": "Ancova in Python",
    -    "text": "Ancova in Python\nIn Python, Ancova can be performed using the statsmodels library from the scipy package.\n\nimport statsmodels.api as sm\nimport statsmodels.formula.api as smf\nfrom tabulate import tabulate\n\n# Fit the ANCOVA model\nmodel_ancova = smf.ols('post ~ drug + pre', data=df).fit()\n\n# Summary of the model\nmodel_summary = model_ancova.summary()\nprint(model_summary)\n\n# Extracting glance (summary) information\nmodel_glance = {\n    'r_squared': model_ancova.rsquared,\n    'adj_r_squared': model_ancova.rsquared_adj,\n    'f_statistic': model_ancova.fvalue,\n    'f_pvalue': model_ancova.f_pvalue,\n    'aic': model_ancova.aic,\n    'bic': model_ancova.bic\n}\nmodel_glance_df = pd.DataFrame([model_glance])\nprint(tabulate(model_glance_df, headers='keys', tablefmt='grid'))\n\n# Extracting tidy (coefficients) information\nmodel_tidy = model_ancova.summary2().tables[1]\nprint(tabulate(model_tidy, headers='keys', tablefmt='grid'))\n\n                            OLS Regression Results                            \n==============================================================================\nDep. Variable:                   post   R-squared:                       0.676\nModel:                            OLS   Adj. R-squared:                  0.639\nMethod:                 Least Squares   F-statistic:                     18.10\nDate:                Thu, 10 Oct 2024   Prob (F-statistic):           1.50e-06\nTime:                        16:53:10   Log-Likelihood:                -82.054\nNo. Observations:                  30   AIC:                             172.1\nDf Residuals:                      26   BIC:                             177.7\nDf Model:                           3                                         \nCovariance Type:            nonrobust                                         \n==============================================================================\n                 coef    std err          t      P>|t|      [0.025      0.975]\n------------------------------------------------------------------------------\nIntercept     -3.8808      1.986     -1.954      0.062      -7.964       0.202\ndrug[T.D]      0.1090      1.795      0.061      0.952      -3.581       3.799\ndrug[T.F]      3.4461      1.887      1.826      0.079      -0.432       7.324\npre            0.9872      0.164      6.001      0.000       0.649       1.325\n==============================================================================\nOmnibus:                        2.609   Durbin-Watson:                   2.526\nProb(Omnibus):                  0.271   Jarque-Bera (JB):                2.148\nSkew:                           0.645   Prob(JB):                        0.342\nKurtosis:                       2.765   Cond. No.                         39.8\n==============================================================================\n\nNotes:\n[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n+----+-------------+-----------------+---------------+-------------+---------+---------+\n|    |   r_squared |   adj_r_squared |   f_statistic |    f_pvalue |     aic |     bic |\n+====+=============+=================+===============+=============+=========+=========+\n|  0 |    0.676261 |        0.638906 |       18.1039 | 1.50137e-06 | 172.108 | 177.712 |\n+----+-------------+-----------------+---------------+-------------+---------+---------+\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n|           |     Coef. |   Std.Err. |          t |       P>|t| |    [0.025 |   0.975] |\n+===========+===========+============+============+=============+===========+==========+\n| Intercept | -3.88081  |   1.9862   | -1.95388   | 0.0615519   | -7.96351  | 0.201887 |\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n| drug[T.D] |  0.108971 |   1.79514  |  0.0607037 | 0.952059    | -3.58098  | 3.79892  |\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n| drug[T.F] |  3.44614  |   1.88678  |  1.82646   | 0.0792846   | -0.432195 | 7.32447  |\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n| pre       |  0.987184 |   0.164498 |  6.00121   | 2.45433e-06 |  0.649054 | 1.32531  |\n+-----------+-----------+------------+------------+-------------+-----------+----------+\n\n\nPlease note that all values match with the corresponding R version, except for the AIC and BIC values, which differ slightly. This should be acceptable for most practical purposes in statistical analysis. Currently, there are ongoing discussions in the statsmodels community regarding the computational details of AIC and BIC.\nThe following code can be used to enforce complete consistency of AIC and BIC values with R outputs by adding 1 to the number of parameters:\n\nimport numpy as np\n\n# Manual calculation of AIC and BIC to ensure consistency with R\nn = df.shape[0]  # number of observations\nk = model_ancova.df_model + 1  # number of parameters (including intercept)\nlog_lik = model_ancova.llf  # log-likelihood\n\n# Adjusted number of parameters (including scale parameter)\nk_adjusted = k + 1\n\n# Manually calculate AIC and BIC to match R's behavior\naic_adjusted = 2 * k_adjusted - 2 * log_lik\nbic_adjusted = np.log(n) * k_adjusted - 2 * log_lik\n\nprint(f\"Number of observations (n): {n}\")\nprint(f\"Number of parameters (k_adjusted): {k_adjusted}\")\nprint(f\"Log-likelihood: {log_lik}\")\nprint(f\"AIC (adjusted): {aic_adjusted}\")\nprint(f\"BIC (adjusted): {bic_adjusted}\")\n\nNumber of observations (n): 30\nNumber of parameters (k_adjusted): 5.0\nLog-likelihood: -82.0537744890265\nAIC (adjusted): 174.107548978053\nBIC (adjusted): 181.11353588636376\n\n\nThere are different types of anova computations. The statsmodels.stats.anova.anova_lm function allows the types 1, 2 and 3. The code to compute these types is depicted below:\n\nimport statsmodels.formula.api as smf\nimport statsmodels.stats.anova as ssa\n\n# Center the predictor for Type III anova\n#df['pre_centered'] = df['pre'] - df['pre'].mean()\n\n# Fit the model for types I and II anova\nmodel = smf.ols('post ~ C(drug) + pre', data=df).fit()\n\n# Perform anova for types I and II\nancova_table_type_1 = ssa.anova_lm(model, typ=1)\nancova_table_type_2 = ssa.anova_lm(model, typ=2)\n\n# Fit the model for Type III anova with centered predictors\nmodel_type_3 = smf.ols('post ~ C(drug) + pre', data=df).fit()\nancova_table_type_3 = ssa.anova_lm(model_type_3, typ=3)\n\n# Calculate SSd (sum of squares for residuals)\nssd_type1 = ancova_table_type_1['sum_sq'].loc['Residual']\nssd_type2 = ancova_table_type_2['sum_sq'].loc['Residual']\nssd_type3 = ancova_table_type_3['sum_sq'].loc['Residual']\n\n# Calculate ges\nancova_table_type_1['ges'] = ancova_table_type_1['sum_sq'] / (ancova_table_type_1['sum_sq'] + ssd_type1)\nancova_table_type_2['ges'] = ancova_table_type_2['sum_sq'] / (ancova_table_type_2['sum_sq'] + ssd_type2)\nancova_table_type_3['ges'] = ancova_table_type_3['sum_sq'] / (ancova_table_type_3['sum_sq'] + ssd_type3)\n\n# Add SSd column\nancova_table_type_1['SSd'] = ssd_type1\nancova_table_type_2['SSd'] = ssd_type2\nancova_table_type_3['SSd'] = ssd_type3\n\n# Add significance column\nancova_table_type_1['p<0.05'] = ancova_table_type_1['PR(>F)'] < 0.05\nancova_table_type_2['p<0.05'] = ancova_table_type_2['PR(>F)'] < 0.05\nancova_table_type_3['p<0.05'] = ancova_table_type_3['PR(>F)'] < 0.05\n\n# Rename columns to match the R output\nancova_table_type_1.rename(columns={'sum_sq': 'SSn', 'df': 'DFn', 'F': 'F', 'PR(>F)': 'p'}, inplace=True)\nancova_table_type_1.reset_index(inplace=True)\nancova_table_type_1.rename(columns={'index': 'Effect'}, inplace=True)\n\nancova_table_type_2.rename(columns={'sum_sq': 'SSn', 'df': 'DFn', 'F': 'F', 'PR(>F)': 'p'}, inplace=True)\nancova_table_type_2.reset_index(inplace=True)\nancova_table_type_2.rename(columns={'index': 'Effect'}, inplace=True)\n\nancova_table_type_3.rename(columns={'sum_sq': 'SSn', 'df': 'DFn', 'F': 'F', 'PR(>F)': 'p'}, inplace=True)\nancova_table_type_3.reset_index(inplace=True)\nancova_table_type_3.rename(columns={'index': 'Effect'}, inplace=True)\n\n# Calculate DFd (degrees of freedom for residuals)\ndfd_type1 = ancova_table_type_1.loc[ancova_table_type_1['Effect'] == 'Residual', 'DFn'].values[0]\ndfd_type2 = ancova_table_type_2.loc[ancova_table_type_2['Effect'] == 'Residual', 'DFn'].values[0]\ndfd_type3 = ancova_table_type_3.loc[ancova_table_type_3['Effect'] == 'Residual', 'DFn'].values[0]\nancova_table_type_1['DFd'] = dfd_type1\nancova_table_type_2['DFd'] = dfd_type2\nancova_table_type_3['DFd'] = dfd_type3\n\n# Filter out the Residual row\nancova_table_type_1 = ancova_table_type_1[ancova_table_type_1['Effect'] != 'Residual']\nancova_table_type_2 = ancova_table_type_2[ancova_table_type_2['Effect'] != 'Residual']\nancova_table_type_3 = ancova_table_type_3[ancova_table_type_3['Effect'] != 'Residual']\n\n# Select and reorder columns to match the R output\nancova_table_type_1 = ancova_table_type_1[['Effect', 'DFn', 'DFd', 'SSn', 'SSd', 'F', 'p', 'p<0.05', 'ges']]\nancova_table_type_2 = ancova_table_type_2[['Effect', 'DFn', 'DFd', 'SSn', 'SSd', 'F', 'p', 'p<0.05', 'ges']]\nancova_table_type_3 = ancova_table_type_3[['Effect', 'DFn', 'DFd', 'SSn', 'SSd', 'F', 'p', 'p<0.05', 'ges']]"
    +    "objectID": "contribution/contribution.html#how-to-contribute-to-the-documentation",
    +    "href": "contribution/contribution.html#how-to-contribute-to-the-documentation",
    +    "title": "Get Involved",
    +    "section": "How to contribute to the documentation",
    +    "text": "How to contribute to the documentation\nPlease contribute by submitting a pull request (PR) and our team will review it.\n\nAdding a new page\nIf you are adding a new page, please follow our template guidelines: R or SAS page template and R vs SAS page template\nGood documentation on data, methods are very much appreciated!\n\n\nFirst-time contributors\nWelcome to CAMIS! Please read this article: Get started, which contains some useful information to help you navigate your first PR submission.\n\n\nAsking for help\nIf you need any assistance with setting up your workspace, do not hesitate to contact @DrLynTaylor, @statasaurus and @andreaczhang!"
       },
       {
    -    "objectID": "python/ancova.html#type-1-ancova-in-python",
    -    "href": "python/ancova.html#type-1-ancova-in-python",
    -    "title": "Ancova",
    -    "section": "Type 1 Ancova in Python",
    -    "text": "Type 1 Ancova in Python\n\nprint(tabulate(ancova_table_type_1, headers='keys', tablefmt='grid'))\n\n+----+----------+-------+-------+---------+---------+----------+-------------+----------+----------+\n|    | Effect   |   DFn |   DFd |     SSn |     SSd |        F |           p | p<0.05   |      ges |\n+====+==========+=======+=======+=========+=========+==========+=============+==========+==========+\n|  0 | C(drug)  |     2 |    26 | 293.6   | 417.203 |  9.14855 | 0.000981237 | True     | 0.413054 |\n+----+----------+-------+-------+---------+---------+----------+-------------+----------+----------+\n|  1 | pre      |     1 |    26 | 577.897 | 417.203 | 36.0145  | 2.45433e-06 | True     | 0.580743 |\n+----+----------+-------+-------+---------+---------+----------+-------------+----------+----------+"
    +    "objectID": "contribution/contribution.html#dissertation-projects",
    +    "href": "contribution/contribution.html#dissertation-projects",
    +    "title": "Get Involved",
    +    "section": "Dissertation projects",
    +    "text": "Dissertation projects\nAre you:\n\na student looking for a dissertation project?\nan academic looking for projects for your students?\na researcher who wants to partner with a university and student to help progress your research?\n\nIf so, check out this page, and contact Lyn @DrLynTaylor for more information."
       },
       {
    -    "objectID": "python/ancova.html#type-2-ancova-in-python",
    -    "href": "python/ancova.html#type-2-ancova-in-python",
    -    "title": "Ancova",
    -    "section": "Type 2 Ancova in Python",
    -    "text": "Type 2 Ancova in Python\n\nprint(tabulate(ancova_table_type_2, headers='keys', tablefmt='grid'))\n\n+----+----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|    | Effect   |   DFn |   DFd |      SSn |     SSd |        F |           p | p<0.05   |      ges |\n+====+==========+=======+=======+==========+=========+==========+=============+==========+==========+\n|  0 | C(drug)  |     2 |    26 |  68.5537 | 417.203 |  2.13613 | 0.138379    | False    | 0.141128 |\n+----+----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|  1 | pre      |     1 |    26 | 577.897  | 417.203 | 36.0145  | 2.45433e-06 | True     | 0.580743 |\n+----+----------+-------+-------+----------+---------+----------+-------------+----------+----------+"
    +    "objectID": "contribution/get_started.html",
    +    "href": "contribution/get_started.html",
    +    "title": "Get Started",
    +    "section": "",
    +    "text": "The following instructions provides a step-by-step workflow to set up your workspace. In general, you need\n\nGit, GitHub\nR and Rstudio (especially if you are working on an R article)\nQuarto\nSAS, python (if you work on these topics)\n\n\nSet up Git, Github, Rstudio\nYou will need to get git, github, and RStudio setup to talk to each other. To do this you will need to have a github account and git installed on your computer.\nTo connect your computer to github, we tend to recommend using a PAT because it is bit easier than SSH. We have a script that can help you set that up, found here.\nFor more information Jenny Bryan has a great bookdown explaining how to get setup, alternatively see the following link for a short guidance).\n\n\nFork CAMIS repository to your own\nNow with RStudio all setup, you will need to fork the repository, which basically mean you want to make a copy of this repository that you own, so it will be under your github profile. This will allow you to make changes, without needing direct permission.\nTo do this you will need to go into github, into the CAMIS repo, and click “fork”. This will give you some options of how you want to fork the repo, honestly you can just keep the defaults and then click “Create fork”\n\n\n\n\n\n\n\nClone to your own computer\nOnce you’ve created a copy of this repository, you’ll need to clone it from GitHub to your computer. Click the “code” button to do this.\nThe method you’ll use, either “HTTPS” or “SSH”, depends on how you’ve connected your computer to GitHub. If you’ve set up using a PAT, select the “HTTPS” tab. If you’ve used “SSH”, then choose that tab. Either way, you will need to copy the location in the box.\n\n\n\n\n\n\n\nCreate an Rstudio project with version control\nIn RStudio, you will need to create a new project and select “Version Control” in the project wizard. Then you will select “Git” and finally paste the location copied from github into the URL box. Finally hit “Create Project” and you should be good to go!\n\n\n\n\n\n\n\nCreate your own branch in Rstudio\nGo into RStudio and Create a branch – Give you are working from your own fork, this step it is a bit optional. It is up to you if you want to make a separate branch or not. But, it is generally considered good practice, especially if you are planning on contributing regularly. To do this from RStudio click the branch button (on the git tab top right). Within the box that comes up ensure you are on the “remote=origin” and “Sync branch with remote” is checked. You can name the branch something to do with the amends you intend to make.\n\n\nStart writing\nEdit and /or add files within the CAMIS directories. If you are adding SAS guidance store under sas folder, R guidance store under r folder, for “SAS vs R” comparison store under comp. Follow the naming convention of the files already stored in those folders.\n\n\nCommit your changes, push to remote\nWithin Rstudio - Commit each change or new file added, and push to the repo from within R studio. Once you have completed the change you want to make, it is time for a pull request. Before we start though, it is good to check that your branch on github contains all the update you have done. If not you may need to push from Rstudio before moving onto the pull request.\n\n\n\nThis is what it will look like if you still need to push\n\n\n\n\nCreate a pull request\nPull request in github - Back on your fork in github you will see that your repo is now ahead of the main CAMIS repository. The first thing you want to do is make sure there aren’t any conflict that have arisen with the main repository, so you need to click ‘Sync fork’.\n\n\n\n\n\nIf that is all good then you can create a pull request by clicking on ‘Contribute’ and then ‘Open pull request’. This brings you to a page where you can explain your pull request if you like or you can just confirm you would like to go through with this pull request.\nThe final step is to add a reviewer, please add DrLynTaylor, statasaurus and andreaczhang. For more details about making pull requests see create a pull request.\nOnce your change is approved, and merged into the origin, you will be able to see your changes on CAMIS. If you have made a branch in your fork the branch will be deleted and you will need to create a new branch to add further contributions. NOTE: you can make the new branch called the same as the old one if you wish but ensure you select to overwrite the previous one."
       },
       {
    -    "objectID": "python/ancova.html#type-3-ancova-in-python",
    -    "href": "python/ancova.html#type-3-ancova-in-python",
    -    "title": "Ancova",
    -    "section": "Type 3 Ancova in Python",
    -    "text": "Type 3 Ancova in Python\n\nprint(tabulate(ancova_table_type_3, headers='keys', tablefmt='grid'))\n\n+----+-----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|    | Effect    |   DFn |   DFd |      SSn |     SSd |        F |           p | p<0.05   |      ges |\n+====+===========+=======+=======+==========+=========+==========+=============+==========+==========+\n|  0 | Intercept |     1 |    26 |  61.2592 | 417.203 |  3.81767 | 0.0615519   | False    | 0.128034 |\n+----+-----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|  1 | C(drug)   |     2 |    26 |  68.5537 | 417.203 |  2.13613 | 0.138379    | False    | 0.141128 |\n+----+-----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n|  2 | pre       |     1 |    26 | 577.897  | 417.203 | 36.0145  | 2.45433e-06 | True     | 0.580743 |\n+----+-----------+-------+-------+----------+---------+----------+-------------+----------+----------+\n\n\nPlease note that the results are consistent with the results achieved with R, except for the first row of the type 3 table featuring the intercept."
    +    "objectID": "SAS/manova.html",
    +    "href": "SAS/manova.html",
    +    "title": "Multivariate Analysis of Variance in SAS",
    +    "section": "",
    +    "text": "Example 39.6 Multivariate Analysis of Variance from SAS MANOVA User Guide\nThis example employs multivariate analysis of variance (MANOVA) to measure differences in the chemical characteristics of ancient pottery found at four kiln sites in Great Britain. The data are from Tubb, Parker, and Nickless (1980), as reported in Hand et al. (1994).\nFor each of 26 samples of pottery, the percentages of oxides of five metals are measured. The following statements create the data set and invoke the GLM procedure to perform a one-way MANOVA. Additionally, it is of interest to know whether the pottery from one site in Wales (Llanederyn) differs from the samples from other sites; a CONTRAST statement is used to test this hypothesis.\n\n    #Example code\n    title \"Romano-British Pottery\";\n   data pottery;\n      input Site $12. Al Fe Mg Ca Na;\n      datalines;\n   Llanederyn   14.4 7.00 4.30 0.15 0.51\n   Llanederyn   13.8 7.08 3.43 0.12 0.17\n   Llanederyn   14.6 7.09 3.88 0.13 0.20\n   Llanederyn   11.5 6.37 5.64 0.16 0.14\n   Llanederyn   13.8 7.06 5.34 0.20 0.20\n   Llanederyn   10.9 6.26 3.47 0.17 0.22\n   Llanederyn   10.1 4.26 4.26 0.20 0.18\n   Llanederyn   11.6 5.78 5.91 0.18 0.16\n   Llanederyn   11.1 5.49 4.52 0.29 0.30\n   Llanederyn   13.4 6.92 7.23 0.28 0.20\n   Llanederyn   12.4 6.13 5.69 0.22 0.54\n   Llanederyn   13.1 6.64 5.51 0.31 0.24\n   Llanederyn   12.7 6.69 4.45 0.20 0.22\n   Llanederyn   12.5 6.44 3.94 0.22 0.23\n   Caldicot     11.8 5.44 3.94 0.30 0.04\n   Caldicot     11.6 5.39 3.77 0.29 0.06\n   IslandThorns 18.3 1.28 0.67 0.03 0.03\n   IslandThorns 15.8 2.39 0.63 0.01 0.04\n   IslandThorns 18.0 1.50 0.67 0.01 0.06\n   IslandThorns 18.0 1.88 0.68 0.01 0.04\n   IslandThorns 20.8 1.51 0.72 0.07 0.10\n   AshleyRails  17.7 1.12 0.56 0.06 0.06\n   AshleyRails  18.3 1.14 0.67 0.06 0.05\n   AshleyRails  16.7 0.92 0.53 0.01 0.05\n   AshleyRails  14.8 2.74 0.67 0.03 0.05\n   AshleyRails  19.1 1.64 0.60 0.10 0.03\n   ;\n   run;\n   \n   proc glm data=pottery;\n      class Site;\n      model Al Fe Mg Ca Na = Site;\n      contrast 'Llanederyn vs. the rest' Site 1 1 1 -3;\n      manova h=_all_ / printe printh;\n   run;\n\nAfter the summary information (1), PROC GLM produces the univariate analyses for each of the dependent variables (2-6). These analyses show that sites are significantly different for all oxides individually. You can suppress these univariate analyses by specifying the NOUNI option in the MODEL statement.\n1 Summary Information about Groups\n\n\n\n\n\n\n\n\n\n2 Univariate Analysis of Variance for Aluminum Oxide (AI)\n\n\n\n\n\n\n\n\n\n3 Univariate Analysis of Variance for Iron Oxide (Fe)\n\n\n\n\n\n\n\n\n\n4 Univariate Analysis of Variance for Calcium Oxide (Ca)\n\n\n\n\n\n\n\n\n\n5 Univariate Analysis of Variance for Magnesium Oxide (Mg)\n\n\n\n\n\n\n\n\n\n6 Analysis of Variance for Sodium Oxide (Na)\n\n\n\n\n\n\n\n\n\nThe PRINTE option in the MANOVA statement displays the elements of the error matrix (7), also called the Error Sums of Squares and Crossproducts matrix. The diagonal elements of this matrix are the error sums of squares from the corresponding univariate analyses.\nThe PRINTE option also displays the partial correlation matrix (7) associated with the E matrix. In this example, none of the oxides are very strongly correlated; the strongest correlation (r=0.488) is between magnesium oxide and calcium oxide.\n7 Error SSCP Matrix and Partial Correlations\n\n\n\n\n\n\n\n\n\nThe PRINTH option produces the SSCP matrix for the hypotheses being tested (Site and the contrast); (8 and 9). Since the Type III SS are the highest-level SS produced by PROC GLM by default, and since the HTYPE= option is not specified, the SSCP matrix for Site gives the Type III H matrix. The diagonal elements of this matrix are the model sums of squares from the corresponding univariate analyses.\nFour multivariate tests are computed, all based on the characteristic roots and vectors of \\(E^{-1}H\\). These roots and vectors are displayed along with the tests. All four tests can be transformed to variates that have distributions under the null hypothesis. Note that the four tests all give the same results for the contrast, since it has only one degree of freedom. In this case, the multivariate analysis matches the univariate results: there is an overall difference between the chemical composition of samples from different sites, and the samples from Llanederyn are different from the average of the other sites.\n8 Hypothesis SSCP Matrix and Multivariate Tests for Overall Site Effect\n\n\n\n\n\n\n\n\n\n9 Hypothesis SSCP Matrix and Multivariate Tests for Differences between Llanederyn and the Other Sites\n\n\n\n\n\n\n\n\n\nReferences\nSAS MANOVA User Guide"
       },
       {
    -    "objectID": "python/anova.html",
    -    "href": "python/anova.html",
    -    "title": "ANOVA",
    +    "objectID": "SAS/ttest_Paired.html",
    +    "href": "SAS/ttest_Paired.html",
    +    "title": "Paired t-test",
         "section": "",
    -    "text": "Analysis of VAriance (ANOVA) is a statistical test to measure the difference between means of more than two groups.It is best suited when the data is normally distributed. By partitioning total variance into components, ANOVA unravels relationship between variables and identifies the true source of variation. It can handle multiple factors and their interactions, providing a robust way to better understand intricate relationships."
    +    "text": "The Paired t-test is used when two samples are naturally correlated. In the Paired t-test, the difference of the means between the two samples is compared to a given number that represents the null hypothesis. For a Paired t-test, the number of observations in each sample must be equal.\nIn SAS, a Paired t-test is typically performed using PROC TTEST.\n\n\nBy default, SAS PROC TTEST t-test assumes normality in the data and uses a classic Student’s t-test.\n\n\nThe following data was used in this example.\n  data pressure;\n     input SBPbefore SBPafter @@;\n     datalines;\n  120 128   124 131   130 131   118 127\n  140 132   128 125   140 141   135 137\n  126 118   130 132   126 129   127 135\n  ;\n\n\n\nThe following code was used to test the comparison of two paired samples of Systolic Blood Pressure before and after a procedure.\n  proc ttest data=pressure;\n     paired SBPbefore*SBPafter;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe SAS paired t-test also supports analysis of lognormal data. Here is the data used for the lognormal analysis.\n\n\n  data auc;\n     input TestAUC RefAUC @@;\n     datalines;\n  103.4 90.11  59.92 77.71  68.17 77.71  94.54 97.51\n  69.48 58.21  72.17 101.3  74.37 79.84  84.44 96.06\n  96.74 89.30  94.26 97.22  48.52 61.62  95.68 85.80\n  ;\n\n\n\nFor cases when the data is lognormal, SAS offers the “DIST” option to chose between a normal and lognormal distribution. The procedure also offers the TOST option to specify the equivalence bounds.\n  proc ttest data=auc dist=lognormal tost(0.8, 1.25);\n     paired TestAUC*RefAUC;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nAs can be seen in the figure above, the lognormal variation of the TTEST procedure offers additional results for geometric mean, coefficient of variation, and TOST equivalence analysis. The output also includes multiple p-values."
       },
       {
    -    "objectID": "python/anova.html#introduction",
    -    "href": "python/anova.html#introduction",
    -    "title": "ANOVA",
    +    "objectID": "SAS/ttest_Paired.html#normal",
    +    "href": "SAS/ttest_Paired.html#normal",
    +    "title": "Paired t-test",
         "section": "",
    -    "text": "Analysis of VAriance (ANOVA) is a statistical test to measure the difference between means of more than two groups.It is best suited when the data is normally distributed. By partitioning total variance into components, ANOVA unravels relationship between variables and identifies the true source of variation. It can handle multiple factors and their interactions, providing a robust way to better understand intricate relationships."
    +    "text": "By default, SAS PROC TTEST t-test assumes normality in the data and uses a classic Student’s t-test.\n\n\nThe following data was used in this example.\n  data pressure;\n     input SBPbefore SBPafter @@;\n     datalines;\n  120 128   124 131   130 131   118 127\n  140 132   128 125   140 141   135 137\n  126 118   130 132   126 129   127 135\n  ;\n\n\n\nThe following code was used to test the comparison of two paired samples of Systolic Blood Pressure before and after a procedure.\n  proc ttest data=pressure;\n     paired SBPbefore*SBPafter;\n  run;\nOutput:"
       },
       {
    -    "objectID": "python/anova.html#anova-test-in-python",
    -    "href": "python/anova.html#anova-test-in-python",
    -    "title": "ANOVA",
    -    "section": "Anova Test in Python",
    -    "text": "Anova Test in Python\nTo perform a one-way ANOVA test in Python we can use the f_oneway() function from SciPy library. Similarly, to perform two-way ANOVA test anova_lm() function from the statsmodel library is frequently used.\nFor this test, we’ll create a data frame called df_disease taken from the SAS documentation. The corresponding data can be found here. In this experiment, we are trying to find the impact of different drug and disease group on the stem-length\n\nimport pandas as pd\nimport statsmodels.api as sm\nfrom statsmodels.formula.api import ols\n\n# Read the sample data\ndf = pd.read_csv(\"../data/sas_disease.csv\")\n\n\n#perform two-way ANOVA\nmodel = ols('y ~ C(drug) + C(disease) + C(drug):C(disease)', data=df).fit()\nsm.stats.anova_lm(model, typ=2)\n\n\n\n\n\n\n\n\nsum_sq\ndf\nF\nPR(>F)\n\n\n\n\nC(drug)\n3063.432863\n3.0\n9.245096\n0.000067\n\n\nC(disease)\n418.833741\n2.0\n1.895990\n0.161720\n\n\nC(drug):C(disease)\n707.266259\n6.0\n1.067225\n0.395846\n\n\nResidual\n5080.816667\n46.0\nNaN\nNaN"
    +    "objectID": "SAS/ttest_Paired.html#lognormal",
    +    "href": "SAS/ttest_Paired.html#lognormal",
    +    "title": "Paired t-test",
    +    "section": "",
    +    "text": "The SAS paired t-test also supports analysis of lognormal data. Here is the data used for the lognormal analysis.\n\n\n  data auc;\n     input TestAUC RefAUC @@;\n     datalines;\n  103.4 90.11  59.92 77.71  68.17 77.71  94.54 97.51\n  69.48 58.21  72.17 101.3  74.37 79.84  84.44 96.06\n  96.74 89.30  94.26 97.22  48.52 61.62  95.68 85.80\n  ;\n\n\n\nFor cases when the data is lognormal, SAS offers the “DIST” option to chose between a normal and lognormal distribution. The procedure also offers the TOST option to specify the equivalence bounds.\n  proc ttest data=auc dist=lognormal tost(0.8, 1.25);\n     paired TestAUC*RefAUC;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nAs can be seen in the figure above, the lognormal variation of the TTEST procedure offers additional results for geometric mean, coefficient of variation, and TOST equivalence analysis. The output also includes multiple p-values."
       },
       {
    -    "objectID": "Clustering_Knowhow.html",
    -    "href": "Clustering_Knowhow.html",
    -    "title": "Clustering_knowhow",
    +    "objectID": "SAS/summary-stats.html",
    +    "href": "SAS/summary-stats.html",
    +    "title": "Deriving Quantiles or Percentiles in SAS",
         "section": "",
    -    "text": "Clustering is a method of segregating unlabeled data or data points into different groups/clusters such that similar data points fall in the same cluster than those which differ from the others. The similarity measures are calculated using distance based metrics like Euclidean distance, Cosine similarity, Manhattan distance, etc.\nFor Example, In the graph given below, we can clearly see that the data points can be grouped into 3 clusters"
    +    "text": "Percentiles can be calculated in SAS using the UNIVARIATE procedure. The procedure has the option PCTLDEF which allows for five different percentile definitions to be used. The default is PCTLDEF=5, which uses the empirical distribution function to find percentiles.\nThis is how the 25th and 40th percentiles of aval in the dataset adlb could be calculated, using the default option for PCTLDEF.\n\nproc univariate data=adlb;\n  var aval;\n  output out=stats pctlpts=25 40 pctlpre=p;\nrun;\n\nThe pctlpre=p option tells SAS the prefix to use in the output dataset for the percentile results. In the above example, SAS will create a dataset called stats, containing variables p25 and p40."
       },
       {
    -    "objectID": "Clustering_Knowhow.html#what-is-clustering",
    -    "href": "Clustering_Knowhow.html#what-is-clustering",
    -    "title": "Clustering_knowhow",
    +    "objectID": "SAS/ranksum.html",
    +    "href": "SAS/ranksum.html",
    +    "title": "Mann-Whitney U/Wilcoxon rank sum test",
         "section": "",
    -    "text": "Clustering is a method of segregating unlabeled data or data points into different groups/clusters such that similar data points fall in the same cluster than those which differ from the others. The similarity measures are calculated using distance based metrics like Euclidean distance, Cosine similarity, Manhattan distance, etc.\nFor Example, In the graph given below, we can clearly see that the data points can be grouped into 3 clusters"
    +    "text": "The Mann-Whitney U test, also known as the Wilcoxon rank-sum test, is a nonparametric test used to compare differences between two independent samples. It’s particularly useful when the sample distributions are not normally distributed and the sample sizes are small (typically less than 30).\n\n\nTo perform a Mann-Whitney U test (also known as the Wilcoxon rank-sum test) in SAS, you can use the PROC NPAR1WAY procedure. Here’s a step-by-step guide:\n\nCreate the Dataset: If there are two groups (smoker and non-smoker) with their respective measurements birth weight, you can input the data as follows:\n\n/* Create dataset */\ndata bw;\n    input bw  grp $;\n    datalines;\n3.99    ns\n3.89    ns\n3.6     ns\n3.73    ns\n3.31    ns\n3.7     ns\n4.08    ns\n3.61    ns\n3.83    ns\n3.41    ns\n4.13    ns\n3.36    ns\n3.54    ns\n3.51    ns\n2.71    ns\n3.18    s\n2.74    s\n2.9     s\n3.27    s\n3.65    s\n3.42    s\n3.23    s\n2.86    s\n3.6     s\n3.65    s\n3.69    s\n3.53    s\n2.38    s\n2.34    s\n;\nrun;\n\nPerform the Mann-Whitney U Test: Use the PROC NPAR1WAY procedure to perform the test. The wilcoxon option specifies that you want to perform the Wilcoxon rank-sum test. When computing the asymptotic Wilcoxon two-sample test, PROC NPAR1WAY uses a continuity correction by default. If specify the CORRECT=NO option in the PROC NPAR1WAY statement, the procedure does not use a continuity correction.\n\n/* Perform Mann-Whitney U test - with continuity correction by default*/\nproc npar1way data=BW wilcoxon;\n    class grp;\n    var bw;\nrun;\n\n/* Perform Mann-Whitney U test - without continuity correction*/\nproc npar1way data=BW wilcoxon CORRECT=NO;\n    class grp;\n    var bw;\nrun;\n\n\n\n\n\n\nAs seen above, SAS outputs a table of Wilcoxon Scores for birth weight by non-smoker and smoker: the number (N); the sum of scores; the expected sum of scores under the null hypothesis; the standard deviation under the null hypothesis, and the observed mean score. The table also includes a footnote to specify that ties were handled by using the average score.\nSAS also outputs a table of Wilcoxon Two-sample Test. This table includes a footnote to specify that a continuiity correction of 0.5 is used.\nStatistic: 150.5000\nZ: -2.5756 (This is the test statistic after applying a continuity correction of 0.5)\nPr < Z: 0.0050 (This is the one-tailed p-value). The one-tailed p-value (Pr< Z) of 0.0050 suggests that there is a 0.5% chance of observing a test statistic as extreme as 1.2498 under the null hypothesis.\nPr > |Z|: 0.0100 (This is the two-tailed p-value). The two-tailed p-value (Pr > |Z|) of 0.0100 suggests that there is a 1.00 % chance of observing a test statistic as extreme as 1.2498 in either direction under the null hypothesis.\nThe t-distribution approximations provide similar p-values, indicating the robustness of the results.\nt Approximation Pr < Z: 0.0078 (This is the one-tailed p-value using a t-distribution approximation)\nt Approximation Pr > |Z|: 0.0156 (This is the two-tailed p-value using a t-distribution approximation)\nSince the p-values (both one-tailed and two-tailed) are less than the common significance level (e.g., 0.05), we can reject the null hypothesis. This means there is a significant difference between the two groups (ns and s) for the variable BW.\n\n\n\n\nAs seen above, Wilcoxon Two-Sample Test results are changed because No continuity correction is used."
       },
       {
    -    "objectID": "Clustering_Knowhow.html#type-of-clustering-algorithm",
    -    "href": "Clustering_Knowhow.html#type-of-clustering-algorithm",
    -    "title": "Clustering_knowhow",
    -    "section": "Type of Clustering Algorithm",
    -    "text": "Type of Clustering Algorithm\nSome of the popular clustering algorithms are:\n\nCentroid-based Clustering (Partitioning methods)\nDensity-based Clustering (Model-based methods)\nConnectivity-based Clustering (Hierarchical clustering)\nDistribution-based Clustering\n\n\n1.Centroid-based Clustering (Partitioning methods)\nPartitioning methods group data points on the basis of their closeness. The similarity measure chosen for these algorithms are Euclidean distance, Manhattan Distance or Minkowski Distance.\nThe primary drawback for these algorithms is we need to pre define the number of clusters before allocating the data points to a group.\nOne of the popular centroid based clustering technique is K means Clustering. \n\nK Means Clustering\nK means is an iterative clustering algorithm that works in these 5 steps:\n\nSpecify the desired number of clusters K: Let us choose k=2 for these 5 data points in 2-D space.\n\nRandomly assign each data point to a cluster: Let’s assign three points in cluster 1, shown using orange color, and two points in cluster 2, shown using grey color.\n\nCompute cluster centroids: Centroids correspond to the arithmetic mean of data points assigned to the cluster. The centroid of data points in the orange cluster is shown using the orange cross, and those in the grey cluster using a grey cross.\n\nAssigns each observation to their closest centroid, based on the Euclidean distance between the object and the centroid\n\nRe-computing the centroids for both clusters.\n\n\nWe will repeat the 4th and 5th steps until no further switching of data points between two clusters for two successive repeats. \n\n\nK-Means Clustering in R\nStep 1: Load packages\nFirst, we’ll load below packages that contain several useful functions regarding k-means clustering in R.\n\nlibrary(cluster) #Contain cluster function\nlibrary(dplyr) #Data manipulation\nlibrary(ggplot2) #Plotting function\nlibrary(readr) #Read and write excel/csv files\nlibrary(factoextra) #Extract and Visualize the Results of Multivariate Data Analyses\n\nStep 2: Load Data\nWe have used the “Mall_Customer” dataset in R for this case study.\n\n#Loading the data\ndf <- read_csv(\"data/Mall_Customers.csv\")\n\n#Structure of the data\nstr(df)\n\nspc_tbl_ [200 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)\n $ CustomerID            : chr [1:200] \"0001\" \"0002\" \"0003\" \"0004\" ...\n $ Genre                 : chr [1:200] \"Male\" \"Male\" \"Female\" \"Female\" ...\n $ Age                   : num [1:200] 19 21 20 23 31 22 35 23 64 30 ...\n $ Annual Income (k$)    : num [1:200] 15 15 16 16 17 17 18 18 19 19 ...\n $ Spending Score (1-100): num [1:200] 39 81 6 77 40 76 6 94 3 72 ...\n - attr(*, \"spec\")=\n  .. cols(\n  ..   CustomerID = col_character(),\n  ..   Genre = col_character(),\n  ..   Age = col_double(),\n  ..   `Annual Income (k$)` = col_double(),\n  ..   `Spending Score (1-100)` = col_double()\n  .. )\n - attr(*, \"problems\")=<externalptr> \n\n\ndataset consists of 200 customers data with their age, annual income and Spending score.\n\n#Rename the columns\ndf <- df %>% \n  rename(\"Annual_Income\"= `Annual Income (k$)`, \"Spending_score\"= `Spending Score (1-100)`)\n\n#remove rows with missing values\ndf <- na.omit(df)\n\n#scale each variable to have a mean of 0 and sd of 1\ndf1 <- df %>% \n  mutate(across(where(is.numeric), scale))\n\n#view first six rows of dataset\nhead(df1)\n\n# A tibble: 6 × 5\n  CustomerID Genre  Age[,1] Annual_Income[,1] Spending_score[,1]\n  <chr>      <chr>    <dbl>             <dbl>              <dbl>\n1 0001       Male    -1.42              -1.73             -0.434\n2 0002       Male    -1.28              -1.73              1.19 \n3 0003       Female  -1.35              -1.70             -1.71 \n4 0004       Female  -1.13              -1.70              1.04 \n5 0005       Female  -0.562             -1.66             -0.395\n6 0006       Female  -1.21              -1.66              0.999\n\n\n\nWe have separated the CustomerID and Genre from the dataset. The reason for removing these variables from the cluster dataset as Kmeans can handle only numerical variables.\nTo create cluster with categorical or ordinal variable we can use k-Medoid clustering. \n\ndf1 <- df1[,4:5]\n\nStep 3: Find the Optimal Number of Clusters\nTo perform k-means clustering in R we can use the built-in kmeans() function, which uses the following syntax:\n kmeans(data, centers, iter.max, nstart)\n where:\n - data: Name of the dataset.\n - centers: The number of clusters, denoted k.\n - iter.max (optional): The maximum number of iterations allowed. Default value is 10.\n - nstart (optional): The number of initial configurations. Default value is 1.\n\nCenters is the k of K Means. centers = 5 would results in 5 clusters being created. We need to predefine the k before the cluster process starts.\n\niter.max is the number of times the algorithm will repeat the cluster assignment and update the centers / centroids. Iteration stops after this many iterations even if the convergence criterion is not satisfied\nnstart is the number of times the initial starting points are re-sampled. It means at the initialization of Clusters you need to specify how many clusters you want and the algorithm will randomly find same number of centroids to initialize. nstart gives you an edge to initialize the centroids through re sampling.\nFor example if total number of cluster is 3 and nstart=25 then it extracts 3 sets of data, 25 times, and for each of these times, the algorithm is run (up to iter.max # of iterations) and the cost function (total sum of the squares) is evaluated and finally 3 centroids with lowest cost function are chosen to start the clustering process.\n\nTo find the best number of clusters/centroids there are two popular methods as shown below.\nA. Elbow Method:\nIt has two parts as explained below-\n\nWSS: The Within Sum of Squares (WSS) is the sum of distance between the centroids and every other data points within a cluster. Small WSS indicates that every data point is close to its nearest centroids.\nElbow rule/method: Here we plot out the WSS score against the number of K. Because with the number of K increasing, the WSS will always decrease; however, the magnitude of decrease between each k will be diminishing, and the plot will be a curve which looks like an arm that curled up. In this way, we can find out which point falls on the elbow.\n\n\nset.seed(1)\nwss<- NULL\n\n#Feeding different centroid/cluster and record WSS\n\nfor (i in 1:10){\n  fit = kmeans(df1,centers = i,nstart=25)\n  wss = c(wss, fit$tot.withinss)\n}\n\n#Visualize the plot\nplot(1:10, wss, type = \"o\", xlab='Number of clusters(k)')\n\n\n\n\n\n\n\n\nBased on the above plot at k=5 we can see an “elbow” where the sum of squares begins to “bend” or level off so the ideal number of clusters should be 5.\nThe above process to compute the “Elbow method” has been wrapped up in a single function (fviz_nbclust):\n\nfviz_nbclust(df1, kmeans, method = \"wss\",nstart=25)\n\n\n\n\n\n\n\n\nB. Silhouette Method:\nThe silhouette coefficient or silhouette score is a measure of how similar a data point is within-cluster (intra-cluster) compared to other clusters (inter-cluster).\nThe Silhouette Coefficient is calculated using the mean intra-cluster distance (a) and the mean nearest-cluster distance (b) for each sample. The Silhouette Coefficient for a sample is (b - a) / max(a, b)\nHere we will plot the silhouette width/coefficient for different number of clusters and will choose the point where the silhouette width is highest.\nPoints to Remember While Calculating Silhouette Coefficient:\nThe value of the silhouette coefficient is between [-1, 1]. A score of 1 denotes the best, meaning that the data points are very compact within the cluster to which it belongs and far away from the other clusters. The worst value is -1. Values near 0 denote overlapping clusters.\nIn this demonstration, we are going to see how silhouette method is used.\n\nsilhouette_score <- function(k){\n  km <- kmeans(df1, centers = k,nstart = 25)\n  ss <- silhouette(km$cluster, dist(df1))\n  mean(ss[, 3])\n}\nk <- 2:10\n\navg_sil <- sapply(k, silhouette_score)\nplot(k, type='b', avg_sil, xlab='Number of clusters', ylab='Average Silhouette Scores', frame=FALSE)\n\n\n\n\n\n\n\n\nFrom the above method we can see the silhouette width is highest at cluster 5 so the optimal number of cluster should be 5.\nSimilar to the elbow method, this process to compute the “average silhoutte method” has been wrapped up in a single function (fviz_nbclust):\n\nfviz_nbclust(df1, kmeans, method='silhouette',nstart=25)\n\n\n\n\n\n\n\n\nThe optimal number of clusters is 5.\nStep 4: Perform K-Means Clustering with Optimal K\nLastly, we can perform k-means clustering on the dataset using the optimal value for k of 5:\n\n#make this example reproducible\nset.seed(1)\n\n#perform k-means clustering with k = 5 clusters\nfit <- kmeans(df1, 5, nstart=25)\n#view results\nfit\n\nK-means clustering with 5 clusters of sizes 22, 35, 81, 39, 23\n\nCluster means:\n  Annual_Income Spending_score\n1    -1.3262173     1.12934389\n2     1.0523622    -1.28122394\n3    -0.2004097    -0.02638995\n4     0.9891010     1.23640011\n5    -1.3042458    -1.13411939\n\nClustering vector:\n  [1] 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5 1 5\n [38] 1 5 1 5 1 5 3 5 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3\n [75] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3\n[112] 3 3 3 3 3 3 3 3 3 3 3 3 4 2 4 3 4 2 4 2 4 3 4 2 4 2 4 2 4 2 4 3 4 2 4 2 4\n[149] 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2\n[186] 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4\n\nWithin cluster sum of squares by cluster:\n[1]  5.217630 18.304646 14.485632 19.655252  7.577407\n (between_SS / total_SS =  83.6 %)\n\nAvailable components:\n\n[1] \"cluster\"      \"centers\"      \"totss\"        \"withinss\"     \"tot.withinss\"\n[6] \"betweenss\"    \"size\"         \"iter\"         \"ifault\"      \n\n\nWe can visualize the clusters on a scatterplot that displays the first two principal components on the axes using the fivz_cluster() function:\n\n#plot results of final k-means model\n\nfviz_cluster(fit, data = df1)\n\n\n\n\n\n\n\n\nStep 5: Exporting the data by adding generated clusters\n\n#Adding the clusters in the main data\n\ndf_cluster <- df %>% \n  mutate(cluster=fit$cluster)\n\n#Creating Summary of created clusters based on existing variables\n\ndf_summary <- df_cluster %>% \n  group_by(cluster) %>% \n  summarise(records=n(),avg_age=mean(Age),avg_annual_income=mean(Annual_Income),avg_spending_score=mean(Spending_score))\n\nprint(df_summary)\n\n# A tibble: 5 × 5\n  cluster records avg_age avg_annual_income avg_spending_score\n    <int>   <int>   <dbl>             <dbl>              <dbl>\n1       1      22    25.3              25.7               79.4\n2       2      35    41.1              88.2               17.1\n3       3      81    42.7              55.3               49.5\n4       4      39    32.7              86.5               82.1\n5       5      23    45.2              26.3               20.9\n\n\nWe can create a group of potential customers to target based on their age, average annual income and average spending score."
    +    "objectID": "SAS/ranksum.html#mann-whitney-uwilcoxon-rank-sum-test-in-sas",
    +    "href": "SAS/ranksum.html#mann-whitney-uwilcoxon-rank-sum-test-in-sas",
    +    "title": "Mann-Whitney U/Wilcoxon rank sum test",
    +    "section": "",
    +    "text": "To perform a Mann-Whitney U test (also known as the Wilcoxon rank-sum test) in SAS, you can use the PROC NPAR1WAY procedure. Here’s a step-by-step guide:\n\nCreate the Dataset: If there are two groups (smoker and non-smoker) with their respective measurements birth weight, you can input the data as follows:\n\n/* Create dataset */\ndata bw;\n    input bw  grp $;\n    datalines;\n3.99    ns\n3.89    ns\n3.6     ns\n3.73    ns\n3.31    ns\n3.7     ns\n4.08    ns\n3.61    ns\n3.83    ns\n3.41    ns\n4.13    ns\n3.36    ns\n3.54    ns\n3.51    ns\n2.71    ns\n3.18    s\n2.74    s\n2.9     s\n3.27    s\n3.65    s\n3.42    s\n3.23    s\n2.86    s\n3.6     s\n3.65    s\n3.69    s\n3.53    s\n2.38    s\n2.34    s\n;\nrun;\n\nPerform the Mann-Whitney U Test: Use the PROC NPAR1WAY procedure to perform the test. The wilcoxon option specifies that you want to perform the Wilcoxon rank-sum test. When computing the asymptotic Wilcoxon two-sample test, PROC NPAR1WAY uses a continuity correction by default. If specify the CORRECT=NO option in the PROC NPAR1WAY statement, the procedure does not use a continuity correction.\n\n/* Perform Mann-Whitney U test - with continuity correction by default*/\nproc npar1way data=BW wilcoxon;\n    class grp;\n    var bw;\nrun;\n\n/* Perform Mann-Whitney U test - without continuity correction*/\nproc npar1way data=BW wilcoxon CORRECT=NO;\n    class grp;\n    var bw;\nrun;"
       },
       {
    -    "objectID": "publication/index.html",
    -    "href": "publication/index.html",
    -    "title": "Publications",
    +    "objectID": "SAS/ranksum.html#results",
    +    "href": "SAS/ranksum.html#results",
    +    "title": "Mann-Whitney U/Wilcoxon rank sum test",
         "section": "",
    -    "text": "Whitepaper\nKey Considerations When Understanding Differences in Statistical Methodology Implementations Across Programming Languages - An Introduction to the CAMIS Project\nRead the whitepaper here\n\n\nConference presentations\n\n2024 Conference Schedule\nList of seminars and conferences that the CAMIS team will be attending in 2024.\nIf you are a volunteer on the CAMIS project and plan to present at a seminar or conference, please add details of the conference below. For help with slides or content go to HERE.\nTo cite the CAMIS project work in online content or presentations please use: “Content reproduced with the permission of PHUSE CAMIS - A DVOST Working Group”.\n\n\n\nConference name\nDate (2024)\nLocation\nName Attending\nDetails\nWebsite\n\n\n\n\nRSS Local Group Seminar\n28 Feb\nSheffield, England\nLyn Taylor\nSlides\nRSS\n\n\nphuse US Connect\n25-28 Feb\nBethesa, Maryland, USA\nSoma Sekhar Sriadibhatla, Vikash Jain, Brian Varney\nPoster\nConnect\n\n\nphuse chapter connect\n03 APR\nBangalore\nHarshal Khanolkar\n\n\n\n\nphuse/FDA CSS\n3-5 June\nSilver Spring Maryland, USA\nMike Stackhouse\nCAMIS Discussion\nCSS\n\n\nR/Medicine\n10-14 June\nOnline\nAgnieszka Tomczyk, Lyn Taylor\nPart1 and Part2 and slides\nR/Medicine 2024\n\n\nUseR!\n8-11 July\nSalzburg, Austria\nChi Zhang\nPresentation\nuseR! 2024\n\n\nphuse EU\n11-13 Nov\nStrasbourg, France\nAgnieszka Tomczyk, Christina Fillmore\nPresentation\nPHUSE EU Connect\n\n\n\n\n\nYearly Conference Planner\nTo help to plan our attendance throughout the year, here is a list of conferences we are looking to send representation to. If you plan to attend one of these conferences and are interested in representing us, then please get in touch.\n\n\n\nConference name\nUsual Abstract Deadline\nUsual Conference Date\nRegion\nLinks\n\n\n\n\nJoint Statistical Meetings (JSM) American Statistical Association (ASA)\n1st February\n1st week of August\nUSA\nJSM-ASA\n\n\nASA Biopharmaceutical Section Regulatory-Industry Statistics workshop\nEnd March\nLast week of September\nUSA\nBIOP\n\n\nPhuse US Connect\nNovember\nLast week of Feb\nUSA\nCDISC\n\n\nPhuse/FDA Computational Science Symposium(CSS)\nDecember\n1st week of June\nUSA\nCSS\n\n\nIASCT (ConSPIC)\nMid March\nEarly May\nIndia\nIASCT\n\n\nSociety of Clinical Trials (SCT)\nJanuary\nMid May\nUSA\nSCT\n\n\nPharmaSUG\nMid Jan\nMid May\nUSA\nPharmaSUG\n\n\nuseR\nEarly March\nEarly July\nEurope/Online\nuseR\n\n\nPSI\nNov-oral, Feb-Poster\nMid June\nEurope\nPSI\n\n\nDIA Global\nEnd Feb-poster\nMid June\nUSA\nDIA-USA\n\n\nDIA Europe\nNov\nMid March\nEurope\nDIA-Europe\n\n\nDIA China\nJan\nMid May\nChina\nDIA-China\n\n\nInternational Society for Clinical Biostatistics (ISCB)\nMid Feb\nMid July\nEurope\nISCB\n\n\nRoyal Statistical Society (RSS)\nEarly April\nEarly September\nEngland\nRSS\n\n\nSouthEast SAS User Group (SESUG)\nEnd Feb\nEnd Sept\nMaryland, USA\nSESUG\n\n\nPHUSE EU Connect\nMid March\nMid Nov\nEurope\nPHUSE EU Connect\n\n\nR/Pharma\nApril\nMid October\nVirtual\nR/pharma\n\n\nPOSIT conf.\nInvite only\nSeptember\nUSA\nPOSIT conf"
    +    "text": "As seen above, SAS outputs a table of Wilcoxon Scores for birth weight by non-smoker and smoker: the number (N); the sum of scores; the expected sum of scores under the null hypothesis; the standard deviation under the null hypothesis, and the observed mean score. The table also includes a footnote to specify that ties were handled by using the average score.\nSAS also outputs a table of Wilcoxon Two-sample Test. This table includes a footnote to specify that a continuiity correction of 0.5 is used.\nStatistic: 150.5000\nZ: -2.5756 (This is the test statistic after applying a continuity correction of 0.5)\nPr < Z: 0.0050 (This is the one-tailed p-value). The one-tailed p-value (Pr< Z) of 0.0050 suggests that there is a 0.5% chance of observing a test statistic as extreme as 1.2498 under the null hypothesis.\nPr > |Z|: 0.0100 (This is the two-tailed p-value). The two-tailed p-value (Pr > |Z|) of 0.0100 suggests that there is a 1.00 % chance of observing a test statistic as extreme as 1.2498 in either direction under the null hypothesis.\nThe t-distribution approximations provide similar p-values, indicating the robustness of the results.\nt Approximation Pr < Z: 0.0078 (This is the one-tailed p-value using a t-distribution approximation)\nt Approximation Pr > |Z|: 0.0156 (This is the two-tailed p-value using a t-distribution approximation)\nSince the p-values (both one-tailed and two-tailed) are less than the common significance level (e.g., 0.05), we can reject the null hypothesis. This means there is a significant difference between the two groups (ns and s) for the variable BW.\n\n\n\n\nAs seen above, Wilcoxon Two-Sample Test results are changed because No continuity correction is used."
       },
       {
    -    "objectID": "publication/conference.html",
    -    "href": "publication/conference.html",
    -    "title": "Conferences",
    +    "objectID": "SAS/summary_skew_kurt.html",
    +    "href": "SAS/summary_skew_kurt.html",
    +    "title": "Skewness/Kurtosis",
         "section": "",
    -    "text": "2024 Conference Schedule\nList of seminars and conferences that the CAMIS team will be attending in 2024.\nIf you are a volunteer on the CAMIS project and plan to present at a seminar or conference, please add details of the conference below. For help with slides or content go to HERE.\nIf you want a single slide which advertises the CAMIS project, you can find this HERE\nTo cite the CAMIS project work in online content or presentations please use: “Content reproduced with the permission of PHUSE CAMIS - A DVOST Working Group”.\n\n\n\nConference name\nDate (2024)\nLocation\nName Attending\nDetails\nWebsite\n\n\n\n\nRSS Local Group Seminar\n28 Feb\nSheffield, England\nLyn Taylor\nSlides\nRSS\n\n\nphuse US Connect\n25-28 Feb\nBethesa, Maryland, USA\nSoma Sekhar Sriadibhatla, Vikash Jain, Brian Varney\nPoster\nConnect\n\n\nphuse chapter connect\n03 APR\nBangalore\nHarshal Khanolkar\n\n\n\n\nphuse/FDA CSS\n3-5 June\nSilver Spring Maryland, USA\nMike Stackhouse\nCAMIS Discussion\nCSS\n\n\nR/Medicine\n10-14 June\nOnline\nAgnieszka Tomczyk, Lyn Taylor\nslides\nR/Medicine 2024\n\n\nUseR!\n8-11 July\nSalzburg, Austria\nChi Zhang\nPresentation\nuseR! 2024\n\n\nPHUSE Belgian SDE\n23 Sept\nBrussels, Belgium\nQian Wang (msd)\nPresentation\nPHUSE SDE\n\n\nSESUG\n22-24 Sept\nBethesda, MD, USA\nBrian\n\nSESUG 2024\n\n\nR/pharma APAC track\n30 Oct- 1 Nov\nOnline, APAC\nSamrit Pramanik\nPresentation\n\n\n\nphuse EU\n11-13 Nov\nStrasbourg, France\nAgnieszka Tomczyk, Christina Fillmore, Stephen Mccawille and Anwesha Roy\nPresentation\nPHUSE EU Connect\n\n\nEffective statistician conference\n11-12 Nov\nVirtual\nLyn Taylor\nPresentation\nlink\n\n\n\n\n\nYearly Conference Planner\nTo help to plan our attendance throughout the year, here is a list of conferences we are looking to send representation to. If you plan to attend one of these conferences and are interested in representing us, then please get in touch.\n\n\n\nConference name\nUsual Abstract Deadline\nUsual Conference Date\nRegion\nLinks\n\n\n\n\nJoint Statistical Meetings (JSM) American Statistical Association (ASA)\n1st February\n1st week of August\nUSA\nJSM-ASA\n\n\nASA Biopharmaceutical Section Regulatory-Industry Statistics workshop\nEnd March\nLast week of September\nUSA\nBIOP\n\n\nPhuse US Connect\nNovember\nLast week of Feb\nUSA\nCDISC\n\n\nPhuse/FDA Computational Science Symposium(CSS)\nDecember\n1st week of June\nUSA\nCSS\n\n\nIASCT (ConSPIC)\nMid March\nEarly May\nIndia\nIASCT\n\n\nSociety of Clinical Trials (SCT)\nJanuary\nMid May\nUSA\nSCT\n\n\nPharmaSUG\nMid Jan\nMid May\nUSA\nPharmaSUG\n\n\nuseR\nEarly March\nEarly July\nEurope/Online\nuseR\n\n\nPSI\nNov-oral, Feb-Poster\nMid June\nEurope\nPSI\n\n\nDIA Global\nEnd Feb-poster\nMid June\nUSA\nDIA-USA\n\n\nDIA Europe\nNov\nMid March\nEurope\nDIA-Europe\n\n\nDIA China\nJan\nMid May\nChina\nDIA-China\n\n\nInternational Society for Clinical Biostatistics (ISCB)\nMid Feb\nMid July\nEurope\nISCB\n\n\nRoyal Statistical Society (RSS)\nEarly April\nEarly September\nEngland\nRSS\n\n\nSouthEast SAS User Group (SESUG)\nEnd Feb\nEnd Sept\nMaryland, USA\nSESUG\n\n\nPHUSE EU Connect\nMid March\nMid Nov\nEurope\nPHUSE EU Connect\n\n\nR/Pharma\nApril\nMid October\nVirtual\nR/pharma\n\n\nPOSIT conf.\nInvite only\nSeptember\nUSA\nPOSIT conf"
    +    "text": "In SAS, Skewness and Kurtosis are usually calculated using PROC MEANS. The procedures can produce both statistics in the same call. The procedure provides options for different methodologies.\n\n\nThe following data was used in this example.\n  data dat;\n      input team $ points assists;\n      datalines;\n  A 10 2\n  A 17 5\n  A 17 6\n  A 18 3\n  A 15 0\n  B 10 2\n  B 14 5\n  B 13 4\n  B 29 0\n  B 25 2\n  C 12 1\n  C 30 1\n  C 34 3\n  C 12 4\n  C 11 7\n  ;\n  run;\n\n\n\nBy default, SAS PROC MEANS uses VARDEF option “DF”. The other options are “N”, “WEIGHT”, and “WDF. Note that the WEIGHT and WDF options produce no results, as weighted calculations are not supported in PROC MEANS for Skewness and Kurtosis.\nThe following shows the SAS documentation for the two measures.\n\n\nThe SAS documentation for Skewness is provided here for convenience:\n\n\n\n\n\n\n\n\n\n\n\n\nThe SAS documentation for Kurtosis is as follows:\n\n\n\n\n\n\n\n\n\n\n\n\nSkewness and Kurtosis are commonly calculated in SAS as follows:\n  proc means data=dat SKEWNESS KURTOSIS;\n  var points;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nThe above results correspond to the Type 2 methodology in R.\n\n\n\nThe N option produces the following results\n  proc means data=dat SKEWNESS KURTOSIS vardef = N;\n  var points;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nThe above results correspond to the Type 1 methodology in R.\n\n\n\n\nSAS options provide for Type 1 and Type 2 Skewness and Kurtosis. Skewness Type 3 and Kurtosis Type 3 are not supported. Also Pearson’s Kurtosis is not supported."
       },
       {
    -    "objectID": "non_website_content/dissertations/202406_MMRM.html",
    -    "href": "non_website_content/dissertations/202406_MMRM.html",
    -    "title": "A comparison of MMRM methodology in SAS and R software",
    +    "objectID": "SAS/summary_skew_kurt.html#sas",
    +    "href": "SAS/summary_skew_kurt.html#sas",
    +    "title": "Skewness/Kurtosis",
         "section": "",
    -    "text": "NOTE: This project is no longer available for selection.\nAbstract:\nThe mixed model for repeated measures (MMRM) is commonly used in individual clinical trials due to its suitability to model longitudinal continuous data outcomes measured at set timepoints over time. However, there is much complexity in this methodology such that replication of analysis methods and results produced in SAS vs open source software such as R may not be straight forward.\nThe primary objective of this project is to build on the information already documented here CAMIS - A PHUSE DVOST Working Group (psiaims.github.io) under Repeated Measures (Linear Mixed Model (MMRM) section) and provide both PAREXEL and the wider pharmaceutical industry with a comprehensive guide for how to implement and replicate MMRMs analysis methods in SAS and R.\nIt is expected that the project will consist of performing a thorough comparison of MMRM analysis methods in SAS (using Proc Mixed and Proc GLIMMIX) versus in R (nlme::gls, lme4::lmer, and glmmTMB::glmmTMB and mmrm::mmrm). The project will discuss and document the options available in each, detailing similarities and differences in default options, available options and analysis results.\nThe project plan for this study is expected to consist of\n1 Self teaching in the MMRM methodology to understand how to apply the methods, the common options available when model fitting, their strengths and limitations in clinical research\n2 Literature search to investigate\n\nLatest advance in current methods and guidance\nR packages available for use to apply these methods\nSAS procedures available to apply these methods\nAny current research or evidence of researchers comparing methods in SAS vs R.\n\n3 Using one or more datasets (simulated or existing in open source, testing both small and large datasets), fit a selection of MMRM modelling methods using various software/package and options to see if SAS and R return the same results. Investigate and document the reasons for any differences. \nPossible extensions (if time permits):\n\nInvestigate Categorical MMRMs\nInvestigate the Bayesian MMRM options available in both software and document any differences.\nInvestigate pythons application of such methods with comparison to SAS and R"
    +    "text": "By default, SAS PROC MEANS uses VARDEF option “DF”. The other options are “N”, “WEIGHT”, and “WDF. Note that the WEIGHT and WDF options produce no results, as weighted calculations are not supported in PROC MEANS for Skewness and Kurtosis.\nThe following shows the SAS documentation for the two measures.\n\n\nThe SAS documentation for Skewness is provided here for convenience:\n\n\n\n\n\n\n\n\n\n\n\n\nThe SAS documentation for Kurtosis is as follows:\n\n\n\n\n\n\n\n\n\n\n\n\nSkewness and Kurtosis are commonly calculated in SAS as follows:\n  proc means data=dat SKEWNESS KURTOSIS;\n  var points;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nThe above results correspond to the Type 2 methodology in R.\n\n\n\nThe N option produces the following results\n  proc means data=dat SKEWNESS KURTOSIS vardef = N;\n  var points;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nThe above results correspond to the Type 1 methodology in R."
       },
       {
    -    "objectID": "non_website_content/Conferences 2023 archive.html",
    -    "href": "non_website_content/Conferences 2023 archive.html",
    -    "title": "Conferences",
    +    "objectID": "SAS/summary_skew_kurt.html#summary",
    +    "href": "SAS/summary_skew_kurt.html#summary",
    +    "title": "Skewness/Kurtosis",
         "section": "",
    -    "text": "Conference Programme\nWe plan to showcase the CAMIS project at a number of conferences throughout 2023 and 2024. See below the list of conferences the CAMIS team will be at and please come say hello to us !\n\n\n\n\n\n\n\n\n\n\n\nConference\n2023/2024 Planning dates\n2023 Date & Location\n2023 Main Contact\nAlso attending\nDetails\n\n\n\n\nJSM (ASA conference)\nAbstract Feb 2024\n\nLeon Shih\n\n\n\n\nPHUSE US Connect\nTBC for 2024\n5-8 March 2023 Orlando, Florida\nSoma Sekhar\n\nPresentation\n\n\nDISS (Duke industry statistics symposium)\nTBC for 2024\n29-31st March 2023 Virtual\nMolly MacDiarmid (2023)\n\nPoster\n\n\nPSDM(Pharmaceutical statistics and data management)\n\n19 Apr 2023 Netherlands\n\n\n\n\n\nIASCT (ConSPIC - conference for statistics and programming in clinical research)\nAbstract submission 14 Mar-3rd Apr\n4-6 May 2023 Bengaluru, India\nHarshal Khanolkar\n\nTalk. and/or poster\n\n\nSociety of Clinical Trials (SCT\n\n21-24 May 2023\nMichael Kane\n\n\n\n\nuse R\nTBC\nJune 2024?\n\n\n\n\n\nPSI 2023 Conference\nTalk submission Nov.\nPoster submission Feb.\n11-14 June 2023 Hammersmith London West, England\nMartin Brown\nChristina Fillmore\nLyn Taylor\nMolly Macdiarmid\nMartin Brown\nAiming Yang\nOral & poster submission completed\n\n\nDIA 2023 Global Annual Meeting\n\n25-29 June 2023 Boston MA, USA\n\n\n\n\n\nJoint statistical meeting (JSM)\nFeb 2024 submission for next year\n5-10 Aug 2023 Toronto, Ontario, Canada\n\n\n\n\n\nISCB Conference\n\n27-31 Aug 2023 Milan-Italy\n\n\n\n\n\nRSS conference\nAbstract by 6th April\n4-7 sept 2023 Harrogate, England\nLyn Taylor\n\nConfirmed oral presentation\n\n\nPHUSE/FDA Quarterly meeting\nSeptember 13 (10:00 EDT/15:00 BST)\nWG can present their work, share their progress, and request any FDA \nsupport\nLyn Taylor\n\n30 min presentation\n\n\nPHUSE CSS\n15th June Abstract open, register by 30th june\n(TBC 2024 DVOST breakout sessions)\nSept 18-20, Maryland USA\nSoma Sekhar\nVikash Jain\nAditee Dani\nPoster\n\n\nASA Bio pharmaceutical Section Regulatory-industry Statistics Workshop\n\n27-29 Sept 2023 Rockville, Maryland, USA\n\n\n\n\n\nEASD 2023 - European Association for study of diabetes\n\n02-06 Oct 2023 Hamberg Germany\n\n\n\n\n\nSESUG (South East SAS user group)\n\n17-19 Oct 2023\nBrian Varney\n\n\n\n\nPHUSE EU Connect 2023\n\n5-8 November 2023 ICC Birmingham, England\nJayashree vendanayagam\n\nPresenting on shiny App for regulatory submission (will include CAMIS advert)\n\n\nR in Pharma\n\n\nNov Virtual\nBrian Varney/ Christina Fillmore?\n\nForm open. Christina to speak to Brian.\n\n\nPOSIT conf.\nInvite only\nSeptember - Chicago\nJulianne Manitz & Doug Kelkhoff\n\nR Validation Hub team will include a slide for us. (Juliane Manitz/Doug Kelkhoff)\n\n\nPHUSE (Single day events) SDEs\n\nMississauga\nJune 8th\nJayashree vendanayagam\n\nPresenting on shiny App for regulatory submission (will include CAMIS advert)\n\n\nPHUSE (Single day events) SDEs\n\nNew York (Oct 16th)\nAiming Yang\n\nEmailed host to have poster/ talk/ advert"
    +    "text": "SAS options provide for Type 1 and Type 2 Skewness and Kurtosis. Skewness Type 3 and Kurtosis Type 3 are not supported. Also Pearson’s Kurtosis is not supported."
       },
       {
    -    "objectID": "minutes/posts/23Jan2023.html",
    -    "href": "minutes/posts/23Jan2023.html",
    -    "title": "New Website Discussion",
    +    "objectID": "SAS/survival.html",
    +    "href": "SAS/survival.html",
    +    "title": "Survival Analysis Using SAS",
         "section": "",
    -    "text": "attendees\n23_Jan_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nYes\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nYes\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nNo\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo"
    +    "text": "The most commonly used survival analysis methods in clinical trials include:\nAdditionally, other methods for analyzing time-to-event data are available, such as:\nWhile these models may be explored in a separate document, this particular document focuses solely on the three most prevalent methods: KM estimators, log-rank test and Cox PH model."
       },
       {
    -    "objectID": "minutes/posts/23Jan2023.html#christina-provided-a-summary-of-work-to-date-on-the-website",
    -    "href": "minutes/posts/23Jan2023.html#christina-provided-a-summary-of-work-to-date-on-the-website",
    -    "title": "New Website Discussion",
    -    "section": "Christina provided a summary of work to date on the website",
    -    "text": "Christina provided a summary of work to date on the website\nRepo now live: [https://psiaims.github.io/CAMIS/]\nPrimary mode of navigation will be the table of contents..\nComprehensive Search function is available to supplement the use of the TOC.\nThe website is build from 3 folders in github:\nR SAS Comp\nThese folders, map to the columns of the table, I.e. everything about R is in Quarto files under R.\nComp folder: for the Comparison – name sure you name the two software you are using r-sas - so we can use this when dynamically selecting.\nIn future we can add Python / Julia directories.\nThe idea would be for people to use the: [CAMIS/templates/R_template.qmd] - A template of how to write documentation for the R part of the site. They’d Edit template & save it back into the R folder naming it clearly for what it is. Template should also contain name packages being used at start of each method comparison. It’d be difficult to be exhaustive with all the survival analysis packages i.e. accelerated failure time packages, etc.., but as long as stated hopefully can grow over time.\nThe Data-info folder – contains description of all data being used for the comparisons. Going forward if different data used, the information about the data would be put into this folder. This allows the data description to sit outside of the comparison folders & where possible same data be used across comparisons.\n\nQuestions & Discussion\nJoe & Michael raised that the About tab which has information about the project is out of date, so should be updated. We also have no detail on the driving mechanism… I.e. what we would like from collaborators. Add “How to collaborate” button.\nItems to be discussed further which may need to be included in the site:\n\nupdate Methods: needs to make it more robust to future uploads - i.e. topics within linear models? (Sub categories) focus on methods, but how sort the methods for inclusion of all in future\nRating the software discrepancies. I..e How severe the difference is?\nNeed to create a template for comparisons. Discuss if we would have a purpose/highlight of comparison/ summary/conclusions at the top first. Also if we put List of R packages this comparison uses (use Tags?) - Need to consider if package superseeded/ multiple packages whether they go in 1 document or multiple.\nHow to expand to sort by: therapeutic area relevance (would be good to link from methods to Oncology somehow\nWhat if a different package.., does same analysis… have to make it clear which package is being used & include multiple packages. It was agreed that as long as we are clear on what we have compared then Its ok to not be all inclusive. That can be added by other collaborators later. It was noted by Kyle that for survival (I.e. accelerated failure time packages), it may be hard to include all. The recommendation is to start with 1 and can expand further as it grows. We may have to re-think website design as it grows to accommodate. Hence why we want everything written in smaller parts to can easily manipulate going forward."
    +    "objectID": "SAS/survival.html#example-data",
    +    "href": "SAS/survival.html#example-data",
    +    "title": "Survival Analysis Using SAS",
    +    "section": "Example Data",
    +    "text": "Example Data\nData source: https://stats.idre.ucla.edu/sas/seminars/sas-survival/\nThe data include 500 subjects from the Worcester Heart Attack Study. This study examined several factors, such as age, gender and BMI, that may influence survival time after heart attack. Follow up time for all participants begins at the time of hospital admission after heart attack and ends with death or loss to follow up (censoring). The variables used here are:\n\nlenfol: length of followup, terminated either by death or censoring - time variable\nfstat: loss to followup = 0, death = 1 - censoring variable\nafb: atrial fibrillation, no = 0, 1 = yes - explanatory variable\ngender: males = 0, females = 1 - stratification factor\n\n\nlibname mylib \"..\\data\";\n\ndata dat;\nset mylib.whas500;\nlenfoly = round(lenfol/365.25, 0.01);  /* change follow-up days to years for better visualization*/\nrun;"
       },
       {
    -    "objectID": "minutes/posts/23Jan2023.html#min-hua-provided-an-update-on-the-white-paper",
    -    "href": "minutes/posts/23Jan2023.html#min-hua-provided-an-update-on-the-white-paper",
    -    "title": "New Website Discussion",
    -    "section": "Min-Hua provided an update on the white paper:",
    -    "text": "Min-Hua provided an update on the white paper:\nIn its final stages of review by team, and will now be sent for wider review."
    +    "objectID": "SAS/survival.html#the-non-stratified-model",
    +    "href": "SAS/survival.html#the-non-stratified-model",
    +    "title": "Survival Analysis Using SAS",
    +    "section": "The Non-stratified Model",
    +    "text": "The Non-stratified Model\nFirst we try a non-stratified analysis following the mock-up above to describe the association between survival time and afb (atrial fibrillation).\nThe KM estimators and log-rank test are from PROC LIFETEST, and Cox PH model is conducted using PROC PHREG.\n\nKM estimators and log-rank test\n\nproc lifetest data=dat outsurv=_SurvEst timelist= 1 3 5 reduceout stderr; \ntime lenfoly*fstat(0);\nstrata afb;\nrun;\n\nThe landmark estimates and quartile estimates for AFB = 0 group are as shown in below:\n\n\n\n\n\n\n\n\n\nThe logrank test result is in below:\n\n\n\n\n\n\n\n\n\n\n\nCox PH model\n\nproc phreg data = dat;\nclass afb;\nmodel lenfol*fstat(0) = afb/rl;\nrun;\n\nThe hazard ratio and confidence intervals are shown as below:"
       },
       {
    -    "objectID": "minutes/posts/13May2024.html",
    -    "href": "minutes/posts/13May2024.html",
    -    "title": "2024 Goals",
    +    "objectID": "SAS/survival.html#the-stratified-model",
    +    "href": "SAS/survival.html#the-stratified-model",
    +    "title": "Survival Analysis Using SAS",
    +    "section": "The Stratified Model",
    +    "text": "The Stratified Model\nIn a stratified model, the Kaplan-Meier estimators remain the same as those in the non-stratified model. To implement stratified log-rank tests and Cox proportional hazards models, simply add the STRATA option in both PROC LIFETEST and PROC PHREG.\n\n# KM estimators and log-rank test\nproc lifetest data=dat;\ntime lenfoly*fstat(0);\nstrata gender/group = afb;\nrun;\n\n# Cox PH model\nproc phreg data=dat;\nclass afb;\nmodel lenfol*fstat(0) = afb/rl;\nstrata gender;\nrun;"
    +  },
    +  {
    +    "objectID": "SAS/wilcoxonsr_HL.html",
    +    "href": "SAS/wilcoxonsr_HL.html",
    +    "title": "Wilcoxon signed-rank test in SAS & StatXact®",
         "section": "",
    -    "text": "attendees\n13_May_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nNo\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nYes\n\n\nSarah Rathwell\nNo\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nYes\n\n\nVikash Jain\nNo\n\n\nMia Qi\nYes\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nYes\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nYes\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nYes\n\n\nTodd Coffey\nYes\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo"
    +    "text": "Similarily to what has been presented in R, we will explore the options of Wilcoxon Signed-Rank test that are avialable in SAS & StatXact.We will consider case with N>=20 or N<20 and without or with ties. For more information how to perform this analysis in R go here"
       },
       {
    -    "objectID": "minutes/posts/13May2024.html#goals",
    -    "href": "minutes/posts/13May2024.html#goals",
    -    "title": "2024 Goals",
    -    "section": "2024 Goals",
    -    "text": "2024 Goals\n\nOur open issues are here\nCurrently 32 are closed and we would like to increase this to 45 closed by the end of the year\nIn addition, we’d like to improve some of the incomplete content such as MMRM\nCreate a webpage for listings dissertation projects\nHave Soma & Vikash represent us at the CSS workshop."
    +    "objectID": "SAS/wilcoxonsr_HL.html#analysis-in-sas",
    +    "href": "SAS/wilcoxonsr_HL.html#analysis-in-sas",
    +    "title": "Wilcoxon signed-rank test in SAS & StatXact®",
    +    "section": "Analysis in SAS",
    +    "text": "Analysis in SAS\n\nDataset without ties and N > 20\nLet’s consider a case where the dataset has no ties and N (number of observations) = 240.\n\ndata TTR;\n  set TTR;\n  diff = TRT_B - TRT_A;\nrun;\n\n\n\n\n\n\n\n\n\n\nIn SAS Wilcoxon Signed-Rank test is available using PROC UNIVARIATE.\n\nproc univariate data=TTR\n    alpha=0.1;\n    var diff;\nrun;\n\n\n\n\n\n\n\n\n\n\n\n\nDataset without ties and N≤20\nNow let’s consider a smaller dataset, created by selecting first 19 observations from our main data.\n\ndata TTR_19;\n    set TTR;\n    if _N_ <= 19;\nrun;\n\n\nproc univariate data=TTR_19\n    alpha=0.1;\n    var diff;\nrun;\n\n\n\n\n\n\n\n\n\n\n\n\nImportant notes on SAS\n\nOnly PROC UNIVARIATE can be used in SAS to perform Wilcoxon Signed-Rank test. SAS documentation details are here.\nIn regards to Wilcoxon S-R test, SAS provides only p value\nHodges-Lehmann estimator or CI are not available and have to be implemented manually\nProvided p value is based on Signed Rank (S) statistic (modification of a common T+). Details are here\nSAS computes exact p values only for N ≤ 20. For larger samples uses an asymptotic t-Student distribution of the test statistic. For more information how the p value is calculated go here\nPROC UNIVARIATE apart from performing Wilcoxon S-R test presents as well basic statistical measures of variability and location, e.g median. The given median is not a “pseudo-median” (median of the Walsh averages), it is a “normal” median of the considered variable.\nUsing CIQUANTNORMAL option we can get confidence limits for quantiles based on normal distribution. There are 5 different definitions for calculation quantiles available. See details from the SAS documentation here. It is important to note, those are not confidence intervals of estimator.\n\n\n\nApproach to 0s and ties in SAS\n\nIn SAS all the 0 differences are disregarded (Hollander and Wolfe, 1973). The sample size N is reduced to reflect the number of discarded zeros.\nTied differences are given an average of the ranks. Statistic S is updated accordingly following Sprent algorythm (Sprent, 1993)."
       },
       {
    -    "objectID": "minutes/posts/13May2024.html#camis---onco",
    -    "href": "minutes/posts/13May2024.html#camis---onco",
    -    "title": "2024 Goals",
    -    "section": "CAMIS - Onco",
    -    "text": "CAMIS - Onco\nTo date there has not been much progress. Given the enthusiasm in the meeting to get things kicked off and starting to increase our survival content on the repository, Christina will set up a kick off meeting for those interested. To look at: weighted logrank, MaxCombo, RMST\nThis SAS link may also be useful"
    +    "objectID": "SAS/wilcoxonsr_HL.html#analysis-in-statxact",
    +    "href": "SAS/wilcoxonsr_HL.html#analysis-in-statxact",
    +    "title": "Wilcoxon signed-rank test in SAS & StatXact®",
    +    "section": "Analysis in StatXact®",
    +    "text": "Analysis in StatXact®\nStatXact® PROCs for SAS users is a clinical trial analysis software from Cytel for exact statistics. Package includes more than 150 procedures for exact inference statistical data and power analysis.\n\nDataset without ties and N > 20\n\n/* Wilxocon S-R test - p values */\nPROC PAIRED DATA=WilcoxonSignedRank_TTR\nALPHA=0.9;\nWI/EX;\nPOPS TRT_B - TRT_A;\nRUN;\n\n\n\n\n\n\n\n\n\n\n\n/* Wilcoxon S-R - H-L estimator and CI */\nPROC PAIRED DATA=WilcoxonSignedRank_TTR \nALPHA=0.9;\nHL/EX;\nPOPS TRT_B - TRT_A;\nRUN;\n\n\n\n\n\n\n\n\n\n\n\n\nImportant notes on StatXact®\n\nOnly PROC PAIRED can be used in StatXact to perform Wilcoxon Signed-Rank test\nFollows Sprent (1993) approach for Wilcoxon Signed-Rank test and Lehmann (1975) for H-L estimate and CI\nProvides exact/non-exact p values, (exact) H-L estimator and exact/non-exact CIs\np value is based on a common T+ statistic (sum of ranks of the positive differences)\n\n\n\nApproach to 0s and ties in StatXact®\n\nUsing ZEROS option we can compute H-L estimate including all differences, but by default 0s are excluded.\nTied differences are given an average of the ranks. Statistic S is updated accordingly following Sprent algorythm (Sprent, 1993)."
       },
       {
    -    "objectID": "minutes/posts/13May2024.html#other-content-updates",
    -    "href": "minutes/posts/13May2024.html#other-content-updates",
    -    "title": "2024 Goals",
    -    "section": "Other content updates",
    -    "text": "Other content updates\nWe now have a new table of assignments saved in the following readme Welcome to edit to update anything you would like to work on, so we keep track of whose working on what. Special shout out to David who has now completed chi-square for SAS and to Lukas for all the python content. Awesome work !\nAs SAS Viya is becoming more used now, we agreed OK to add Viya specific code such as proc freqtab as long as it’s clear that this isn’t a SAS Base procedure."
    +    "objectID": "SAS/ttest_1Sample.html",
    +    "href": "SAS/ttest_1Sample.html",
    +    "title": "One Sample t-test",
    +    "section": "",
    +    "text": "In SAS, a one sample t-test is usually performed using PROC TTEST. The one sample t-test compares the mean of the sample to a provided null hypothesis, called “h0”. The h0 value is provided as an option. By default, the h0 value is zero (0). Running the procedure produces a set of results that suggest whether or not the null hypothesis should be rejected.\n\n\nThe following data was used in this example.\n  data read;\n     input score count @@;\n     datalines;\n  40 2   47 2   52 2   26 1   19 2\n  25 2   35 4   39 1   26 1   48 1\n  14 2   22 1   42 1   34 2   33 2\n  18 1   15 1   29 1   41 2   44 1\n  51 1   43 1   27 2   46 2   28 1\n  49 1   31 1   28 1   54 1   45 1\n  ;\n\n\n\nBy default, SAS PROC TTEST t-test assumes normality in the data and uses a classic Student’s t-test.\n\n\nThe following code was used to test the comparison of a reading scores against a baseline hypothesis value of 30:\n  proc ttest data=read h0=30;\n     var score;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe SAS one sample t-test also supports lognormal analysis for a one sample t-test.\n\n\nUsing the same data as above, we will set the “DIST” option to “lognormal” to perform this analysis:\n  proc ttest data=read h0=30 dist=lognormal;\n     var score;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nAs can be seen in the figure above, the lognormal variation of the one sample TTEST provides results for geometric mean, coefficient of variation, and 95% confidence limits for the coefficient of variation."
       },
       {
    -    "objectID": "minutes/posts/13May2024.html#conference-planning",
    -    "href": "minutes/posts/13May2024.html#conference-planning",
    -    "title": "2024 Goals",
    -    "section": "Conference planning",
    -    "text": "Conference planning\nReminder that if you are attending a conference to represent CAMIS to add the detail here. We need to ensure we continue to advertise the project to encourage people to use the repo and add content.\n\nPHUSE CSS update (Soma/Vikash)\nR/Pharma – anyone like to present (openstatsware – collab, python): Waiting to be open.\nUSER! – Chi (Accepted)\nStephen phuse EU.\nEU Connect – Agnieska TBC\nR/Medicine 2024- Agnieska accepted for Thurs 13th/14th 11am-6pm EST (20 min talk)"
    +    "objectID": "SAS/ttest_1Sample.html#normal",
    +    "href": "SAS/ttest_1Sample.html#normal",
    +    "title": "One Sample t-test",
    +    "section": "",
    +    "text": "By default, SAS PROC TTEST t-test assumes normality in the data and uses a classic Student’s t-test.\n\n\nThe following code was used to test the comparison of a reading scores against a baseline hypothesis value of 30:\n  proc ttest data=read h0=30;\n     var score;\n  run;\nOutput:"
       },
       {
    -    "objectID": "minutes/posts/13May2024.html#aob",
    -    "href": "minutes/posts/13May2024.html#aob",
    -    "title": "2024 Goals",
    -    "section": "AOB",
    -    "text": "AOB\nOur Blog page dosn’t appear in date order or aligned! If anyone can fix let us know ! Saved under News here"
    +    "objectID": "SAS/ttest_1Sample.html#lognormal",
    +    "href": "SAS/ttest_1Sample.html#lognormal",
    +    "title": "One Sample t-test",
    +    "section": "",
    +    "text": "The SAS one sample t-test also supports lognormal analysis for a one sample t-test.\n\n\nUsing the same data as above, we will set the “DIST” option to “lognormal” to perform this analysis:\n  proc ttest data=read h0=30 dist=lognormal;\n     var score;\n  run;\nOutput:\n\n\n\n\n\n\n\n\n\nAs can be seen in the figure above, the lognormal variation of the one sample TTEST provides results for geometric mean, coefficient of variation, and 95% confidence limits for the coefficient of variation."
       },
       {
    -    "objectID": "minutes/posts/8Apr2024.html",
    -    "href": "minutes/posts/8Apr2024.html",
    -    "title": "General linear models is complete",
    +    "objectID": "SAS/mmrm.html",
    +    "href": "SAS/mmrm.html",
    +    "title": "MMRM in SAS",
         "section": "",
    -    "text": "attendees\n08_Apr_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nYes\n\n\nMia Qi\nNo\n\n\nLeon Shi\nYes\n\n\nVandaya Yadav\nYes\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nYes\n\n\nLukas Brausch\nYes\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nYes\n\n\nAiming Yang\nYes\n\n\nCuifeng Yin\nYes\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo"
    +    "text": "Mixed Models\n\nFitting the MMRM in SAS\nIn SAS the following code was used (assessments at avisitn=0 should also be removed from the response variable):\n\nproc mixed data=adlbh;\n  where base ne . and avisitn not in (., 99);\n  class usubjid trtpn(ref=\"0\") avisitn;\n  by paramcd param;\n  model chg=base trtpn avisitn  trtpn*avisitn / solution cl alpha=0.05 ddfm=KR;\n  repeated avisitn/subject=usubjid type=&covar;\n  lsmeans trtpn * avisitn / diff cl slice=avisitn;\n  lsmeans trtpn / diff cl;\nrun;\n\nwhere the macro variable covar could be UN, CS or AR(1). The results were stored in .csv files that were post-processed in R and compared with the results from R."
       },
       {
    -    "objectID": "minutes/posts/8Apr2024.html#this-months-achievements",
    -    "href": "minutes/posts/8Apr2024.html#this-months-achievements",
    -    "title": "General linear models is complete",
    -    "section": "This months achievements",
    -    "text": "This months achievements\nGeneral Linear Models is Complete !\nThanks David & others for great contributions this month.\nWe are seeing more python examples coming through too."
    +    "objectID": "SAS/correlation.html",
    +    "href": "SAS/correlation.html",
    +    "title": "Correlation Analysis using SAS",
    +    "section": "",
    +    "text": "Data source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601-7, 1994.\nSurvival in patients with advanced lung cancer from the North Central Cancer Treatment Group. Performance scores rate how well the patient can perform usual daily activities.\n\n\nThe CORR procedure computes Pearson correlation coefficients, three nonparametric measures of association, and the probabilities associated with these statistics. The correlation statistics include the following:\n\nPearson product-moment correlation\nSpearman rank-order correlation\nKendall’s tau-b coefficient\nHoeffding’s measure of dependence, \nPearson, Spearman, and Kendall partial correlation\n\nThis program works on the first three correlation coefficients.\nMissing Values\nPROC CORR excludes observations with missing values in the WEIGHT and FREQ variables. By default, PROC CORR uses pairwise deletion when observations contain missing values. PROC CORR includes all nonmissing pairs of values for each pair of variables in the statistical computations. Therefore, the correlation statistics might be based on different numbers of observations.\nIf you specify the NOMISS option, PROC CORR uses listwise deletion when a value of the VAR or WITH statement variable is missing. PROC CORR excludes all observations with missing values from the analysis. Therefore, the number of observations for each pair of variables is identical.\nThe PARTIAL statement always excludes the observations with missing values by automatically invoking the NOMISS option. With the NOMISS option, the data are processed more efficiently because fewer resources are needed. Also, the resulting correlation matrix is nonnegative definite.\nIn contrast, if the data set contains missing values for the analysis variables and the NOMISS option is not specified, the resulting correlation matrix might not be nonnegative definite. This leads to several statistical difficulties if you use the correlations as input to regression or other statistical procedures.\n\n\n\n\nproc corr data=lung pearson;\nvar age mealcal;\nrun;\n\n\n\n\n\n\n\n\n\n\nproc corr data=lung spearman; \nvar age mealcal; \nrun;\n\n\n\n\n\n\n\n\n\n\nproc corr data=lung kendall;\nvar age mealcal;\nrun;\n\n\n\n\n\n\n\n\n\nPROC CORR: The CORR Procedure (sas.com)"
       },
       {
    -    "objectID": "minutes/posts/8Apr2024.html#checklist-for-pull-requests",
    -    "href": "minutes/posts/8Apr2024.html#checklist-for-pull-requests",
    -    "title": "General linear models is complete",
    -    "section": "Checklist for pull requests",
    -    "text": "Checklist for pull requests\nChristina will add something to help ensure a smooth process"
    +    "objectID": "SAS/correlation.html#overview",
    +    "href": "SAS/correlation.html#overview",
    +    "title": "Correlation Analysis using SAS",
    +    "section": "",
    +    "text": "The CORR procedure computes Pearson correlation coefficients, three nonparametric measures of association, and the probabilities associated with these statistics. The correlation statistics include the following:\n\nPearson product-moment correlation\nSpearman rank-order correlation\nKendall’s tau-b coefficient\nHoeffding’s measure of dependence, \nPearson, Spearman, and Kendall partial correlation\n\nThis program works on the first three correlation coefficients.\nMissing Values\nPROC CORR excludes observations with missing values in the WEIGHT and FREQ variables. By default, PROC CORR uses pairwise deletion when observations contain missing values. PROC CORR includes all nonmissing pairs of values for each pair of variables in the statistical computations. Therefore, the correlation statistics might be based on different numbers of observations.\nIf you specify the NOMISS option, PROC CORR uses listwise deletion when a value of the VAR or WITH statement variable is missing. PROC CORR excludes all observations with missing values from the analysis. Therefore, the number of observations for each pair of variables is identical.\nThe PARTIAL statement always excludes the observations with missing values by automatically invoking the NOMISS option. With the NOMISS option, the data are processed more efficiently because fewer resources are needed. Also, the resulting correlation matrix is nonnegative definite.\nIn contrast, if the data set contains missing values for the analysis variables and the NOMISS option is not specified, the resulting correlation matrix might not be nonnegative definite. This leads to several statistical difficulties if you use the correlations as input to regression or other statistical procedures."
       },
       {
    -    "objectID": "minutes/posts/8Apr2024.html#css-connect-progress-update-soma-vikash",
    -    "href": "minutes/posts/8Apr2024.html#css-connect-progress-update-soma-vikash",
    -    "title": "General linear models is complete",
    -    "section": "CSS Connect progress update – Soma/ Vikash",
    -    "text": "CSS Connect progress update – Soma/ Vikash\nVikash to reach out to Soma. Harshil unlikely to be available in person, so we can look for further support to attend & help you if needed."
    +    "objectID": "SAS/correlation.html#pearson-correlation",
    +    "href": "SAS/correlation.html#pearson-correlation",
    +    "title": "Correlation Analysis using SAS",
    +    "section": "",
    +    "text": "proc corr data=lung pearson;\nvar age mealcal;\nrun;"
       },
       {
    -    "objectID": "minutes/posts/8Apr2024.html#any-other-conferences-that-people-have-applied-for",
    -    "href": "minutes/posts/8Apr2024.html#any-other-conferences-that-people-have-applied-for",
    -    "title": "General linear models is complete",
    -    "section": "Any other Conferences that people have applied for?",
    -    "text": "Any other Conferences that people have applied for?\n\nLukus & Stephen are attending PHUSE EU Connect with other topics, but if others going CAMIS members could meet up in person, TBC nearer the date"
    +    "objectID": "SAS/correlation.html#spearman-correlation",
    +    "href": "SAS/correlation.html#spearman-correlation",
    +    "title": "Correlation Analysis using SAS",
    +    "section": "",
    +    "text": "proc corr data=lung spearman; \nvar age mealcal; \nrun;"
       },
       {
    -    "objectID": "minutes/posts/8Apr2024.html#current-assignments",
    -    "href": "minutes/posts/8Apr2024.html#current-assignments",
    -    "title": "General linear models is complete",
    -    "section": "Current assignments",
    -    "text": "Current assignments\nLyn to put together Table so we can easily see whose doing what.\n\nSarah Rathwell & Christina volunteered to work on Kolmogorov-Smirnov test\nLukas Brausch to pick up Python one sample t-test, paired & 2 sample t-test\nChi to reach out to open stats ware to see if they can improve MMRM & add any bayesian MMRM\nLeon to look at Reference-based MI (using either SAS macro, or procedures directly).\nKeaven/Martin to look at group sequential design\nCAMIS-ONCO no kick off yet, so Stephen McCawille will start to look at SAS Accelerated failure time models, Volunteer needed to run the same in R.\nTodd/Cuifeng will be looking at Non linear models\nALL - if you are looking for an assignment reach out to Christina & Lyn and we can group you together to collaborate."
    +    "objectID": "SAS/correlation.html#kendalls-rank-correlation",
    +    "href": "SAS/correlation.html#kendalls-rank-correlation",
    +    "title": "Correlation Analysis using SAS",
    +    "section": "",
    +    "text": "proc corr data=lung kendall;\nvar age mealcal;\nrun;"
       },
       {
    -    "objectID": "minutes/posts/8Jan2024.html",
    -    "href": "minutes/posts/8Jan2024.html",
    -    "title": "CAMIS-ONCO, Conferences, Academic & regulatory input plans",
    +    "objectID": "SAS/correlation.html#references",
    +    "href": "SAS/correlation.html#references",
    +    "title": "Correlation Analysis using SAS",
         "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n08_Jan_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nYes\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nYes\n\n\nFilip Kabaj\nYes\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nYes\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nYes\n\n\nAditee Dani\nYes\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nNo\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nNo\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nNo\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nNo\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nNo\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nCAMIS- ONCO: Update on progress & next steps to include:\nRegular meetings Cheat sheet for PHUSE 2024 PHUSE CSS planning (workshop in June). Python volunteers & code creation. White paper.\nACTION: Lyn to follow up with Soma/Vikesh to assess status of CAMIS-ONCO. Also set up meeting with team to discuss python content going into website\nOther Conference planning\nLyn will update the conference tab on the repo.\nPHUSE US Connect (Soma/ Vikesh) and Brian are attending.\nUseR is now open for abstract submission (deadline mid-march). Any volunteers to submit /attend. Salzburg (Europe) 8-11 July. Chi will be going, and volunteers to submit an abstract for us.\nPharmaSUG - Abstracts due 15th January. Conference is: May 19th-22nd Baltimore. Volunteers required to submit abstract if possible.\nContent updates\nAnyone with any questions about what they are working on or how to assign themselves?\n\nMMRM - Volunteer please to look at Proc Mixed vs Proc GLIMMIX and use this to expand the SAS/mmrm.qmd file.\nKeaven Anderson (Merck) - will start to look at SAS vs R for sample size / group sequential design / power. They use EAST, gsDesign, but others use rpact. Does anyone have experience of this (& using SAS for sample size)? Lyn & Martin & Keaven will meet to discuss on Friday.\nChristina: will add sales pitch to Website - Why CAMIS !? + re-arrangment of some of the content.\n\nObjective to get more regulatory input\nWork with PSI AIMS as they plan a EMA regulatory panel discussion on R Any other ideas?\nFDA/ Other regulators input/discussion.\nGit training plan for 2024 PSI conference abstract rejected. Creation of a short training session (like the R/pharma workshop) or 6 week 2 hr/ week course. ACTION: Lyn/Christina/Martin to follow up with PSI re: delivery of training. Restart GIT training meetings (Christina/Alex/ Irene)\nInteraction with more Academics & Universities\nPlease can you present/advertise to your universities contacts. Anyone got contacts they can utilize? Ideas for spreading the word? Lyn doing Presentation at University of Sheffield on 28th Feb for RSS local group.\nAcademia Projects ALL: to think about possible dissertation projects. Plan to list available projects in repo & write descriptions of what the project would entail such that universities students can use them at dissertation projects Prof Richard Stevens (Oxford) is open to projects if we have any. Also Novonordisk : working with Alberg Denmark university to have a proposal for project.\nRaising awareness within companies to flag issues to CAMIS\nALL: brainstorm how we can spread awareness within our organization & wider community\nEFSPI - PSI strategy day / heads meeting\nASA OpenStatsware - Orla Doyle: Focus is more on package development. If a gap comes up we could make them aware package is needed. Can also look to sassy r package to see if that replicates SAS (if it’s right to do so) David Bosak. Lyn meeting with David next later this week.\n\nPlan for next Blogs:\n\n\nadd blog tab to repo, then when we post we can link through.\nIdeas for next blogs? - perhaps pick a topic we have content already for & post blog on it.\n\n\nFunding requirements NOTE: We can apply for a grant for any funding if anyone sees an opportunity to progress our work quicker through this method. NOTE: if any university project or individuals need funding to do this CAMIS work (creation of content), then we do have an option to apply to the R Consortium for funding.\nAOB\n\nLinear Regression SAS & R, text are now live on website. Results match, but would be good to add a COMP file which just says what we checked & what matched… for example incase something comes up in future that does not match."
    +    "text": "PROC CORR: The CORR Procedure (sas.com)"
       },
       {
    -    "objectID": "minutes/posts/12Aug2024.html",
    -    "href": "minutes/posts/12Aug2024.html",
    -    "title": "Novartis Hackathon & Content growth",
    +    "objectID": "SAS/rounding.html",
    +    "href": "SAS/rounding.html",
    +    "title": "Rounding in SAS",
         "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n12_Aug_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nNo\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nNo\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nNo\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nNo\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nYes\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nYes\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nAshwath Gadapa\nYes\n\n\nMiriam Amor\nYes\n\n\nAnwesha Roy\nYes\n\n\nSamrit Pramanik\nYes\n\n\nAgnieszka Tomczyk\nYes\n\n\nPrem Kant Shekhar\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\nWelcome\nWelcome to our new team members on the call.  We have an agenda which is sent prior to the meeting, but please do please ask if you have questions or need clarification regarding what we are talking about.\n\nRepository Content\nNovartis Hackathon\nThe Hackathon was a great success, with CAMIS receiving it’s largest amount of pull requests in any one month to date ! Christina fed back that it was not as much work as you might think, as although they had ‘office hours’ to help people and discuss things, actually not many people used them. Instead, they gave a brief introduction to everyone attending, explaining git / github / pull requests etc, then assigned everyone a topic / mini projects to investigate and let them do the research in their own time.\nOrla & team reviewed each others pull requests prior to submission to CAMIS repo. Christina worked alongside the team approving the content to go live.\nAs it went so well, Christina is planning another hackathon style event in October, but it will be on wider concept, focused on people who haven’t done pull requests to get more involved with open source projects. We can submit CAMIS topics for them to complete.\nIf you or your company interested in hackathon ask christina.\nSurvival\nWill continue to meet and discuss survival needs, some Accelerated failure time content going in as part of hackathon.\nAssignment table / Raising issues\nACTION: Lyn to remove and we will use issues instead, If you have been on a issue for >6 months and have not provided us with any feedback on your progress, then you will be unassigned. Obviously if you need more time and are still working on it, just let Christina or another one of the project leads know.\nIf you want to research a topic, please add an issue or issue comment to tell us what you are working on.\nEnsuring content quality & cross page cohesiveness\nTo date, focus was on population of the pages we were missing, however as we move towards having content available, we will need people to review that content to ensure it is of high quality and makes sense. Ideally, the same dataset would be run through R and SAS showing options, then the comparison would discuss the discrepancies in the results obtained and perhaps the differences in default options / available options.\nWe now have a template for the SAS, and R pages.. and a different one for the comparison pages. This may help us with consistency. Please use the templates if you are starting the work now, it’s Ok to do a PR for anything you are already working on, even if the template wasn’t used.\n\n\nConferences\n\nPHUSE EU Brussels 23rd Sept - Qian Wang (Merck) will attend.\nR/Pharma APAC track – Samrit has submitted an abstract so hopefully will be able to represent us.\nSouthEast SAS User Group (SESUG) – Bethesda: Brian will give us a mention.\nPHUSE EU – Stephen Mccawille, Anwesha Roy, Agniekska Tomczyk & Christina Fillmore are all attending PHUSE EU – if you are attending let Christina know and she will arrange for CAMIS team to meet up for a cuppa & chat at the conference.\nPhuse US Connect November: Maryland. Cuifeng Yin may be able to attend. Lyn asked for volunteers to represent us a US connect and maybe CSS? ACTION : ask PHUSE re: getting a workshop or seminar for CAMIS if we can find volunteers, TBC if at (US CONNECT / or CSS? Or both? )\nChi provided feedback from UseR! We may consider using a better title for abstracts, not just CAMIS. The talk was put into a community stream instead of a multilingual programming stream, so may have got better attendance, but still it was well received. 1 person attended requested that they would like to write an article on CAMIS, so Chi will work with them on that."
    +    "text": "There are two rounding functions in SAS.\nThe round() function in SAS will round to the nearest whole number and ‘away from zero’ or ‘rounding up’ when equidistant meaning that exactly 12.5 rounds to the integer 13.\nThe rounde() function in SAS will round to the nearest whole number and ‘rounding to the even number’ when equidistant, meaning that exactly 12.5 rounds to the integer 12.\nBoth functions allow you to specify the number of decimal places you want to round to.\nFor example (See references for source of the example)\n\n    #Example code\n    data XXX;\n      my_number=2.2; output;\n      my_number=3.99; output;\n      my_number=1.2345; output;\n      my_number=7.876; output;\n      my_number=13.8739;  output;\n    run;\n\n    data xxx2;\n      set xxx;\n        r_1_dec = round(my_number, 0.1);\n        r_2_dec = round(my_number, 0.01);\n        r_3_dec = round(my_number, 0.001);\n        \n        re_1_dec = rounde(my_number, 0.1);\n        re_2_dec = rounde(my_number, 0.01);\n        re_3_dec = rounde(my_number, 0.001);\n    run;\n\n\n\n\n\n\n\n\n\n\n\n\n\nmy_number\nr_1_dec\nr_2_de\nr_3_dec\nre_1_dec\nre_2_dec\nre_3_dec\n\n\n\n\n2.2\n2.2\n2.2\n2.2\n2.2\n2.2\n2.2\n\n\n3.99\n4\n3.99\n3.99\n4\n3.99\n3.99\n\n\n1.2345\n1.2\n1.23\n1.235\n1.2\n1.23\n1.234\n\n\n7.876\n7.9\n7.88\n7.876\n7.9\n7.88\n7.876\n\n\n13.8739\n13.9\n13.87\n13.874\n13.9\n13.87\n13.874\n\n\n\nIn some rare cases, round() does not return result as expected. For example below.\n\ndata incorrect_round;\n  *rounded=32768.015625, but it should be 32768.015626;\n  rounded=round(32768.0156255,1e-6); output;\n  *rounded=0.137, but it should be 0.138;\n  rounded=round(2048.1375-2048,1e-3); output;\nrun;\n\nYou can find a little more by the code below. It creates dummy numbers with different numbers of decimal digits, and filter incorrect results. Note, the incorrect results are expected when the input number is near or beyond the precision level, i.e. the last decimal of the input number is near or less than the number multiplied by constant('maceps').\n\ndata dum1;\n  int1=0; output;\n  do i=1 to 25;\n    int1=2**i; output;\n  end;\n  keep int1;\nrun;\n\ndata dum2;\n  do round_digits=1 to 7;\n    *x.xxx5 should be rounded up, or replace 5 to 4.99 which should be rounded down;\n    dec1=2**(-round_digits)+10**(-round_digits-1)*5;\n    output;\n  end;\n  keep dec1 round_digits;\nrun;\n\nproc sql;\n  create table incorrect_round2(where=(rounded<num1)) as\n  select dum1.*,dum2.*,int1+dec1 as num1,round(calculated num1,10**(-round_digits)) as rounded\n  from dum1, dum2;\nquit;\n\nOr more by the code below and comparing with results from another language, e.g. R.\n\ndata dum1;\n  dec1=0; int1=0; output;\n  do i=0 to 12;\n    dec1=2**(-i);\n    dec1=dec1*1.1;\n    int1=2**i;\n    output;\n  end;\nrun;\n\nproc sql;\n  create table dum3 as select dec1+int1 as num1 from dum1(keep=dec1) a, dum1(keep=int1) b\n  ;\n  create table dat1 as select a.num1,b.num1 as num2 from dum3 a, dum3 b\n;quit;\n\ndata dat2;\n  set dat1;\n  operator='+'; num3=num1+num2; output;\n  operator='-'; num3=num1-num2; output;\n  if num1^=0 and num2^=0 then do;\n    operator='*'; num3=num1*num2; output;\n    operator='/'; num3=num1/num2; output;\n  end;\nrun;\n\ndata dat3;\n  set dat2;\n  rounded=round(num3,1e-3);\nrun;\n\nAs the incorrect rounding all occur on large number, round() is still reliable in most of cases.\nReferences\nHow to Round Numbers in SAS - SAS Example Code"
       },
       {
    -    "objectID": "minutes/posts/20Nov2023.html",
    -    "href": "minutes/posts/20Nov2023.html",
    -    "title": "End of year summary, plan for 2024",
    +    "objectID": "SAS/nparestimate.html",
    +    "href": "SAS/nparestimate.html",
    +    "title": "Non-parametric point estimation in SAS",
         "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n20_nov_2023\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nYes\n\n\nChi Zhang\nYes\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nYes\n\n\nFilip Kabaj\nYes\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nNo\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nYes\n\n\nOrla Doyle\nYes\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nEnd of year summary\nPost & summary diagram of 2023 will go onto linkedIn soon, please like/share\nWe would like to welcome Harshal Khanolkar to become a co-lead of the PHUSE CAMIS Repo. Harshal has been instrumental through 2023 helping Christina and I stay on track and making suggestions for improving the social media and knowledge sharing within the group.\nMMRM now updated & Complete for now.\nGithub training will be on youtube following R/pharma conference soon\n\n2023 : A Year of Progress for PHUSE CAMIS Working Group\nAs we draw towards the end of 2023, the PHUSE CAMIS Working Group reflect on their key progress and successes this year.\nThe CAMIS repository went live in January 2023, drawing on the content from the PHUSE CSRMLW project.  This searchable repo compares analysis method implementations in software (CAMIS) such as SAS, R and python. \nThe White Paper was published in June, which highlighted the importance of clearly specifying your analysis, such that it can be replicated in different software, and isn’t relying on default options which can be different.\nFor more complex analyses, it can still be hard to understand what defaults and algorithms your software is using, so the team focused 2023 on expanding our repo content, comparing SAS vs R methods.  By August, we had covered the following topics in the repo: quartiles, rounding, anova, mmrm, cmh, log-rank, cox-ph, mcnemar’s test, kruskal-wallis test and logistic. October saw the launch of the sub-working group: CAMIS-Oncology, led by Somasekhar Sriadibhatla (AstraZeneca).  This team will focus specifically on oncology endpoints and analyzing them in SAS, R and Python.  The CAMIS team have expanded in membership during 2023 presenting at numerous conferences around the world. In November, we welcomed Harshal Khanolkar (NovoNordisk), to join the leadership team alongside Christina Fillmore (GSK) and Lyn Taylor (PAREXEL).  Our focus for 2024, will be on the creation of additional content for the repo, and sharing awareness of the project across the medical research and wider community.  We’d like to take this opportunity to thank all of our team members and contributors, and encourage everyone to check out the repository and help us to grow our content CAMIS (psiaims.github.io).  If you would like to join the team please get in touch through the repo.\n2023: lessons learnt: What we did well?\n\nAdverts to industry & linkedin posts. To be Continued into 2024 - engage more unis, internship projects, academia, posit conf, r users conf, target key conferences\nGood sharing of conference content through the repo & improving the slides in an ongoing way.\nLeadership & project progress with plans. Transparency of the work. Nice to get Agendas pre-meeting & minutes after meeting in timely manner.\nLarge range of individual contributions helping to grow repo. 1/2 contributors within the phuse group, but 1/2 outside of the group. So spreading the word is really helping us to get external contributions.\nACTION: Christina & Chi: Please can you improve the 2023 conference tab, create a 2024 tab which contains link to presentations within the github repo.\n\n2023: lessons learnt: What we didn’t do so well?\n\nTime to get pull requests approved. Aim for 2024 to reduce the time so it’s a maximum of 2 weeks. The delay was often caused by issues with renv. Christina is working with posit directly to improve renv issues & has already updated contributions guidance to help instruct people on how to contribute such as using Forks rather than needing github username access.\npython - Delayed discussion in how to design the repo to store python content.\nACTION: Vikash/ Soma / Filip - to meet with Lyn / Christina to agree format going forward.\nMore discussion on CAMIS ONCO below.\n\n\n2023: lessons learnt: What is our focus for next year?\n\nMore content\nengage more unis, internship projects, academia, posit conf, r users conf, target key conferences\nCAMIS ONCO white paper, workshop & python/sas/r comparison (See below)\nCSS 2024 workshop, interaction with audience. 3-4 hrs hopefully. TBD at separate meeting, agenda workshop. Vikash, Harshal, Soma. 3-5 June.\nIdea for 2024: Set up a method such that people with no git / github skills can still contribute to the project. Perhaps set up a CAMIS email address. Assign volunteers for someone to email, then the github experts can load it in. Decide best process to non-R, non-github people.\n\nCAMIS-ONCO\nPlan to create cheat sheet for phuse 2024 - can go on CAMIS.\nNeed more volunteers in order to address all the endpoints. Oncology / survival team members needed to join Soma & Team. AZ investing in ChatGPT AZ version, it can create python code from SAS.\nIf AI can convert SAS code to python, we will then need people to test it. Volunteers needed to run in python. Can use the CAMIS repo data to test on hopefully but may need more detailed data? To see what data we currently have in the repo: see “data-info” and “data” folders.\nAction: Chi to have a look at the data folders, and decide better way to control/document data. Chi volunteered to help with Soma’s test to test Python. Harshal may also be able to find volunteers at novonordisk. Starting point for python would be the default options vs R.\n\nACTION: Lyn to Add to members list, who can run which languages & specialist areas (CAMIS-ONCO). ACTION: Soma to put poster into non_website_content/conferences.\nCAMIS: ONCO White paper: Needs to be progressed. invite all members to see if they can contribute. Set up regular meetings in 2024.\nPlan for 2024 : Project board in github: 5 categories\n\nCAMIS : Generic Method Implementation Team: More content\nCAMIS-ONCO: items as above\nUser Experience/Demo Team\nSocial media & Engagement: Advertise/ Universities\n\nbi-monthly post re: new content (newsletter: form to subscribe to newsletter so that when we post out they get informed). ACTION: lyn to check with PHUSE if we can do this, or if we want to ask R consortium to help similar to R validation hub email list.\nAlso would be good to have blog post tab on repository. ACTION: Chi to help Christina with design. Idea would be to have 1 post which goes out on social media, to the emails subscription & on the website.\nmore relationship with ASA OpenStatsware - Orla Doyle.\nopenstatsware (rconsortium.github.io) ACTION: Lyn/Christina/Orla to set up call to discuss collaboration.\n\n\nGeneral Tasks:\n\nPlan to review & accept content within 2 weeks of pull requests.\nPOSIT help with RENV situation\nSearch Engine Optimization: CAMIS full name on website? how do we become top hit ? Any volunteers to help with this let us know.\n\n\nACTION: Lyn to Cancel Dec Meeting 11th Dec. next meeting 8th Jan 2024"
    +    "text": "Introduction\nThe Hodges-Lehman estimator (Hodges and Lehmann 1962) provides a point estimate which is associated with the Wilcoxon rank sum statistics based on location shift. This is typically used for the 2-sample comparison with small sample size. Note: The Hodges-Lehman estimates the median of the difference and not the difference of the medians. The corresponding distribution-free confidence interval (CI) is also based on the Wilcoxon rank sum statistics (Moses). In addition, exact CIs can be constructed.\nPROC NPAR1WAY provides these estimates in a flexible manner.\nHodges, J. L. and Lehmann, E. L. (1962) Rank methods for combination of independent experiments in analysis of variance. Annals of Mathematical Statistics, 33, 482-4.\n\n\nCase study\n\n# Hollander-Wolfe-Chicken Example\ndata all ;\ninput group $ value ; \ncards ;\nA 1.83\nA 0.50\nA 1.62\nA 2.48\nA 1.68\nA 1.88\nA 1.55\nA 3.06\nA 1.30\nB 0.878\nB 0.647\nB 0.598\nB 2.050\nB 1.060\nB 1.290\nB 1.060\nB 3.140\nB 1.290\n; \nrun ;\n\n\n\nHodges-Lehmann estimate and confidence interval\nHodges-Lehmann estimate and Moses confidence interval for the 2-sample case will be generated when putting HL as an option. The direction of the comparison can be controlled via refclass. If the exact confidence interval is required additionally then the exact statement together with the option HL needs to be defined. The Hodges-Lehmann point estimate and confidence interval can be addressed via the HodgesLehmann option under the ODS statement.\n\nproc npar1way hl (refclass = \"B\") data = all ;\n   class group ;\n   var value ;\n   exact hl ;\n   ods select HodgesLehmann ;\nrun ;\n\n\n\nResults\nThe NPAR1WAY Procedure\n                                           Hodges-Lehmann Estimation                                                \n                                                                                                                    \n                                        Location Shift (A - B)    0.5600                                            \n                                                                                                                    \n                                                                   Interval        Asymptotic                       \n                   Type                 95% Confidence Limits      Midpoint    Standard Error                       \n                                                                                                                    \n                   Asymptotic (Moses)     -0.3700      1.1830        0.4065            0.3962                       \n                   Exact                  -0.2200      1.0820        0.4310"
       },
       {
    -    "objectID": "minutes/posts/10June2024.html",
    -    "href": "minutes/posts/10June2024.html",
    -    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    +    "objectID": "SAS/linear-regression.html",
    +    "href": "SAS/linear-regression.html",
    +    "title": "Linear Regression",
         "section": "",
    -    "text": "attendees\n10_Jun_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nNo\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nNo\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nYes\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nNo\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nYes\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nYes\n\n\nJayashree Vedanayagam\nYes\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo"
    +    "text": "To demonstrate the use of linear regression we examine a dataset that illustrates the relationship between Height and Weight in a group of 237 teen-aged boys and girls. The dataset is available at (../data/htwt.csv) and is imported to sas using proc import procedure.\n\nDescriptive Statistics\nThe first step is to obtain the simple descriptive statistics for the numeric variables of htwt data, and one-way frequencies for categorical variables. This is accomplished by employing proc means and proc freq procedures There are 237 participants who are from 13.9 to 25 years old. It is a cross-sectional study, with each participant having one observation. We can use this data set to examine the relationship of participants’ height to their age and sex.\n\nproc means data=htwt;\nrun;\n\n                    Descriptive Statistics for HTWT Data Set                  \n                             The MEANS Procedure\n\nVariable  Label     N          Mean       Std Dev       Minimum       Maximum\n-----------------------------------------------------------------------------\nAGE       AGE     237    16.4430380     1.8425767    13.9000000    25.0000000\nHEIGHT    HEIGHT  237    61.3645570     3.9454019    50.5000000    72.0000000\nWEIGHT    WEIGHT  237   101.3080169    19.4406980    50.5000000   171.5000000\n----------------------------------------------------------------------------\n\n\nproc freq data=htwt;\ntables sex;\nrun;\n\n    Oneway Frequency Tabulation for Sex for HTWT Data Set                    \n                    The FREQ Procedure\n\n                                      Cumulative    Cumulative\nSEX         Frequency     Percent     Frequency      Percent\n-------------------------------------------------------------\nf           111           46.84           111        46.84\nm           126           53.16           237       100.00\n\nIn order to create a regression model to demonstrate the relationship between age and height for females, we first need to create a flag variable identifying females and an interaction variable between age and female gender flag.\n\ndata htwt2;\n  set htwt;\n  if sex=\"f\" then female=1;\n  if sex=\"m\" then female=0; \n \n  *model to demonstrate interaction between female gender and age;\n  fem_age = female * age;  \nrun;\n\n\n\nRegression Analysis\nNext, we fit a regression model, representing the relationships between gender, age, height and the interaction variable created in the datastep above. We again use a where statement to restrict the analysis to those who are less than or equal to 19 years old. We use the clb option to get a 95% confidence interval for each of the parameters in the model. The model that we are fitting is height = b0 + b1 x female + b2 x age + b3 x fem_age + e\n\nproc reg data=htwt2;\n  where age <=19;\n  model height = female age fem_age / clb;\nrun; quit;\n\n                        Number of Observations Read         219\n                        Number of Observations Used         219\n\n                                 Analysis of Variance\n\n                                        Sum of           Mean\n    Source                   DF        Squares         Square    F Value    Pr > F\n    Model                     3     1432.63813      477.54604      60.93    <.0001\n    Error                   215     1684.95730        7.83701\n    Corrected Total         218     3117.59543\n\n                 Root MSE              2.79947    R-Square     0.4595\n                 Dependent Mean       61.00457    Adj R-Sq     0.4520\n                 Coeff Var             4.58895\n\nWe examine the parameter estimates in the output below.\n\n                            Parameter Estimates\n                            Parameter       Standard\n       Variable     DF       Estimate          Error    t Value    Pr > |t|       95% Confidence Limits\n       Intercept     1       28.88281        2.87343      10.05      <.0001       23.21911       34.54650\n       female        1       13.61231        4.01916       3.39      0.0008        5.69031       21.53432\n       AGE           1        2.03130        0.17764      11.44      <.0001        1.68117        2.38144\n       fem_age       1       -0.92943        0.24782      -3.75      0.0002       -1.41791       -0.44096\n\nFrom the parameter estimates table the coefficients b0,b1,b2,b3 are estimated as b0=28.88 b1=13.61 b2=2.03 b3=-0.92942\nThe resulting regression model for height, age and gender based on the available data is height=28.88281 + 13.61231 x female + 2.03130 x age -0.92943 x fem_age"
       },
       {
    -    "objectID": "minutes/posts/10June2024.html#monthly-contributions-update--christina",
    -    "href": "minutes/posts/10June2024.html#monthly-contributions-update--christina",
    -    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    -    "section": "Monthly Contributions update -Christina",
    -    "text": "Monthly Contributions update -Christina\nThank you to everyone whose contributed this month, Special shout outs to Seemani, Lukas, David & Agnieska and anyone else we’ve missed who completed pull requests this month.\nNOTE that if your work requires a package not yet in the renv.lock file, then you need to install the package and do renv::update() to update the lock file. When you do the pull request, check 2 files change (i.e. the renv.lock file & your file you are submitting).\n\nChristina plans to update the renv control method soon which will hopefully avoid some of the package / renv issues going forward. Remember if you do have problems with the install.packages() & update to renv lock file just let Christina know. ACTION: Christina: To add to the contributions guidance once new method agreed.\nIt was noted by Seemani, that her MANOVA Python content was loaded to the folder, but not visible on the website. ACTION: Christina: to update the TOC to point to the material.\nPlease can people when picking up new pieces to work on update the table of assignments saved in the following readme Or ask Lyn/ Christina to update it for you. This ensures we dont have multiple people working at the same time duplicating effort, when they could be working together."
    +    "objectID": "templates/template.html",
    +    "href": "templates/template.html",
    +    "title": " ",
    +    "section": "",
    +    "text": "Italic words are note for you.\nYour choice to use part or all to fit your topic."
       },
       {
    -    "objectID": "minutes/posts/10June2024.html#conferences-update---lyn",
    -    "href": "minutes/posts/10June2024.html#conferences-update---lyn",
    -    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    -    "section": "Conferences update - Lyn",
    -    "text": "Conferences update - Lyn\nReminder that if you are attending a conference to represent CAMIS to add the detail here.\nWe have updated the page linking to much of the content presented in 2024 and showing we are currently presenting at 7 seminars/ SDEs/ conferences in 2024.\nChristina also presented at the Merck R users group last month. ACTION: Christina: to add to the conferences list to show we did this. If anyone else wants a presentation to their companies please let her know.\nStephen McCawille is also attending PHUSE EU as well as Christine & Agnieska, so the 3 of them can meet up in person.\nAndras Kasa - informed us that there is a PHUSE SDE at UCB in Brussels in september. Details can be found here. Contact UCB biosciences team: Christophe.Praet@ucb.com and marc.derycke@ucb.com if we have someone who could present at this meeting.\nUnfortunately Soma and Vikash were unable to present the workshop at PHUSE CSS last week, however Mike Stackhouse kindly stood in for us, and led a round table discussion about the project. Huge Thank you to Mike for his support and last minute help so we could continue with a session.\nACTION: Volunteer please!! to attend and present at this SDE in person as it would be really good for CAMIS to be presented at this event.\nKeevan asked if we had a single slide to advertise CAMIS. ACTION: Lyn to load single slide to non-website content and add a link to it on conferences tab. Can be found here.\nACTION: Christina : Move Phuse-EU2023 pptx into 2023 folder."
    +    "objectID": "templates/template.html#data-used",
    +    "href": "templates/template.html#data-used",
    +    "title": " ",
    +    "section": "Data used",
    +    "text": "Data used\n\ndata ExData; \n    input Var1 $ Var2 ...; \n    datalines; \n[Data Lines]; \nrun; \n\n\nexData <- tibble::tribble( \n  ~Var1, ~Var2, \n  \"val1\", 1, \n  \"val2\", 2) \n\na sentence or two about the data. Consider using a package like {skimr} to help illustrate the data."
       },
       {
    -    "objectID": "minutes/posts/10June2024.html#pharma---sug-linkedin-post---chi",
    -    "href": "minutes/posts/10June2024.html#pharma---sug-linkedin-post---chi",
    -    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    -    "section": "Pharma - SUG linkedin Post - Chi",
    -    "text": "Pharma - SUG linkedin Post - Chi\nChi highlighted the incredible post from Phil Bowsher advertising the CAMIS project. This has been seen by over 400 people with 38 reposts to date ! It has also been commented on by renowned statisticians all enthusiastic about CAMIS, so it’s great to have the awareness of the project growing.\nhttps://www.linkedin.com/posts/philip-bowsher-67151015_rinpharma-rstats-pharmaverse-activity-7202038957512036352-k1AU?utm_source=share&utm_medium=member_desktop\nACTION: Harshil to repost/share in a couple of weeks to maximize the reach of the post.\n##Update from Survival team - Christina\nSoma has officially stepped down as CAMIS-ONCO lead, so Christina will act as this for the time being.\nKick off meeting has occurred last month & the team are now meeting monthly. The first objective is for people to bring together information on the non-proportional hazards models.\nIn future, would be great to have someone take on the lead / co-lead if they feel strongly about leading this, but needs someone dedication to making progress !\n##Dissertation scheme kick off - Chi / Lyn/Christina##\nWe have launched a new page here which will provide ideas for students wanting to look at dissertation projects involved in comparing analysis method differences across software. If you have an idea for a project that you want to research but dont have time to investigate the project yourself, then you could write an abstract and save it to this page, where students looking for projects (or academics looking on behalf of students), could find ideas for projects. Expectation is that most would be MSc level (summer 3 month project), however longer PhD style project could also be offered. Please reach out to us if you are interested in contributing to this area."
    +    "objectID": "templates/template.html#example-code-using",
    +    "href": "templates/template.html#example-code-using",
    +    "title": " ",
    +    "section": "Example Code using ",
    +    "text": "Example Code using \nDescribe more details about the method.\nIf needed, add link to other web page/paper/SAS help methodology page, and list them in reference section.\nPrint key results as needed.\nAdd explanations about code and results as needed."
       },
       {
    -    "objectID": "minutes/posts/10June2024.html#goals-reminder",
    -    "href": "minutes/posts/10June2024.html#goals-reminder",
    -    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    -    "section": "2024 Goals Reminder!",
    -    "text": "2024 Goals Reminder!\n\nIncrease to 45 closed by the end of the year - Currently at 37 closed.\nIn addition, we’d like to improve some of the incomplete content such as MMRM - Stephen Waugh dissertation project launched, if accepted would run sept 24-july25.\nCreate a webpage for listings dissertation projects - Ongoing"
    +    "objectID": "templates/template.html#example-code-using-1",
    +    "href": "templates/template.html#example-code-using-1",
    +    "title": " ",
    +    "section": "Example Code using ",
    +    "text": "Example Code using \nAdd if there is more than one package"
       },
       {
    -    "objectID": "minutes/posts/10June2024.html#aob",
    -    "href": "minutes/posts/10June2024.html#aob",
    -    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    -    "section": "AOB",
    -    "text": "AOB\nOur Blog page dosn’t appear in date order or aligned! If anyone can fix let us know ! Saved under News here"
    +    "objectID": "templates/template.html#comparison",
    +    "href": "templates/template.html#comparison",
    +    "title": " ",
    +    "section": "Comparison",
    +    "text": "Comparison\nIf you are comparing more than one package or between different languages, consider adding in a table to illustrate some of the differences. When comparing between languages it can be nice to have a table with links to the pages with deeper dive of each language for a given method method like this table from the ANCOVA page:\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nANCOVA using general linear model and lsmeans\nYes\nYes\nYes\nGLM() function from sasLM with EMEANS=TRUE is the easiest to use and matches SAS\n\n\n\nBut, even if you are just comparing the difference in same language it can be helpful to have a table with values of interest across different packages. Using dynamic content you can add the values to a table without manually putting in each value.\nSAS result is very reliable in many cases."
       },
       {
    -    "objectID": "minutes/posts/17apr2023.html",
    -    "href": "minutes/posts/17apr2023.html",
    -    "title": "White Paper, Website, Launch Plan",
    -    "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n17_apr_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nYes\n\n\nDoug Kelkoff\nYes\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nYes\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nNo\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nNo\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\n\nWhite paper - Lyn/Min-Hua\nLogo - All - voting!\nWebsite progress - Christina\nLaunch Plan - Lyn\nCAMIS-ONCO - Soma Sekhar\nVolunteer Open Roles\nConference Attendance\nAOB\n\n\n\nMeeting minutes\nWhite Paper Update: Min-Hua PHUSE are doing technical review so hopefully will come back shortly with any comments. I reminded them last week. Has been reviewed by leads team, now with steering committee ( Final review team), so hopefully not much longer.\nLOGO: Lyn - By a small majority the preferred option was the calculator without the P<0.05 in it. This will now be redrawn & finalized. ACTION: Lyn will update website when image available. Will save under CAMIS/images so you can use for any posters/ presentations.\nWebsite progress: Christina **All - review of progress & answer any questions\nSurvival - Mia has made great progress on survival, Christina and Lyn to help fix branch issue & then will get it pushed to the live site.\nACTION : Lyn to Create a video of creating a branch / doing updates. push/pull - github pull request. Create a FAQ doc for the website.\nLaunch Plan\n\nAlign launch of website with release of white paper. Blog writing & “Video” launch - Lyn to write & distribute for review\nOnce content created reach out to the following to help advertise\n\nPSI /EFSPI (Martin),\nR Consortium / PHUSE / RSS (Lyn)\nIASCT (Harshal)\nASA (Min-hua may have contact or See if Ben has a contact- ACTION christina to check with ben then get back to Min-hua. Lily Hsieh to ask Leon as he’s part of ASA. Aiming can also reach out to a contact to see she has a contact )\nOthers : TBC\n\n\nCAMIS- ONCO: Soma Sekhar\nPlans are in progress\nReview of volunteer open roles Still looking for volunteers to do: - Co-ordinator for conference material - share standard slides/ content /abstracts /posters - Social media rep - to co-ordinate posts (linkedIn/Twitter) - Volunteers to represent CAMIS at various conferences\nConferences All to let Lyn know or update the conferences qmd if you want to attend and represent/advertise camis"
    +    "objectID": "templates/template.html#conclusion",
    +    "href": "templates/template.html#conclusion",
    +    "title": " ",
    +    "section": "Conclusion",
    +    "text": "Conclusion\nadd a conclusion about which language(s) or package(s) are more recommended.\nThis section could have a feature like paper abstract, e.g. about the selection of package or SAS PROC."
       },
       {
    -    "objectID": "minutes/posts/9sept2024.html",
    -    "href": "minutes/posts/9sept2024.html",
    -    "title": "Lessons learnt- Novartis Hackathon, Diversity Alliance, OSTCDA",
    -    "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n09_Sep_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nNo\n\n\nOrla Doyle\nYes\n\n\nHarshal Khanolkar\nNo\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nYes\n\n\nSarah Rathwell\nNo\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nNo\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nYes\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nNo\n\n\nMichael Kane\nYes\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nNo\n\n\nSeemani Abhilipsa\nYes\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nYes\n\n\nAnwesha Roy\nYes\n\n\nSamrit Pramanik\nYes\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nYes\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nNovartis Hackathon\nOrla presented back to the group on Novartis’s Open-Source in Action: Hackathon. Key points were:\n\nAim: to encourage more people to be confident to work in open source and break down barriers in their contributing (such as through git training). To give people exposure to open-source resources that are applicable to their daily work as well as building their network with external experts.\nHow: Novartis open-source enablement team will hold hackathons on a regular basis selecting topics that have the potential to impact day-to-day work. External experts to guide Novartis employees on key initiatives and packages. This time CAMIS was selected with Christina providing support.\nWhen: Prep session 16th July 2024, Intro to git training 17th July, then 2 weeks of hackathon w/c 22nd July and 29th July with support during daily office hours.\nWho: 158 signed up from Advanced quantitative science (AQS), 100+ attended git training, 25+ submitted contributions. 8 SAS, 7 R, 1 Python, 3 SAS vs R and 1 template\nFeedback: Awards for First PR (Quick draw), most closed PRs (Busy bees), Most complex methodology (trailblazing) and Above and beyond (thinking beyond the methods).\nLearnings:\n\nTiming: aligned to ‘summer rejuvenation’ period where Novartis get 2 weeks to catch up with reduced meeting loads\nTraining: git and renv were a steep learning curve for newcomers, but daily office hours and teams channels helped. Little direction was needed to write content in quarto.\nCAMIS: the natural structure of CAMIS minimized prep work as the gaps in the table show what content is missing. It provided a nice culture to work in, focusing on good quality content over perfection. It was inclusive as it’s a multi-language project so could include people who only work in SAS or in R.\nCAMIS repo cloning often hangs if network is busy. Suggestion to reduce size of repo by removing the powerpoint presentations which would improve cloning.\n\n\n\n\nContent update\n\nSuggest to add page on how to run/ conduct a hackathon for CAMIS\nOnly 4 current open pull requests which all require changes by author so we are up to date\nWe still have a lot of open issues, but are making progress. Aim to get issues to 1 page by End of year\n\n\n\nDiversity Alliance Hackathon\nThe R in Pharma diversity alliance aspire to be an inclusive R community for developers who wok in the pharma space. Their goal is to provide a welcoming, equitable and supportive space for people to upskill, share knowledge and build a community of diverse voices.\nThey are holding an upcoming hackathon as part of the R in Pharma conference, where anyone who considers themselves as under-represented in the R in Pharma space, can participate. The event requires volunteers experienced in open source collaboration to lead attendees in small groups helping them to contribute open source collaborations. If you would like more information, to volunteer or attend, please contact Christina @statasaurus\nSee here for more information\n\n\nConferences\nThe conferences tab is up to date, we didn’t get any volunteers to represent us at PHUSE US connect.\n\n\nOSTCDA numeric matching page\nMichael Rimler is putting together a repo containing information about “Open Source Technology in Clinical Data Analysis (OSTCDA) for PHUSE. We now have a ‘numerical matching’ page here.\nPlease review and feel free to suggest changes to the content. Contact Lyn @drlyntaylor for any further information.\nAOB\n\nSarah raised an issue regarding retrieval of the documentation associated with ‘old’ versions of the R ‘stats’ package. For contributed packages, the documentation is present, but she’s struggling to find the same for the ‘stats’ package. ACTION: Christina to help investigate.\nThe issue highlighted that we may have 1 version of a package which mis-matched with SAS, but that later versions would have different functionality, and may match. Keeping the repo up to date will be a challenge, but hopefully if people are using it, issues will be identified and corrected.\nIt’s a reminder to ensure the code runs, from the data wherever possible. An issue for the SASvsR comparison pages is the comparison table is often typed in, such that if numbers change it wont be automatically updated. This is something we could consider in future. Perhaps running the code to populate the comparison table, and putting out a FAIL if conclusion changes from previous run, highlighting we need to update our written text."
    +    "objectID": "templates/template.html#reference",
    +    "href": "templates/template.html#reference",
    +    "title": " ",
    +    "section": "Reference",
    +    "text": "Reference\nCite all sources and references used in the analysis.\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 24.04.1 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-15\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package     * version date (UTC) lib source\n P cli           3.6.3   2024-06-21 [?] RSPM (R 4.4.0)\n P digest        0.6.37  2024-08-19 [?] RSPM (R 4.4.0)\n P evaluate      1.0.0   2024-09-17 [?] RSPM (R 4.4.0)\n P fansi         1.0.6   2023-12-08 [?] RSPM (R 4.4.0)\n P fastmap       1.2.0   2024-05-15 [?] RSPM (R 4.4.0)\n P glue          1.8.0   2024-09-30 [?] RSPM (R 4.4.0)\n P htmltools     0.5.8.1 2024-04-04 [?] RSPM (R 4.4.0)\n P htmlwidgets   1.6.4   2023-12-06 [?] RSPM (R 4.4.0)\n P jsonlite      1.8.9   2024-09-20 [?] RSPM (R 4.4.0)\n P knitr         1.48    2024-07-07 [?] RSPM (R 4.4.0)\n P lifecycle     1.0.4   2023-11-07 [?] RSPM (R 4.4.0)\n P magrittr      2.0.3   2022-03-30 [?] RSPM (R 4.4.0)\n P pillar        1.9.0   2023-03-22 [?] RSPM (R 4.4.0)\n P pkgconfig     2.0.3   2019-09-22 [?] RSPM (R 4.4.0)\n   renv          1.0.10  2024-10-05 [1] RSPM (R 4.4.0)\n P rlang         1.1.4   2024-06-04 [?] RSPM (R 4.4.0)\n P rmarkdown     2.28    2024-08-17 [?] RSPM (R 4.4.0)\n P sessioninfo   1.2.2   2021-12-06 [?] RSPM (R 4.4.0)\n P tibble        3.2.1   2023-03-20 [?] RSPM (R 4.4.0)\n P utf8          1.2.4   2023-10-22 [?] RSPM (R 4.4.0)\n P vctrs         0.6.5   2023-12-01 [?] RSPM (R 4.4.0)\n P xfun          0.48    2024-10-03 [?] RSPM (R 4.4.0)\n P yaml          2.3.10  2024-07-26 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────"
       },
       {
    -    "objectID": "minutes/posts/21Aug2023.html",
    -    "href": "minutes/posts/21Aug2023.html",
    -    "title": "FDA quartely meeting, FDA CSS, SDEs, website & conference plans",
    +    "objectID": "python/kruskal_wallis.html",
    +    "href": "python/kruskal_wallis.html",
    +    "title": "Kruskal Wallis in Python",
         "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n21_aug_2023\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nYes\n\n\nChi Zhang\nYes\n\n\nClara Beck\nNo\n\n\nAditee Dani\nYes\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nYes\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nYes\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nYes\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\nPHUSE FDA CSS Poster acceptance & white paper planning: Soma Sekhar\nSocial Media update : Harshal\nPHUSE SDEs: Missisauga: June 8th feedback: Jayashreee\nPreparation for PHUSE FDA Quarterly meeting 13th sept:  Questions/Slides feedback: Lyn\nWebsite Christina/ All\n\nNew Role: “Content curation lead”\n\nWe have been missing some posts when added to issues/discussion pages on website\nThis role will Monitor the  “Discussion” and “Issues” pages of the repo, and help to raise at each meeting where we need volunteers to answer questions/ add to discussion.\nWe will add a Standard agenda item lead by the “Content curation lead” to go through issues, & assign to people / close down issues/ discussions.\nIf you would like to volunteer please let Lyn / Christina know.\n\nHow can we encourage creation of more content?\n\n\n\nWhat areas are key for us to focus on\nMMRM update\ngithub training plan (R/Pharma workshop & PSI training course)\n\nUpcoming conference planning.\n\nRSS 7th Sept: Lyn presentation\n\n\n\nPOSIT Conf: Lyn to reach out to Juliane / Doug to ask to include slide for CAMIS\nPHUSE SDE New York: Oct 16th :  Aiming\n\n\n\nMeeting minutes\nReview of Action log\n\n\n\nAction\nAssigned to\nStatus\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nWelcome to new members: Chi Zhang & Filip Kabaj\nPHUSE SDEs: Missisauga: June 8th feedback: Jayashreee\nGPT chat & machine learning for oncology presentations, needs for guidelines on how to use next level tools were discussed. Jayashree presented on behalf of CAMIS but on a Shiny App & got good questions including highlighting that for Endpoint /efficacy analysis they may require very specific standards so not easy to be generic/default. Chris Hurley (PHUSE SDE) also mentioned CAMIS which is great exposure for us.\nPreparation for PHUSE FDA Quarterly meeting 27th sept:  Questions/Slides feedback: Lyn/ Harshal\nMeeting was postponed by 4 weeks so we have time to prepare a short survey and send out on social media. Harshal went through the proposed questionnaire. Filip suggested Q2 to refer to frequency more specifically. Harshal to update & distribute\nSocial Media update : Harshal\nHarshal has posted the PSI poster post to social media. Going forward the proposal is to run a series of posts to focus on the content on the website - perhaps a short post just to say have you seen this new content and provide links.\nRE: Workshop - FDA CSS event (5-7 June): could run a comparison of SAS vs R workshop. Could focus on a set of issues & work though them make content & resolve issues. Could turn to linkedIn to ask wider community to vote for the biggest issue outstanding that they’d like to look into and select these for resolving at the workshop. See item below, as can discuss with Soma following this years FDA CSS event.\nWebsite Christina/ All\n\nThank you ALL!! Much content has been recenly pushed to the website.\nNew Role needed for a “Content curation lead”\n\nWe have been missing some posts when added to issues/discussion pages on website\nThis role will Monitor the  “Discussion” and “Issues” pages of the repo, and help to raise at each meeting where we need volunteers to answer questions/ add to discussion.\nWe will add a Standard agenda item lead by the “Content curation lead” to go through issues, & assign to people / close down issues/ discussions.\nJayashree & Chi volunteered to take on the role & to help monitor the repo activity. Lyn & Christina can put together guidance of what’s needed. Currently it’s just the issues & discussion, as pull requests are currently Ok being approved by Lyn & Christina as it’s a bit tricky to make sure it fits in with the repo and doens’t break anything!\nChi suggested that Christina check out projects to see if that would help to monitor whose doing what - may not work if can only be accessed by those already with granted access as we want anyone to be able to assign themselves. ACTION Christina to: Change the readme to say how to assign yourselves to content tasks.\n\nHow can we encourage creation of more content? / What areas are key for us to focus on\n\nGreat increase in content pre-meeting so Ok to grow organically for now.\nMMRM update : Christina to add link to MMRM website to cross reference.\n\ngithub training plan (R/Pharma workshop - free to attend in end October & PSI training course - series of session each week for x weeks, & PSI Conference Amsterdam - workshop 1.5 hrs.)\n\nPHUSE FDA CSS Poster acceptance (sept 20th) & white paper planning/ CAMIS ONCO: Soma Sekhar\nSoma demonstrated the poster which he’ll present with Vikash at CSS. Focused on Solid tumors OS/PFS but could broaden CAMIS ONCO with time to include other cancer.\nLonger term plan to create a white paper and to load survival analysis in python to repo.\nSoma to work with Harshil & others, to plan a sub team to work on CSS workshop for June 2023.\nLyn asked if there is demand for packages to be written that do standard stats analysis? The difficulty with this is how to standardise the programming and what it adds in addition to existing packages. It may not be worthwhile as options need to be considered so can’t automate.\nUpcoming conference planning.\n\nRSS 7th Sept: Lyn presentation\n\n\n\nPOSIT Conf: Lyn to reach out to Juliane / Doug to ask to include slide for CAMIS\nPHUSE SDE New York: Oct 16th :  Aiming\nR/Pharma - Christina submitted presentation\n\nAOQ/AOB - None."
    +    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of the iris dataset, testing for difference in sepal width between species of flower.\n\nimport pandas as pd\n\n# Define the data\ndata = {\n    'Species': ['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica'],\n    'Sepal_Width': [3.4, 3.0, 3.4, 3.2, 3.5, 3.1, 2.7, 2.9, 2.7, 2.6, 2.5, 2.5, 3.0, 3.0, 3.1, 3.8, 2.7, 3.3]\n}\n\n# Create the DataFrame\niris_sub = pd.DataFrame(data)\n\n# Print the DataFrame\nprint(iris_sub)\n\n       Species  Sepal_Width\n0       setosa          3.4\n1       setosa          3.0\n2       setosa          3.4\n3       setosa          3.2\n4       setosa          3.5\n5       setosa          3.1\n6   versicolor          2.7\n7   versicolor          2.9\n8   versicolor          2.7\n9   versicolor          2.6\n10  versicolor          2.5\n11  versicolor          2.5\n12   virginica          3.0\n13   virginica          3.0\n14   virginica          3.1\n15   virginica          3.8\n16   virginica          2.7\n17   virginica          3.3"
       },
       {
    -    "objectID": "minutes/posts/11Mar2024.html",
    -    "href": "minutes/posts/11Mar2024.html",
    -    "title": "How to select packages, Content & Conferences",
    +    "objectID": "python/kruskal_wallis.html#introduction",
    +    "href": "python/kruskal_wallis.html#introduction",
    +    "title": "Kruskal Wallis in Python",
         "section": "",
    -    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n11_Mar_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nNo\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nLily Hseih\nYes\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nNo\n\n\nKasa Andras\nYes\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nYes\n\n\nMia Qi\nNo\n\n\nLeon Shi\nYes\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nYes\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nYes\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nYes\n\n\nLukas Brausch\nYes\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nThank you to all those who submitted content this month, especially Chi, David and Filip who all helped to complete new sections. The top section is now almost complete and the first python content will be loaded in the next few weeks which is a great milestone for the project. Watch out for the new column appearing in the repository Table of contents!\nPlease remember even if you dont want to contribute to a section on your own, you can still review current content and propose improvements.\nConference planning. Reminder that if you are attending a conference to represent CAMIS to add the detail here. We need to ensure we continue to advertise the project to encourage people to use the repo and add content. So far in 2024, only 3 conferences being attended, so if you are interested in attending a conference just reach out to Lyn & Christina who can help you with an abstract if needed.\n\nVikash fed back about the PHUSE US Connect conference. CAMIS was mentioned by Michael Rimler in the keynote speech and Soma/Vikash presented a poster so we received great publicity. Brian also attended meeting Soma & Vikash face to face. Thank you to all of you. The abstract for PHUSE FDA CSS has been written by Soma and submitted so all on track.\nReminder to complete CAMIS membership form\nhttps://docs.google.com/forms/d/e/1FAIpQLSdDX79P5ByStVS_3n4tK1mAWidazIiF6DMEtDMK8KqmJywjqA/viewform?vc=0&c=0&w=1&flr=0&usp=mail_form_link\nNOTE:  We will only collect: team members name, email address, organization, software used, interested in oncology, key interests and affiliations to stats organizations.  The email address is solely for the CAMIS leadership team, to make sure you are included in CAMIS emails.\nWe ask on the form: “Are you happy for your Name and company and interests to be visible on the CAMIS website. Note that email addresses will not be visible”. \nIf you do not give permission then your name will not appear on the CAMIS repo as a CAMIS team member. If you do give permission, your name and company and interests will appear but your email addresses will be hidden from public view. At any time you can ask to be removed from the website team list by emailing me.\nSelection of packages: As we continue to grow the number of packages stored in the repository is growing. We realized that this may lead to conflicts and issues for the repo running. We also dont really want packages installed that are no longer used, known to have issues. Therefore if you are writing up an analysis and there are two packages doing similar things, we would like to request that you select the one that is the most commonly used and best quality (i.e. lowest risk). Risk can be assessed using the {riskmetric} package and {riskassessment} application, using the default scoring, but packages risk should also be considered in context of the individual components such as being actively maintained, bug fixes, code coverage, with references, with a github repo or website, by a trusted author and with results being correct vs stats method.\nIt can be very useful to test multiple packages if they are able to do slightly different analysis (i.e. with different options), in these cases it’s useful to include a Table at the top of the comparison summary qmd, to show which package does which analysis, see Comparison of 1 sample t-test as an example.\nPackages that are inferior to others, should not be loaded to the repo, but instead you can add a textual summary of your findings. For example, “Package X also gives the same results” or “Package X can be used but doesn’t have options to do X and Y” or “We do not recommend Package X as during testing, the results are not in line with the statistical methodology”.\nNOTE that we agreed not to have a library of packages “approved” for CAMIS, RENV stores the lock file of the packages in our repo and we do not want to be seen to giving recommendations for/against packages, other than factual evidence based on the analysis they produce.\nIt was noted that when you load the RENV.lock file, it may give a “error downloading” bioconductor warning, this can be ignored, and should not cause issue if you aren’t using these packages. In the future, these packages will be removed as dependancies from mmrm and the issue will resolve.\nAOB\n\nWe had a discussion surrounding communication methods currently used on the project. RE: using teams vs emails, feedback was mixed, Argument for Teams was that it keeps all discussion in one place, and doesn’t fill you in box, but arguments against were that as you often have to log out of your company teams, to log into the PHUSE one, messages are often missed / ignored.\nWe agreed to perhaps send 2 emails a month, the agenda, but also any other important updates that occurr during the month & minutes. This will be supported by also posting on social media. Although small sample, we assessed how many people observed the recent post RE: Soma’s poster (only Lyn & Christina of those on the call saw the post), however when asked re: Other PHUSE posts 7 were getting them. Leadership team to discuss and see if we need to post using PHUSE admin?"
    +    "text": "The Kruskal-Wallis test is a non-parametric equivalent to the one-way ANOVA. For this example, the data used is a subset of the iris dataset, testing for difference in sepal width between species of flower.\n\nimport pandas as pd\n\n# Define the data\ndata = {\n    'Species': ['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica', 'virginica'],\n    'Sepal_Width': [3.4, 3.0, 3.4, 3.2, 3.5, 3.1, 2.7, 2.9, 2.7, 2.6, 2.5, 2.5, 3.0, 3.0, 3.1, 3.8, 2.7, 3.3]\n}\n\n# Create the DataFrame\niris_sub = pd.DataFrame(data)\n\n# Print the DataFrame\nprint(iris_sub)\n\n       Species  Sepal_Width\n0       setosa          3.4\n1       setosa          3.0\n2       setosa          3.4\n3       setosa          3.2\n4       setosa          3.5\n5       setosa          3.1\n6   versicolor          2.7\n7   versicolor          2.9\n8   versicolor          2.7\n9   versicolor          2.6\n10  versicolor          2.5\n11  versicolor          2.5\n12   virginica          3.0\n13   virginica          3.0\n14   virginica          3.1\n15   virginica          3.8\n16   virginica          2.7\n17   virginica          3.3"
       },
       {
    -    "objectID": "LICENSE.html",
    -    "href": "LICENSE.html",
    -    "title": "Apache License",
    -    "section": "",
    -    "text": "Apache License\nVersion 2.0, January 2004 <http://www.apache.org/licenses/>\n\nTerms and Conditions for use, reproduction, and distribution\n\n1. Definitions\n“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.\n“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”\n“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n\n2. Grant of Copyright License\nSubject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n\n3. Grant of Patent License\nSubject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n\n4. Redistribution\nYou may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n(b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\nYou may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n\n5. Submission of Contributions\nUnless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n\n6. Trademarks\nThis License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n\n7. Disclaimer of Warranty\nUnless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n\n8. Limitation of Liability\nIn no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n\n9. Accepting Warranty or Additional Liability\nWhile redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\nEND OF TERMS AND CONDITIONS\n\n\n\nAPPENDIX: How to apply the Apache License to your work\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets [] replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.\nCopyright 2024 PHUSE\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n  http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License."
    +    "objectID": "python/kruskal_wallis.html#implementing-kruskal-wallis-in-python",
    +    "href": "python/kruskal_wallis.html#implementing-kruskal-wallis-in-python",
    +    "title": "Kruskal Wallis in Python",
    +    "section": "Implementing Kruskal-Wallis in Python",
    +    "text": "Implementing Kruskal-Wallis in Python\nThe Kruskal-Wallis test can be implemented in Python using the kruskal function from scipy.stats. The null hypothesis is that the samples are from identical populations.\n\nfrom scipy.stats import kruskal\n\n# Separate the data for each species\nsetosa_data = iris_sub[iris_sub['Species'] == 'setosa']['Sepal_Width']\nversicolor_data = iris_sub[iris_sub['Species'] == 'versicolor']['Sepal_Width']\nvirginica_data = iris_sub[iris_sub['Species'] == 'virginica']['Sepal_Width']\n\n# Perform the Kruskal-Wallis H-test\nh_statistic, p_value = kruskal(setosa_data, versicolor_data, virginica_data)\n\n# Calculate the degrees of freedom\nk = len(iris_sub['Species'].unique())\ndf = k - 1\n\nprint(\"H-statistic:\", h_statistic)\nprint(\"p-value:\", p_value)\nprint(\"Degrees of freedom:\", df)\n\nH-statistic: 10.922233820459285\np-value: 0.0042488075570347485\nDegrees of freedom: 2"
       },
       {
    -    "objectID": "contribution/contribution.html",
    -    "href": "contribution/contribution.html",
    -    "title": "Get Involved",
    -    "section": "",
    -    "text": "CAMIS is a community effort. Although this project does have a core team, the endeavor of tracking all these comparisons will fail without community contributions. We appreciate all contributions, big or small!\nYou can get involved in the following ways:\n\njoin our monthly online meetings\nreport a difference or request a new method by filing an issue\ncontribute to our documentation"
    +    "objectID": "python/kruskal_wallis.html#results",
    +    "href": "python/kruskal_wallis.html#results",
    +    "title": "Kruskal Wallis in Python",
    +    "section": "Results",
    +    "text": "Results\nAs seen above, Python outputs the Kruskal-Wallis rank sum statistic (10.922), the degrees of freedom (2), and the p-value of the test (0.004249). Therefore, the difference in population medians is statistically significant at the 5% level."
       },
       {
    -    "objectID": "contribution/contribution.html#how-to-get-involved",
    -    "href": "contribution/contribution.html#how-to-get-involved",
    -    "title": "Get Involved",
    +    "objectID": "python/anova.html",
    +    "href": "python/anova.html",
    +    "title": "ANOVA",
         "section": "",
    -    "text": "CAMIS is a community effort. Although this project does have a core team, the endeavor of tracking all these comparisons will fail without community contributions. We appreciate all contributions, big or small!\nYou can get involved in the following ways:\n\njoin our monthly online meetings\nreport a difference or request a new method by filing an issue\ncontribute to our documentation"
    +    "text": "Analysis of VAriance (ANOVA) is a statistical test to measure the difference between means of more than two groups.It is best suited when the data is normally distributed. By partitioning total variance into components, ANOVA unravels relationship between variables and identifies the true source of variation. It can handle multiple factors and their interactions, providing a robust way to better understand intricate relationships."
       },
       {
    -    "objectID": "contribution/contribution.html#how-to-contribute-to-the-documentation",
    -    "href": "contribution/contribution.html#how-to-contribute-to-the-documentation",
    -    "title": "Get Involved",
    -    "section": "How to contribute to the documentation",
    -    "text": "How to contribute to the documentation\nPlease contribute by submitting a pull request (PR) and our team will review it.\n\nAdding a new page\nIf you are adding a new page, please follow our template guidelines: R or SAS page template and R vs SAS page template\nGood documentation on data, methods are very much appreciated!\n\n\nFirst-time contributors\nWelcome to CAMIS! Please read this article: Get started, which contains some useful information to help you navigate your first PR submission.\n\n\nAsking for help\nIf you need any assistance with setting up your workspace, do not hesitate to contact @DrLynTaylor, @statasaurus and @andreaczhang!"
    +    "objectID": "python/anova.html#introduction",
    +    "href": "python/anova.html#introduction",
    +    "title": "ANOVA",
    +    "section": "",
    +    "text": "Analysis of VAriance (ANOVA) is a statistical test to measure the difference between means of more than two groups.It is best suited when the data is normally distributed. By partitioning total variance into components, ANOVA unravels relationship between variables and identifies the true source of variation. It can handle multiple factors and their interactions, providing a robust way to better understand intricate relationships."
       },
       {
    -    "objectID": "contribution/contribution.html#dissertation-projects",
    -    "href": "contribution/contribution.html#dissertation-projects",
    -    "title": "Get Involved",
    -    "section": "Dissertation projects",
    -    "text": "Dissertation projects\nAre you:\n\na student looking for a dissertation project?\nan academic looking for projects for your students?\na researcher who wants to partner with a university and student to help progress your research?\n\nIf so, check out this page, and contact Lyn @DrLynTaylor for more information."
    +    "objectID": "python/anova.html#anova-test-in-python",
    +    "href": "python/anova.html#anova-test-in-python",
    +    "title": "ANOVA",
    +    "section": "Anova Test in Python",
    +    "text": "Anova Test in Python\nTo perform a one-way ANOVA test in Python we can use the f_oneway() function from SciPy library. Similarly, to perform two-way ANOVA test anova_lm() function from the statsmodel library is frequently used.\nFor this test, we’ll create a data frame called df_disease taken from the SAS documentation. The corresponding data can be found here. In this experiment, we are trying to find the impact of different drug and disease group on the stem-length\n\nimport pandas as pd\nimport statsmodels.api as sm\nfrom statsmodels.formula.api import ols\n\n# Read the sample data\ndf = pd.read_csv(\"../data/sas_disease.csv\")\n\n\n#perform two-way ANOVA\nmodel = ols('y ~ C(drug) + C(disease) + C(drug):C(disease)', data=df).fit()\nsm.stats.anova_lm(model, typ=2)\n\n\n\n\n\n\n\n\nsum_sq\ndf\nF\nPR(>F)\n\n\n\n\nC(drug)\n3063.432863\n3.0\n9.245096\n0.000067\n\n\nC(disease)\n418.833741\n2.0\n1.895990\n0.161720\n\n\nC(drug):C(disease)\n707.266259\n6.0\n1.067225\n0.395846\n\n\nResidual\n5080.816667\n46.0\nNaN\nNaN"
       },
       {
    -    "objectID": "contribution/get_started.html",
    -    "href": "contribution/get_started.html",
    -    "title": "Get Started",
    +    "objectID": "python/two_samples_t_test.html",
    +    "href": "python/two_samples_t_test.html",
    +    "title": "Two Sample t-test",
         "section": "",
    -    "text": "The following instructions provides a step-by-step workflow to set up your workspace. In general, you need\n\nGit, GitHub\nR and Rstudio (especially if you are working on an R article)\nQuarto\nSAS, python (if you work on these topics)\n\n\nSet up Git, Github, Rstudio\nYou will need to get git, github, and RStudio setup to talk to each other. To do this you will need to have a github account and git installed on your computer.\nTo connect your computer to github, we tend to recommend using a PAT because it is bit easier than SSH. We have a script that can help you set that up, found here.\nFor more information Jenny Bryan has a great bookdown explaining how to get setup, alternatively see the following link for a short guidance).\n\n\nFork CAMIS repository to your own\nNow with RStudio all setup, you will need to fork the repository, which basically mean you want to make a copy of this repository that you own, so it will be under your github profile. This will allow you to make changes, without needing direct permission.\nTo do this you will need to go into github, into the CAMIS repo, and click “fork”. This will give you some options of how you want to fork the repo, honestly you can just keep the defaults and then click “Create fork”\n\n\n\n\n\n\n\nClone to your own computer\nOnce you’ve created a copy of this repository, you’ll need to clone it from GitHub to your computer. Click the “code” button to do this.\nThe method you’ll use, either “HTTPS” or “SSH”, depends on how you’ve connected your computer to GitHub. If you’ve set up using a PAT, select the “HTTPS” tab. If you’ve used “SSH”, then choose that tab. Either way, you will need to copy the location in the box.\n\n\n\n\n\n\n\nCreate an Rstudio project with version control\nIn RStudio, you will need to create a new project and select “Version Control” in the project wizard. Then you will select “Git” and finally paste the location copied from github into the URL box. Finally hit “Create Project” and you should be good to go!\n\n\n\n\n\n\n\nCreate your own branch in Rstudio\nGo into RStudio and Create a branch – Give you are working from your own fork, this step it is a bit optional. It is up to you if you want to make a separate branch or not. But, it is generally considered good practice, especially if you are planning on contributing regularly. To do this from RStudio click the branch button (on the git tab top right). Within the box that comes up ensure you are on the “remote=origin” and “Sync branch with remote” is checked. You can name the branch something to do with the amends you intend to make.\n\n\nStart writing\nEdit and /or add files within the CAMIS directories. If you are adding SAS guidance store under sas folder, R guidance store under r folder, for “SAS vs R” comparison store under comp. Follow the naming convention of the files already stored in those folders.\n\n\nCommit your changes, push to remote\nWithin Rstudio - Commit each change or new file added, and push to the repo from within R studio. Once you have completed the change you want to make, it is time for a pull request. Before we start though, it is good to check that your branch on github contains all the update you have done. If not you may need to push from Rstudio before moving onto the pull request.\n\n\n\nThis is what it will look like if you still need to push\n\n\n\n\nCreate a pull request\nPull request in github - Back on your fork in github you will see that your repo is now ahead of the main CAMIS repository. The first thing you want to do is make sure there aren’t any conflict that have arisen with the main repository, so you need to click ‘Sync fork’.\n\n\n\n\n\nIf that is all good then you can create a pull request by clicking on ‘Contribute’ and then ‘Open pull request’. This brings you to a page where you can explain your pull request if you like or you can just confirm you would like to go through with this pull request.\nThe final step is to add a reviewer, please add DrLynTaylor, statasaurus and andreaczhang. For more details about making pull requests see create a pull request.\nOnce your change is approved, and merged into the origin, you will be able to see your changes on CAMIS. If you have made a branch in your fork the branch will be deleted and you will need to create a new branch to add further contributions. NOTE: you can make the new branch called the same as the old one if you wish but ensure you select to overwrite the previous one."
    +    "text": "The Two Sample t-test is used to compare two independent samples against each other. In the Two Sample t-test, the mean of the first sample is compared against the mean of the second sample. In Python, a Two Sample t-test can be performed using the stats package from scipy.\n\n\nThe following data was used in this example.\n\nimport pandas as pd\nimport numpy as np\nfrom scipy import stats\n\n# Create sample data\ndata = {\n    'trt_grp': ['placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'placebo', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment', 'treatment'],\n    'WtGain': [94, 12, 26, 89, 88, 96, 85, 130, 75, 54, 112, 69, 104, 95, 53, 21, 45, 62, 96, 128, 120, 99, 28, 50, 109, 115, 39, 96, 87, 100, 76, 80]\n}\n\ndf = pd.DataFrame(data)\n\n\n\n\nIf we have normalized data, we can use the classic Student’s t-test. For a Two sample test where the variances are not equal, we should use the Welch’s t-test. Both of those options are available in the scipy stats package.\n\n\n\n\nThe following code was used to test the comparison in Python. Note that we must separate the single variable into two variables to satisfy the scipy stats package syntax.\n\n# Separate data into two groups\ngroup1 = df[df['trt_grp'] == 'placebo']['WtGain']\ngroup2 = df[df['trt_grp'] == 'treatment']['WtGain']\n\n# Perform Student's t-test assuming equal variances\nt_stat, p_value_equal_var = stats.ttest_ind(group1, group2, equal_var=True)\n\nprint(\"Student's T-Test assuming equal variances:\")\nprint(f\"T-statistic: {t_stat}\")\nprint(f\"P-value: {p_value_equal_var}\")\n\nStudent's T-Test assuming equal variances:\nT-statistic: -0.6969002027708538\nP-value: 0.4912306166204561\n\n\n\n\n\n\n\n\nThe following code was used to test the comparison in Python using Welch’s t-test.\n\n# Perform Welch's t-test assuming unequal variances\nt_stat_welch, p_value_unequal_var = stats.ttest_ind(group1, group2, equal_var=False)\n\nprint(\"\\nWelch's T-Test assuming unequal variances:\")\nprint(f\"T-statistic: {t_stat_welch}\")\nprint(f\"P-value: {p_value_unequal_var}\")\n\n\nWelch's T-Test assuming unequal variances:\nT-statistic: -0.6969002027708538\nP-value: 0.4912856152047901"
       },
       {
    -    "objectID": "R/mmrm.html",
    -    "href": "R/mmrm.html",
    -    "title": "MMRM in R",
    +    "objectID": "python/two_samples_t_test.html#python",
    +    "href": "python/two_samples_t_test.html#python",
    +    "title": "Two Sample t-test",
         "section": "",
    -    "text": "Mixed models for repeated measures (MMRM) are a popular choice for analyzing longitudinal continuous outcomes in randomized clinical trials and beyond; see Cnaan, Laird and Slasor (1997) for a tutorial and Mallinckrodt, Lane and Schnell (2008) for a review.\nThis vignette shows examples from the mmrm package.\nThe mmrm package implements MMRM based on the marginal linear model without random effects using Template Model Builder (TMB) which enables fast and robust model fitting. Users can specify a variety of covariance matrices, weight observations, fit models with restricted or standard maximum likelihood inference, perform hypothesis testing with Satterthwaite or Kenward-Roger adjustment, and extract least square means estimates by using emmeans.\n\n\n\nFlexible covariance specification:\n\nStructures: unstructured, Toeplitz, AR1, compound symmetry, ante-dependence, and spatial exponential.\nGroups: shared covariance structure for all subjects or group-specific covariance estimates.\nVariances: homogeneous or heterogeneous across time points.\n\nInference:\n\nSupports REML and ML.\nSupports weights.\n\nHypothesis testing:\n\nLeast square means: can be obtained with the emmeans package\nOne- and multi-dimensional linear contrasts of model parameters can be tested.\nSatterthwaite adjusted degrees of freedom.\nKenward-Roger adjusted degrees of freedom and coefficients covariance matrix.\nCoefficient Covariance\n\nC++ backend:\n\nFast implementation using C++ and automatic differentiation to obtain precise gradient information for model fitting.\nModel fitting algorithm details used in mmrm.\n\nPackage ecosystems integration:\n\nIntegration with tidymodels package ecosystem\n\nDedicated parsnip engine for linear regression\nIntegration with recipes\n\nIntegration with tern package ecosystems\n\nThe tern.mmrm package can be used to run the mmrm fit and generate tabulation and plots of least square means per visit and treatment arm, tabulation of model diagnostics, diagnostic graphs, and other standard model outputs.\n\n\n\n\n\n\nSee also the introductory vignette\nThe code below implements an MMRM fit in R with the mmrm::mmrm function.\n\nlibrary(mmrm)\nfit <- mmrm(\n  formula = FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID),\n  data = fev_data\n)\n\nThe code specifies an MMRM with the given covariates and an unstructured covariance matrix for the timepoints (also called visits in the clinical trial context, here given by AVISIT) within the subjects (here USUBJID). While by default this uses restricted maximum likelihood (REML), it is also possible to use ML, see ?mmrm.\nPrinting the object will show you output which should be familiar to anyone who has used any popular modeling functions such as stats::lm(), stats::glm(), glmmTMB::glmmTMB(), and lme4::nlmer(). From this print out we see the function call, the data used, the covariance structure with number of variance parameters, as well as the likelihood method, and model deviance achieved. Additionally the user is provided a printout of the estimated coefficients and the model convergence information:\n\nfit\n\nmmrm fit\n\nFormula:     FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID)\nData:        fev_data (used 537 observations from 197 subjects with maximum 4 \ntimepoints)\nCovariance:  unstructured (10 variance parameters)\nInference:   REML\nDeviance:    3386.45\n\nCoefficients: \n                  (Intercept) RACEBlack or African American \n                  30.77747548                    1.53049977 \n                    RACEWhite                     SEXFemale \n                   5.64356535                    0.32606192 \n                     ARMCDTRT                    AVISITVIS2 \n                   3.77423004                    4.83958845 \n                   AVISITVIS3                    AVISITVIS4 \n                  10.34211288                   15.05389826 \n          ARMCDTRT:AVISITVIS2           ARMCDTRT:AVISITVIS3 \n                  -0.04192625                   -0.69368537 \n          ARMCDTRT:AVISITVIS4 \n                   0.62422703 \n\nModel Inference Optimization:\nConverged with code 0 and message: convergence: rel_reduction_of_f <= factr*epsmch\n\n\nThe summary() method then provides the coefficients table with Satterthwaite degrees of freedom as well as the covariance matrix estimate:\n\nfit |>\n  summary()\n\nmmrm fit\n\nFormula:     FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID)\nData:        fev_data (used 537 observations from 197 subjects with maximum 4 \ntimepoints)\nCovariance:  unstructured (10 variance parameters)\nMethod:      Satterthwaite\nVcov Method: Asymptotic\nInference:   REML\n\nModel selection criteria:\n     AIC      BIC   logLik deviance \n  3406.4   3439.3  -1693.2   3386.4 \n\nCoefficients: \n                               Estimate Std. Error        df t value Pr(>|t|)\n(Intercept)                    30.77748    0.88656 218.80000  34.715  < 2e-16\nRACEBlack or African American   1.53050    0.62448 168.67000   2.451 0.015272\nRACEWhite                       5.64357    0.66561 157.14000   8.479 1.56e-14\nSEXFemale                       0.32606    0.53195 166.13000   0.613 0.540744\nARMCDTRT                        3.77423    1.07415 145.55000   3.514 0.000589\nAVISITVIS2                      4.83959    0.80172 143.88000   6.037 1.27e-08\nAVISITVIS3                     10.34211    0.82269 155.56000  12.571  < 2e-16\nAVISITVIS4                     15.05390    1.31281 138.47000  11.467  < 2e-16\nARMCDTRT:AVISITVIS2            -0.04193    1.12932 138.56000  -0.037 0.970439\nARMCDTRT:AVISITVIS3            -0.69369    1.18765 158.17000  -0.584 0.559996\nARMCDTRT:AVISITVIS4             0.62423    1.85085 129.72000   0.337 0.736463\n                                 \n(Intercept)                   ***\nRACEBlack or African American *  \nRACEWhite                     ***\nSEXFemale                        \nARMCDTRT                      ***\nAVISITVIS2                    ***\nAVISITVIS3                    ***\nAVISITVIS4                    ***\nARMCDTRT:AVISITVIS2              \nARMCDTRT:AVISITVIS3              \nARMCDTRT:AVISITVIS4              \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\nCovariance estimate:\n        VIS1    VIS2    VIS3    VIS4\nVIS1 40.5537 14.3960  4.9747 13.3867\nVIS2 14.3960 26.5715  2.7855  7.4745\nVIS3  4.9747  2.7855 14.8979  0.9082\nVIS4 13.3867  7.4745  0.9082 95.5568\n\n\n\n\n\nIn order to extract relevant marginal means (LSmeans) and contrasts we can use the emmeans package. This package includes methods that allow mmrm objects to be used with the emmeans package. emmeans computes estimated marginal means (also called least-square means) for the coefficients of the MMRM.\n\nif (require(emmeans)) {\n  emmeans(fit, ~ ARMCD | AVISIT)\n}\n\nLoading required package: emmeans\n\n\nmmrm() registered as emmeans extension\n\n\nWelcome to emmeans.\nCaution: You lose important information if you filter this package's results.\nSee '? untidy'\n\n\nAVISIT = VIS1:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     33.3 0.755 148     31.8     34.8\n TRT     37.1 0.763 143     35.6     38.6\n\nAVISIT = VIS2:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     38.2 0.612 147     37.0     39.4\n TRT     41.9 0.602 143     40.7     43.1\n\nAVISIT = VIS3:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     43.7 0.462 130     42.8     44.6\n TRT     46.8 0.509 130     45.7     47.8\n\nAVISIT = VIS4:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     48.4 1.189 134     46.0     50.7\n TRT     52.8 1.188 133     50.4     55.1\n\nResults are averaged over the levels of: RACE, SEX \nConfidence level used: 0.95 \n\n\nNote that the degrees of freedom choice is inherited here from the initial mmrm fit."
    +    "text": "If we have normalized data, we can use the classic Student’s t-test. For a Two sample test where the variances are not equal, we should use the Welch’s t-test. Both of those options are available in the scipy stats package.\n\n\n\n\nThe following code was used to test the comparison in Python. Note that we must separate the single variable into two variables to satisfy the scipy stats package syntax.\n\n# Separate data into two groups\ngroup1 = df[df['trt_grp'] == 'placebo']['WtGain']\ngroup2 = df[df['trt_grp'] == 'treatment']['WtGain']\n\n# Perform Student's t-test assuming equal variances\nt_stat, p_value_equal_var = stats.ttest_ind(group1, group2, equal_var=True)\n\nprint(\"Student's T-Test assuming equal variances:\")\nprint(f\"T-statistic: {t_stat}\")\nprint(f\"P-value: {p_value_equal_var}\")\n\nStudent's T-Test assuming equal variances:\nT-statistic: -0.6969002027708538\nP-value: 0.4912306166204561\n\n\n\n\n\n\n\n\nThe following code was used to test the comparison in Python using Welch’s t-test.\n\n# Perform Welch's t-test assuming unequal variances\nt_stat_welch, p_value_unequal_var = stats.ttest_ind(group1, group2, equal_var=False)\n\nprint(\"\\nWelch's T-Test assuming unequal variances:\")\nprint(f\"T-statistic: {t_stat_welch}\")\nprint(f\"P-value: {p_value_unequal_var}\")\n\n\nWelch's T-Test assuming unequal variances:\nT-statistic: -0.6969002027708538\nP-value: 0.4912856152047901"
       },
       {
    -    "objectID": "R/mmrm.html#fitting-the-mmrm-in-r",
    -    "href": "R/mmrm.html#fitting-the-mmrm-in-r",
    -    "title": "MMRM in R",
    +    "objectID": "python/skewness_kurtosis.html",
    +    "href": "python/skewness_kurtosis.html",
    +    "title": "Skewness/Kurtosis",
         "section": "",
    -    "text": "Mixed models for repeated measures (MMRM) are a popular choice for analyzing longitudinal continuous outcomes in randomized clinical trials and beyond; see Cnaan, Laird and Slasor (1997) for a tutorial and Mallinckrodt, Lane and Schnell (2008) for a review.\nThis vignette shows examples from the mmrm package.\nThe mmrm package implements MMRM based on the marginal linear model without random effects using Template Model Builder (TMB) which enables fast and robust model fitting. Users can specify a variety of covariance matrices, weight observations, fit models with restricted or standard maximum likelihood inference, perform hypothesis testing with Satterthwaite or Kenward-Roger adjustment, and extract least square means estimates by using emmeans.\n\n\n\nFlexible covariance specification:\n\nStructures: unstructured, Toeplitz, AR1, compound symmetry, ante-dependence, and spatial exponential.\nGroups: shared covariance structure for all subjects or group-specific covariance estimates.\nVariances: homogeneous or heterogeneous across time points.\n\nInference:\n\nSupports REML and ML.\nSupports weights.\n\nHypothesis testing:\n\nLeast square means: can be obtained with the emmeans package\nOne- and multi-dimensional linear contrasts of model parameters can be tested.\nSatterthwaite adjusted degrees of freedom.\nKenward-Roger adjusted degrees of freedom and coefficients covariance matrix.\nCoefficient Covariance\n\nC++ backend:\n\nFast implementation using C++ and automatic differentiation to obtain precise gradient information for model fitting.\nModel fitting algorithm details used in mmrm.\n\nPackage ecosystems integration:\n\nIntegration with tidymodels package ecosystem\n\nDedicated parsnip engine for linear regression\nIntegration with recipes\n\nIntegration with tern package ecosystems\n\nThe tern.mmrm package can be used to run the mmrm fit and generate tabulation and plots of least square means per visit and treatment arm, tabulation of model diagnostics, diagnostic graphs, and other standard model outputs.\n\n\n\n\n\n\nSee also the introductory vignette\nThe code below implements an MMRM fit in R with the mmrm::mmrm function.\n\nlibrary(mmrm)\nfit <- mmrm(\n  formula = FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID),\n  data = fev_data\n)\n\nThe code specifies an MMRM with the given covariates and an unstructured covariance matrix for the timepoints (also called visits in the clinical trial context, here given by AVISIT) within the subjects (here USUBJID). While by default this uses restricted maximum likelihood (REML), it is also possible to use ML, see ?mmrm.\nPrinting the object will show you output which should be familiar to anyone who has used any popular modeling functions such as stats::lm(), stats::glm(), glmmTMB::glmmTMB(), and lme4::nlmer(). From this print out we see the function call, the data used, the covariance structure with number of variance parameters, as well as the likelihood method, and model deviance achieved. Additionally the user is provided a printout of the estimated coefficients and the model convergence information:\n\nfit\n\nmmrm fit\n\nFormula:     FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID)\nData:        fev_data (used 537 observations from 197 subjects with maximum 4 \ntimepoints)\nCovariance:  unstructured (10 variance parameters)\nInference:   REML\nDeviance:    3386.45\n\nCoefficients: \n                  (Intercept) RACEBlack or African American \n                  30.77747548                    1.53049977 \n                    RACEWhite                     SEXFemale \n                   5.64356535                    0.32606192 \n                     ARMCDTRT                    AVISITVIS2 \n                   3.77423004                    4.83958845 \n                   AVISITVIS3                    AVISITVIS4 \n                  10.34211288                   15.05389826 \n          ARMCDTRT:AVISITVIS2           ARMCDTRT:AVISITVIS3 \n                  -0.04192625                   -0.69368537 \n          ARMCDTRT:AVISITVIS4 \n                   0.62422703 \n\nModel Inference Optimization:\nConverged with code 0 and message: convergence: rel_reduction_of_f <= factr*epsmch\n\n\nThe summary() method then provides the coefficients table with Satterthwaite degrees of freedom as well as the covariance matrix estimate:\n\nfit |>\n  summary()\n\nmmrm fit\n\nFormula:     FEV1 ~ RACE + SEX + ARMCD * AVISIT + us(AVISIT | USUBJID)\nData:        fev_data (used 537 observations from 197 subjects with maximum 4 \ntimepoints)\nCovariance:  unstructured (10 variance parameters)\nMethod:      Satterthwaite\nVcov Method: Asymptotic\nInference:   REML\n\nModel selection criteria:\n     AIC      BIC   logLik deviance \n  3406.4   3439.3  -1693.2   3386.4 \n\nCoefficients: \n                               Estimate Std. Error        df t value Pr(>|t|)\n(Intercept)                    30.77748    0.88656 218.80000  34.715  < 2e-16\nRACEBlack or African American   1.53050    0.62448 168.67000   2.451 0.015272\nRACEWhite                       5.64357    0.66561 157.14000   8.479 1.56e-14\nSEXFemale                       0.32606    0.53195 166.13000   0.613 0.540744\nARMCDTRT                        3.77423    1.07415 145.55000   3.514 0.000589\nAVISITVIS2                      4.83959    0.80172 143.88000   6.037 1.27e-08\nAVISITVIS3                     10.34211    0.82269 155.56000  12.571  < 2e-16\nAVISITVIS4                     15.05390    1.31281 138.47000  11.467  < 2e-16\nARMCDTRT:AVISITVIS2            -0.04193    1.12932 138.56000  -0.037 0.970439\nARMCDTRT:AVISITVIS3            -0.69369    1.18765 158.17000  -0.584 0.559996\nARMCDTRT:AVISITVIS4             0.62423    1.85085 129.72000   0.337 0.736463\n                                 \n(Intercept)                   ***\nRACEBlack or African American *  \nRACEWhite                     ***\nSEXFemale                        \nARMCDTRT                      ***\nAVISITVIS2                    ***\nAVISITVIS3                    ***\nAVISITVIS4                    ***\nARMCDTRT:AVISITVIS2              \nARMCDTRT:AVISITVIS3              \nARMCDTRT:AVISITVIS4              \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\nCovariance estimate:\n        VIS1    VIS2    VIS3    VIS4\nVIS1 40.5537 14.3960  4.9747 13.3867\nVIS2 14.3960 26.5715  2.7855  7.4745\nVIS3  4.9747  2.7855 14.8979  0.9082\nVIS4 13.3867  7.4745  0.9082 95.5568\n\n\n\n\n\nIn order to extract relevant marginal means (LSmeans) and contrasts we can use the emmeans package. This package includes methods that allow mmrm objects to be used with the emmeans package. emmeans computes estimated marginal means (also called least-square means) for the coefficients of the MMRM.\n\nif (require(emmeans)) {\n  emmeans(fit, ~ ARMCD | AVISIT)\n}\n\nLoading required package: emmeans\n\n\nmmrm() registered as emmeans extension\n\n\nWelcome to emmeans.\nCaution: You lose important information if you filter this package's results.\nSee '? untidy'\n\n\nAVISIT = VIS1:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     33.3 0.755 148     31.8     34.8\n TRT     37.1 0.763 143     35.6     38.6\n\nAVISIT = VIS2:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     38.2 0.612 147     37.0     39.4\n TRT     41.9 0.602 143     40.7     43.1\n\nAVISIT = VIS3:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     43.7 0.462 130     42.8     44.6\n TRT     46.8 0.509 130     45.7     47.8\n\nAVISIT = VIS4:\n ARMCD emmean    SE  df lower.CL upper.CL\n PBO     48.4 1.189 134     46.0     50.7\n TRT     52.8 1.188 133     50.4     55.1\n\nResults are averaged over the levels of: RACE, SEX \nConfidence level used: 0.95 \n\n\nNote that the degrees of freedom choice is inherited here from the initial mmrm fit."
    +    "text": "Skewness measures the the amount of asymmetry in a distribution, while Kurtosis describes the “tailedness” of the curve. These measures are frequently used to assess the normality of the data. There are several methods to calculate these measures. In Python, the packages pandas, scipy.stats.skew and scipy.stats.kurtosis can be used.\n\n\n\nimport pandas as pd\nfrom scipy.stats import skew, kurtosis\n\n# Create sample data\ndata = {\n    'team': [\"A\"]*5 + [\"B\"]*5 + [\"C\"]*5,\n    'points': [10, 17, 17, 18, 15, 10, 14, 13, 29, 25, 12, 30, 34, 12, 11],\n    'assists': [2, 5, 6, 3, 0, 2, 5, 4, 0, 2, 1, 1, 3, 4, 7]\n}\ndf = pd.DataFrame(data)\n\n\n\nJoanes and Gill (1998) discusses three methods for estimating skewness:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_1 = m_1/m_2^{3/2}\\]\n\nType 2: Used in SAS and SPSS\n\\[\nG_1 = g_1\\sqrt{n(n-1)}/(n-2)\n\\]\nType 3: Used in MINITAB and BMDP\n\\[\nb_1 = m_3/s^3 = g_1((n-1)/n)^{3/2}\n\\]\n\nAll three skewness measures are unbiased under normality. The three methods are illustrated in the following code:\n\n# Skewness\ntype1_skew = skew(df['points'])\ntype2_skew = df['points'].skew()\ntype3_skew = skew(df['points']) * ((len(df['points']) - 1) / len(df['points'])) ** (3/2)\n\nprint(f\"Skewness - Type 1: {type1_skew}\")\nprint(f\"Skewness - Type 2: {type2_skew}\")\nprint(f\"Skewness - Type 3: {type3_skew}\")\n\nSkewness - Type 1: 0.9054442043798532\nSkewness - Type 2: 1.0093179298709385\nSkewness - Type 3: 0.816426058828937\n\n\nThe default for the scipy.stats.skew function is type 1.\n\n\n\nJoanes and Gill (1998) discuss three methods for estimating kurtosis:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_2 = m_4/m_2^{2}-3\\]\n\nType 2: Used in SAS and SPSS\n\\[G_2 = ((n+1)g_2+6)*\\frac{(n-1)}{(n-2)(n-3)}\\]\nType 3: Used in MINITAB and BMDP\n\\[b_2 = m_4/s^4-3 = (g_2 + 3)(1-1/n)^2-3\\]\n\nOnly \\(G_2\\) (corresponding to type 2) is unbiased under normality. The three methods are illustrated in the following code:\n\n# Kurtosis\ntype1_kurt = kurtosis(df['points'])\n\nn = len(df['points'])\ng2 = kurtosis(df['points'], fisher=True)  # Fisher's kurtosis\n\n# Calculate the kurtosis type using the formula G2\ntype2_kurt = ((n + 1) * g2 + 6) * ((n - 1) / ((n - 2) * (n - 3)))\n\n# Calculate the kurtosis type using the formula b2\nn = len(df['points'])\ng2 = kurtosis(df['points'], fisher=True)  # Fisher's kurtosis\n\ntype3_kurt = (g2 + 3) * ((1 - 1/n) ** 2) - 3\n\nprint(f\"Kurtosis - Type 1: {type1_kurt}\")\nprint(f\"Kurtosis - Type 2: {type2_kurt}\")\nprint(f\"Kurtosis - Type 3: {type3_kurt}\")\n\nKurtosis - Type 1: -0.5833410771247833\nKurtosis - Type 2: -0.2991564184355863\nKurtosis - Type 3: -0.8948215605175891\n\n\nThe default for the scipy.stats.kurtosis function is type 1."
       },
       {
    -    "objectID": "R/summary-stats.html",
    -    "href": "R/summary-stats.html",
    -    "title": "Deriving Quantiles or Percentiles in R",
    +    "objectID": "python/skewness_kurtosis.html#data-used",
    +    "href": "python/skewness_kurtosis.html#data-used",
    +    "title": "Skewness/Kurtosis",
         "section": "",
    -    "text": "Percentiles can be calculated in R using the quantile function. The function has the argument type which allows for nine different percentile definitions to be used. The default is type = 7, which uses a piecewise-linear estimate of the cumulative distribution function to find percentiles.\nThis is how the 25th and 40th percentiles of aval could be calculated using the default type.\n\nquantile(aval, probs = c(0.25, 0.4))"
    +    "text": "import pandas as pd\nfrom scipy.stats import skew, kurtosis\n\n# Create sample data\ndata = {\n    'team': [\"A\"]*5 + [\"B\"]*5 + [\"C\"]*5,\n    'points': [10, 17, 17, 18, 15, 10, 14, 13, 29, 25, 12, 30, 34, 12, 11],\n    'assists': [2, 5, 6, 3, 0, 2, 5, 4, 0, 2, 1, 1, 3, 4, 7]\n}\ndf = pd.DataFrame(data)\n\n\n\nJoanes and Gill (1998) discusses three methods for estimating skewness:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_1 = m_1/m_2^{3/2}\\]\n\nType 2: Used in SAS and SPSS\n\\[\nG_1 = g_1\\sqrt{n(n-1)}/(n-2)\n\\]\nType 3: Used in MINITAB and BMDP\n\\[\nb_1 = m_3/s^3 = g_1((n-1)/n)^{3/2}\n\\]\n\nAll three skewness measures are unbiased under normality. The three methods are illustrated in the following code:\n\n# Skewness\ntype1_skew = skew(df['points'])\ntype2_skew = df['points'].skew()\ntype3_skew = skew(df['points']) * ((len(df['points']) - 1) / len(df['points'])) ** (3/2)\n\nprint(f\"Skewness - Type 1: {type1_skew}\")\nprint(f\"Skewness - Type 2: {type2_skew}\")\nprint(f\"Skewness - Type 3: {type3_skew}\")\n\nSkewness - Type 1: 0.9054442043798532\nSkewness - Type 2: 1.0093179298709385\nSkewness - Type 3: 0.816426058828937\n\n\nThe default for the scipy.stats.skew function is type 1.\n\n\n\nJoanes and Gill (1998) discuss three methods for estimating kurtosis:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_2 = m_4/m_2^{2}-3\\]\n\nType 2: Used in SAS and SPSS\n\\[G_2 = ((n+1)g_2+6)*\\frac{(n-1)}{(n-2)(n-3)}\\]\nType 3: Used in MINITAB and BMDP\n\\[b_2 = m_4/s^4-3 = (g_2 + 3)(1-1/n)^2-3\\]\n\nOnly \\(G_2\\) (corresponding to type 2) is unbiased under normality. The three methods are illustrated in the following code:\n\n# Kurtosis\ntype1_kurt = kurtosis(df['points'])\n\nn = len(df['points'])\ng2 = kurtosis(df['points'], fisher=True)  # Fisher's kurtosis\n\n# Calculate the kurtosis type using the formula G2\ntype2_kurt = ((n + 1) * g2 + 6) * ((n - 1) / ((n - 2) * (n - 3)))\n\n# Calculate the kurtosis type using the formula b2\nn = len(df['points'])\ng2 = kurtosis(df['points'], fisher=True)  # Fisher's kurtosis\n\ntype3_kurt = (g2 + 3) * ((1 - 1/n) ** 2) - 3\n\nprint(f\"Kurtosis - Type 1: {type1_kurt}\")\nprint(f\"Kurtosis - Type 2: {type2_kurt}\")\nprint(f\"Kurtosis - Type 3: {type3_kurt}\")\n\nKurtosis - Type 1: -0.5833410771247833\nKurtosis - Type 2: -0.2991564184355863\nKurtosis - Type 3: -0.8948215605175891\n\n\nThe default for the scipy.stats.kurtosis function is type 1."
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html",
    -    "href": "R/Accelerated_Failure_time_model.html",
    -    "title": "Accelerated Failure Time Model",
    +    "objectID": "python/Rounding.html",
    +    "href": "python/Rounding.html",
    +    "title": "Rounding in Python",
         "section": "",
    -    "text": "The accelerated failure time model is a parametric survival analysis technique used to model the relationship between the time to event of interest (e.g., time to failure) and a set of predictor variables. It assumes that the covariates have a multiplicative effect on the time to the event. In other words, the time to event is accelerated or decelerated by a factor that depends on the values of the covariates.This differs from the Cox proportional hazards model, which assumes that covariates have a multiplicative effect on the hazard rate, not the time to the event."
    +    "text": "Python has a built-in round() function that takes two numeric arguments, number and ndigits, and returns a floating point number that is a rounded version of the number up to the specified number of decimals.\nThe default number of decimal is 0, meaning that the function will return the nearest integer.\n\n# For integers\nx= 12\nprint(round(x))\n \n# For floating point\nx= 12.3\nprint(round(22.7))  \n \n# if the second parameter is present\n \n# when the (ndigit+1)th digit is =5 \nx=4.465\nprint(round(x, 2)) \n   \n# when the (ndigit+1)th digit is >=5 \nx=4.476\nprint(round(x, 2))   \n   \n# when the (ndigit+1)th digit is <5 \nx=4.473\nprint(round(x, 2))\n\n12\n23\n4.46\n4.48\n4.47"
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#mathematical-expression",
    -    "href": "R/Accelerated_Failure_time_model.html#mathematical-expression",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Mathematical Expression",
    -    "text": "Mathematical Expression\nMathematically, the AFT model can be expressed as:\n\\(\\log(T) = X\\beta + \\sigma\\varepsilon\\)\nWhere:\n\nT is the survival time\nlog(T) is the logarithm of the survival time\nX is a matrix of predictor variables\nβ is a vector of coefficients representing the effects of the predictor variables on the logarithm of the survival time\nσ is a scaler quantity representing the scale parameter, which influences the variability of the error term ε in the model.\nε is the error term assumed to follow a specific distribution (e.g., normal distribution for log-normal, extreme value distribution for Weibull) that corresponds to the chosen parametric form of the model."
    +    "objectID": "python/MANOVA.html",
    +    "href": "python/MANOVA.html",
    +    "title": "MANOVA",
    +    "section": "",
    +    "text": "MANOVA in Python\nMultivariate analysis of variance (MANOVA) is a statistical technique used to examine group mean difference of several dependent variables at once while accounting for correlations between the variables.By considering multiple dependent variables simultaneously, MANOVA provides a more comprehensive understanding of group differences and patterns. In context of python, statsmodels library can be used to implement MANOVA.\nThe from_formula() function is the recommended method to specify a model and simplifies testing without needing to manually configure the contrast matrices.\nExample 39.6 Multivariate Analysis of Variance from SAS MANOVA User Guide\nThis example employs multivariate analysis of variance (MANOVA) to measure differences in the chemical characteristics of ancient pottery found at four kiln sites in Great Britain. The data are from Tubb, Parker, and Nickless (1980), as reported in Hand et al. (1994).\nFor each of 26 samples of pottery, the percentages of oxides of five metals are measured. The following statements create the data set and invoke the GLM procedure to perform a one-way MANOVA. Additionally, it is of interest to know whether the pottery from one site in Wales (Llanederyn) differs from the samples from other sites; a CONTRAST statement is used to test this hypothesis.\n\nimport pandas as pd\nfrom statsmodels.multivariate.manova import MANOVA\n\ndf= pd.read_csv(\"../data/manova1.csv\")\ndf.rename(columns={'al':'Al','fe':'Fe','mg':'Mg','ca ':'Ca','na':'Na'},inplace=True)\n\nmanova = MANOVA.from_formula('Al + Fe + Mg + Ca + Na ~ site', data=df)\nresult = manova.mv_test()\nprint(result)\n\n                   Multivariate linear model\n===============================================================\n                                                               \n---------------------------------------------------------------\n        Intercept         Value  Num DF  Den DF F Value  Pr > F\n---------------------------------------------------------------\n           Wilks' lambda  0.0300 5.0000 18.0000 116.5838 0.0000\n          Pillai's trace  0.9700 5.0000 18.0000 116.5838 0.0000\n  Hotelling-Lawley trace 32.3844 5.0000 18.0000 116.5838 0.0000\n     Roy's greatest root 32.3844 5.0000 18.0000 116.5838 0.0000\n---------------------------------------------------------------\n                                                               \n---------------------------------------------------------------\n          site           Value   Num DF  Den DF F Value  Pr > F\n---------------------------------------------------------------\n          Wilks' lambda  0.0123 15.0000 50.0915  13.0885 0.0000\n         Pillai's trace  1.5539 15.0000 60.0000   4.2984 0.0000\n Hotelling-Lawley trace 35.4388 15.0000 29.1304  40.5880 0.0000\n    Roy's greatest root 34.1611  5.0000 20.0000 136.6445 0.0000\n===============================================================\n\n\n\nThe Wilki’s lambda test evaluates the significance of group difference across several dependent variables. A lower Wilk’s Lambda value suggest more evidence of group difference.\nThe Pillai’s Trace test statistics is statistically significant [Pillai’s Trace = 1.55, F(6, 72) = 4.29, p < 0.001] and indicates that sites has a statistically significant association with all the listed elements.\nNOTE: if you feel you can help with the above discrepancy please contribute to the CAMIS repo by following the instructions on the contributions page."
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#example-of-aft-model-using-log-normal-distribution",
    -    "href": "R/Accelerated_Failure_time_model.html#example-of-aft-model-using-log-normal-distribution",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Example of AFT model using “Log-Normal Distribution”",
    -    "text": "Example of AFT model using “Log-Normal Distribution”\n\nlibrary(survival)\nattach(lung)\n# Fit an AFT model using lognormal distribution\nmodel_aft <- survreg(Surv(time, status) ~ age + sex + ph.ecog, data = lung, dist = \"lognormal\")\n# Model summary\nsummary(model_aft)\n\n\nCall:\nsurvreg(formula = Surv(time, status) ~ age + sex + ph.ecog, data = lung, \n    dist = \"lognormal\")\n               Value Std. Error     z       p\n(Intercept)  6.49479    0.58276 11.14 < 2e-16\nage         -0.01918    0.00833 -2.30 0.02126\nsex          0.52195    0.15278  3.42 0.00063\nph.ecog     -0.35557    0.10331 -3.44 0.00058\nLog(scale)   0.02823    0.05596  0.50 0.61391\n\nScale= 1.03 \n\nLog Normal distribution\nLoglik(model)= -1146.9   Loglik(intercept only)= -1163.2\n    Chisq= 32.59 on 3 degrees of freedom, p= 3.9e-07 \nNumber of Newton-Raphson Iterations: 3 \nn=227 (1 observation deleted due to missingness)\n\n\nThe summary output will provide the estimated coefficients, standard errors, and p-values for each predictor variable."
    +    "objectID": "python/paired_t_test.html",
    +    "href": "python/paired_t_test.html",
    +    "title": "Paired t-test",
    +    "section": "",
    +    "text": "Paired t-tests are used to test the difference of means for two dependant variables. In the Paired t-test, the difference of the means between the two samples is compared to a given number that represents the null hypothesis. For a Paired t-test, the number of observations in each sample must be equal.\nIn Python, a Paired t-test can be performed using the scipy.stats.ttest_rel(…) function from the scipy package, which accepts the following parameters:\n1.a, b: Sample observations. The arrays must have the same shape.\n2.axis: If an int, the axis of the input along which to compute the statistic. The statistic of each axis-slice (e.g. row) of the input will appear in a corresponding element of the output. If None, the input will be raveled before computing the statistic.\n3.nan_policy: Defines how to handle input NaNs.\n4.alternative (optional): Defines the alternative hypothesis.\n5.keepdims: If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array."
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#acceleration-factor-calculation",
    -    "href": "R/Accelerated_Failure_time_model.html#acceleration-factor-calculation",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Acceleration Factor Calculation",
    -    "text": "Acceleration Factor Calculation\n\n# Compute acceleration factor (exponentiated coefficients)\nacceleration_factor <- exp(coef(model_aft))\nacceleration_factor\n\n(Intercept)         age         sex     ph.ecog \n661.6830913   0.9810009   1.6853157   0.7007762"
    +    "objectID": "python/paired_t_test.html#paired-t-test-in-python",
    +    "href": "python/paired_t_test.html#paired-t-test-in-python",
    +    "title": "Paired t-test",
    +    "section": "",
    +    "text": "Paired t-tests are used to test the difference of means for two dependant variables. In the Paired t-test, the difference of the means between the two samples is compared to a given number that represents the null hypothesis. For a Paired t-test, the number of observations in each sample must be equal.\nIn Python, a Paired t-test can be performed using the scipy.stats.ttest_rel(…) function from the scipy package, which accepts the following parameters:\n1.a, b: Sample observations. The arrays must have the same shape.\n2.axis: If an int, the axis of the input along which to compute the statistic. The statistic of each axis-slice (e.g. row) of the input will appear in a corresponding element of the output. If None, the input will be raveled before computing the statistic.\n3.nan_policy: Defines how to handle input NaNs.\n4.alternative (optional): Defines the alternative hypothesis.\n5.keepdims: If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array."
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#interpretation",
    -    "href": "R/Accelerated_Failure_time_model.html#interpretation",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Interpretation",
    -    "text": "Interpretation\n\nFor age,acceleration factor \\(< 1\\) indicates that for each one-unit increase in age, the survival time is slowed down by a factor of 0.98 (or a 2% decreasein survival time).\nFor sex, acceleration factor \\(> 1\\) indicates that males have 68% accelerated survival time.\nAn acceleration factor of ph.ecog \\(< 1\\) suggests a 30% decelerated survival time associated with ph.ecog."
    +    "objectID": "python/paired_t_test.html#data-used",
    +    "href": "python/paired_t_test.html#data-used",
    +    "title": "Paired t-test",
    +    "section": "Data Used",
    +    "text": "Data Used\n\nimport pandas as pd\n\n# Create sample data\ndata = {\n    'SBPbefore': [120, 124, 130, 118, 140, 128, 140, 135, 126, 130, 126, 127],\n    'SBPafter': [128, 131, 131, 127, 132, 125, 141, 137, 118, 132, 129, 135]\n}\n\ndf_pressure = pd.DataFrame(data)"
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#plotting-aft-model-graphically",
    -    "href": "R/Accelerated_Failure_time_model.html#plotting-aft-model-graphically",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Plotting AFT Model Graphically",
    -    "text": "Plotting AFT Model Graphically\n\nsuppressPackageStartupMessages({\nlibrary(survival)\nlibrary(survminer)\nlibrary(ggplot2)\n})\n\n# Fit the AFT model on the lung dataset\naft_model <- survreg(Surv(time, status) ~ age + sex + ph.ecog, data = lung, dist = \"lognormal\")\n\n# Create a new data frame with predicted survival times\ndf <- data.frame(time = lung$time, age = lung$age, sex = lung$sex, ph.ecog = lung$ph.ecog, status=lung$status)\ndf$surv_times <- predict(aft_model, newdata = df)\n\n# Plot the survival curves based on the AFT model\nggsurvplot(survfit(Surv(surv_times, status) ~ 1, data = df),\n           data = df, xlab = \"Time\", ylab = \"Survival Probability\")\n\n\n\n\n\n\n\n\nThe survival curve plotted based on the AFT model for the lung dataset illustrates how the probability of survival changes as time progresses, showing the impact of different covariate levels on survival probabilities."
    +    "objectID": "python/paired_t_test.html#paired-t-test",
    +    "href": "python/paired_t_test.html#paired-t-test",
    +    "title": "Paired t-test",
    +    "section": "Paired t-test",
    +    "text": "Paired t-test\nThe following code was used to test the comparison in Python. Note that the baseline null hypothesis goes in the “popmean” parameter.\n\nimport pandas as pd\nfrom scipy import stats\n\n# Perform paired t-test\nt_stat, p_value = stats.ttest_rel(df_pressure['SBPbefore'], df_pressure['SBPafter'])\n\n# Print results\nprint(\"Paired t-test:\")\nprint(f\"t = {t_stat}\")\nprint(f\"p-value = {p_value}\")\n\nPaired t-test:\nt = -1.0896479884009451\np-value = 0.299163498777129"
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#example-of-aft-model-using-weibull-distribution",
    -    "href": "R/Accelerated_Failure_time_model.html#example-of-aft-model-using-weibull-distribution",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Example of AFT model using “Weibull Distribution”",
    -    "text": "Example of AFT model using “Weibull Distribution”\n\n# Fit an AFT model using weibull distribution\nmodel_aft_wb <- survreg(Surv(futime, fustat) ~ age + resid.ds + rx, data = ovarian, dist = \"weibull\")\n# Model summary\nsummary(model_aft_wb)\n\n\nCall:\nsurvreg(formula = Surv(futime, fustat) ~ age + resid.ds + rx, \n    data = ovarian, dist = \"weibull\")\n              Value Std. Error     z      p\n(Intercept) 10.5634     1.3810  7.65  2e-14\nage         -0.0661     0.0190 -3.48 0.0005\nresid.ds    -0.5002     0.3799 -1.32 0.1879\nrx           0.5152     0.3236  1.59 0.1114\nLog(scale)  -0.6577     0.2384 -2.76 0.0058\n\nScale= 0.518 \n\nWeibull distribution\nLoglik(model)= -87.9   Loglik(intercept only)= -98\n    Chisq= 20.17 on 3 degrees of freedom, p= 0.00016 \nNumber of Newton-Raphson Iterations: 6 \nn= 26"
    +    "objectID": "python/one_sample_t_test.html",
    +    "href": "python/one_sample_t_test.html",
    +    "title": "One Sample t-test",
    +    "section": "",
    +    "text": "The One Sample t-test is used to compare a single sample against an expected hypothesis value. In the One Sample t-test, the mean of the sample is compared against the hypothesis value. In Python, a One Sample t-test can be performed using the scipy.stats.ttest_1samp(…) function from the scipy package, which accepts the following parameters:\n1.a: Sample observations.\n2.popmean: Expected value in null hypothesis. If array_like, then its length along axis must equal 1, and it must otherwise be broadcastable with a.\n3.nan_policy: Defines how to handle input NaNs.\n4.alternative (optional): Defines the alternative hypothesis.\n5.keepdims: If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array."
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#acceleration-factor-calculation-1",
    -    "href": "R/Accelerated_Failure_time_model.html#acceleration-factor-calculation-1",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Acceleration Factor Calculation",
    -    "text": "Acceleration Factor Calculation\n\n# Compute acceleration factor (exponentiated coefficients)\nacceleration_factor_wb <- exp(coef(model_aft_wb))\nacceleration_factor_wb\n\n (Intercept)          age     resid.ds           rx \n3.869157e+04 9.360366e-01 6.063911e-01 1.673914e+00"
    +    "objectID": "python/one_sample_t_test.html#one-sample-t-test-in-python",
    +    "href": "python/one_sample_t_test.html#one-sample-t-test-in-python",
    +    "title": "One Sample t-test",
    +    "section": "",
    +    "text": "The One Sample t-test is used to compare a single sample against an expected hypothesis value. In the One Sample t-test, the mean of the sample is compared against the hypothesis value. In Python, a One Sample t-test can be performed using the scipy.stats.ttest_1samp(…) function from the scipy package, which accepts the following parameters:\n1.a: Sample observations.\n2.popmean: Expected value in null hypothesis. If array_like, then its length along axis must equal 1, and it must otherwise be broadcastable with a.\n3.nan_policy: Defines how to handle input NaNs.\n4.alternative (optional): Defines the alternative hypothesis.\n5.keepdims: If this is set to True, the axes which are reduced are left in the result as dimensions with size one. With this option, the result will broadcast correctly against the input array."
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#interpretation-1",
    -    "href": "R/Accelerated_Failure_time_model.html#interpretation-1",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Interpretation",
    -    "text": "Interpretation\n\nFor age, an acceleration factor of 0.93 indicates that for each one-unit increase in age, the survival time is decelerated by a factor of 0.93(or a 7% decrease in the survival time)\nFor residual disease status, an acceleration factor of 0.60 suggests that a decrease in residual disease status is associated with a 40% decelerated survival time.\nan acceleration factor of 1.67 suggests a 67% accelerated survival time for patients receiving a different type of radiation therapy (rx = 2) compared to the reference group (rx = 1)."
    +    "objectID": "python/one_sample_t_test.html#data-used",
    +    "href": "python/one_sample_t_test.html#data-used",
    +    "title": "One Sample t-test",
    +    "section": "Data Used",
    +    "text": "Data Used\n\nimport pandas as pd\n\n# Create sample data\ndata = {\n    'score': [40, 47, 52, 26, 19, 25, 35, 39, 26, 48, 14, 22, 42, 34, 33, 18, 15, 29, 41, 44, 51, 43, 27, 46, 28, 49, 31, 28, 54, 45],\n    'count': [2, 2, 2, 1, 2, 2, 4, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1]\n}\n\ndf = pd.DataFrame(data)\n\n\nsubsubtitle: “t-test”\n\nThe following code was used to test the comparison in Python. Note that the baseline null hypothesis goes in the “popmean” parameter.\n\nimport pandas as pd\nfrom scipy import stats\n\n# Perform one-sample t-test\nsample_mean = df['score'].mean()\nnull_mean = 30  # Hypothetical null hypothesis mean for comparison\nalpha = 0.05  # Significance level\n\nt_statistic, p_value = stats.ttest_1samp(df['score'], null_mean)\n\nprint(f\"t: {t_statistic}\")\nprint(f\"p-value: {p_value}\")\nprint(f\"mean of x: {sample_mean}\")\n\nif p_value < alpha:\n    print(\"Reject null hypothesis: There is a significant difference.\")\nelse:\n    print(\"Fail to reject null hypothesis: There is no significant difference.\")\n\nt: 2.364306444879101\np-value: 0.02497410401836272\nmean of x: 35.03333333333333\nReject null hypothesis: There is a significant difference."
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#survival-curve-plotting-on-ovarian-dataset",
    -    "href": "R/Accelerated_Failure_time_model.html#survival-curve-plotting-on-ovarian-dataset",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Survival Curve Plotting on ‘Ovarian’ Dataset",
    -    "text": "Survival Curve Plotting on ‘Ovarian’ Dataset\n\n# Fit the AFT model (weibull distribution) on your data\nmodel_aft <- survreg(Surv(futime, fustat) ~ age + resid.ds + rx, data = ovarian, dist = \"weibull\")\n\n# Create survival curves for different levels of predictor variables\nplot_data <- with(ovarian, data.frame(age = seq(min(age), max(age), length.out = 100),\n                                      resid.ds = mean(resid.ds),\n                                      rx = mean(rx)))\n\n# Predict survival times based on the AFT model\nplot_data$survival <- predict(model_aft, newdata = plot_data)\n\n# Plot the survival curves\nggplot(plot_data, aes(x = age, y = survival, color = factor(rx), linetype = factor(rx))) +\n  geom_line() +\n  labs(x = \"Age\", y = \"Survival Probability\", color = \"Radiation Therapy\", linetype = \"Radiation Therapy\") +\n  scale_linetype_manual(values = c(\"solid\", \"dashed\", \"dotted\")) +\n  scale_color_manual(values = c(\"blue\", \"red\", \"green\"))\n\n\n\n\n\n\n\n\nThe survival curve plotted based on the AFT model for the ovarian dataset how the probability of survival changes as age increases."
    +    "objectID": "minutes/index.html",
    +    "href": "minutes/index.html",
    +    "title": "Meeting Minutes",
    +    "section": "",
    +    "text": "Lessons learnt- Novartis Hackathon, Diversity Alliance, OSTCDA\n\n\n\n\n\n\n\n\n\n\n\nSep 9, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nNovartis Hackathon & Content growth\n\n\n\n\n\n\n\n\n\n\n\nAug 12, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nRepo Content Growth, Conferences 2024\n\n\n\n\n\n\n\n\n\n\n\nJul 14, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nRepo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off\n\n\n\n\n\n\n\n\n\n\n\nJun 10, 2024\n\n\n\n\n\n\n\n\n\n\n\n\n2024 Goals\n\n\n\n\n\n\n\n\n\n\n\nMay 13, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nGeneral linear models is complete\n\n\n\n\n\n\n\n\n\n\n\nApr 8, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nHow to select packages, Content & Conferences\n\n\n\n\n\n\n\n\n\n\n\nMar 11, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nWebsite structure update, Team list, Conferences\n\n\n\n\n\n\n\n\n\n\n\nFeb 12, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nCAMIS-ONCO, Conferences, Academic & regulatory input plans\n\n\n\n\n\n\n\n\n\n\n\nJan 8, 2024\n\n\n\n\n\n\n\n\n\n\n\n\nEnd of year summary, plan for 2024\n\n\n\n\n\n\n\n\n\n\n\nNov 20, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nFDA quartely meeting, 1st survey feedback - general updates\n\n\n\n\n\n\n\n\n\n\n\nOct 9, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nConference updates & feedback, FDA quartely meeting, CAMIS-ONCO workshop\n\n\n\n\n\n\n\n\n\n\n\nSep 11, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nFDA quartely meeting, FDA CSS, SDEs, website & conference plans\n\n\n\n\n\n\n\n\n\n\n\nAug 21, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nPlan for Advertising CAMIS progress\n\n\n\n\n\n\n\n\n\n\n\nJul 19, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper Finalization, Advertising CAMIS\n\n\n\n\n\n\n\n\n\n\n\nJun 19, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper, Website, Launch Plan\n\n\n\n\n\n\n\n\n\n\n\nMay 15, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper, Website, Launch Plan\n\n\n\n\n\n\n\n\n\n\n\nApr 17, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper, Website, ONCO, Volunteers, Conferences\n\n\n\n\n\n\n\n\n\n\n\nMar 13, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nWhite Paper and Demo of connecting Rstudio with Github repo\n\n\n\n\n\n\n\n\n\n\n\nFeb 13, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nNew Website Discussion\n\n\n\n\n\n\n\n\n\n\n\nJan 23, 2023\n\n\n\n\n\n\n\n\n\n\n\n\nRestart Meeting\n\n\n\n\n\n\n\n\n\n\n\nDec 12, 2022\n\n\n\n\n\n\nNo matching items"
       },
       {
    -    "objectID": "R/Accelerated_Failure_time_model.html#conclusion",
    -    "href": "R/Accelerated_Failure_time_model.html#conclusion",
    -    "title": "Accelerated Failure Time Model",
    -    "section": "Conclusion",
    -    "text": "Conclusion\nIn AFT models, unlike Cox proportional hazards models, survival times follow an assumed parametric distribution (e.g., Weibull, log-logistic, log-normal), directly modelling the effect of covariates on the time scale."
    +    "objectID": "minutes/posts/12Dec2022.html",
    +    "href": "minutes/posts/12Dec2022.html",
    +    "title": "Restart Meeting",
    +    "section": "",
    +    "text": "Attendees\n\n\nNew names:\nRows: 34 Columns: 14\n── Column specification\n──────────────────────────────────────────────────────── Delimiter: \",\" chr\n(13): attendees, 12_dec_2022, 23_Jan_2023, 13_feb_2023, 13_mar_2023, 17_... lgl\n(1): ...14\nℹ Use `spec()` to retrieve the full column specification for this data. ℹ\nSpecify the column types or set `show_col_types = FALSE` to quiet this message.\n• `` -> `...14`\n\n\n\n\n\n\n\n\n\nattendees\n12_dec_2022\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nNo\n\n\nChristina Fillmore\nNo\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nYes\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nYes\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\nWelcome and brief CAMIS project update: Lyn\nPlease consider which areas of the project you would like to be involved with: \n    * Repository reviewers/framework reviewers\n    * Content creators (Comparing analysis method implementations in software)\n    * Github - content review / approval\n    * Marketing, i.e. blogs and sharing with wider community (PSI, ASA, PHUSE etc) to encourage contributions \n    * Long term plan - Extend reach beyond Europe/USA.\n\n\nRepository roadmap : Lyn\n    * Sample website & templates – mid January 2022\n    * Feedback on website/templates – EOB Feb 2022\n    * Revisions – March 2022\n    * Launch – April 2022\n\n\nWhite paper status update: Min-Hua\nNOTE: we would like to put the URL of new website and mention CAMIS in paper if possible?\n\n\nOther stream updates: All\nNeed to identify who were the previous stream leads to check with them we can put content into new template formats.\n    * CMH\n    * Mixed models\n    * Linear models\n\n\nQuestions/ AOB - All\n    * Future meeting plan – Lyn set up directly so can be quickly adjust/ add more meetings if necessary?\n    * Name change: CAMIS: Comparing analysis method implementations in software\n    * Do we need our own logo. CAMIS. Volunteers?\n    * Supported by PHUSE & PSI & ASA. Assign rep (or reps) for each organization. \n    * Extend membership given many previous members no longer on project\n    * Volunteer needed – can someone create a comparison using any method (but comparing SAS to Python/Julia or R to Python/Julia) – so we can test up with not just R Vs SAS.\n    * AOB."
       },
       {
    -    "objectID": "R/gsd-tte.html",
    -    "href": "R/gsd-tte.html",
    -    "title": "Group sequential design in R",
    +    "objectID": "minutes/posts/10June2024.html",
    +    "href": "minutes/posts/10June2024.html",
    +    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
         "section": "",
    -    "text": "While a group sequential design (GSD) could be applied for different types of endpoints, here we focus on time-to-event endpoints."
    +    "text": "attendees\n10_Jun_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nNo\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nNo\n\n\nMin-Hua Jen\nNo\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nYes\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nYes\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nNo\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nYes\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nYes\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nYes\n\n\nJayashree Vedanayagam\nYes\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\nSunil\nNo"
       },
       {
    -    "objectID": "R/gsd-tte.html#group-sequential-design-time-to-event-endpoint",
    -    "href": "R/gsd-tte.html#group-sequential-design-time-to-event-endpoint",
    -    "title": "Group sequential design in R",
    -    "section": "",
    -    "text": "While a group sequential design (GSD) could be applied for different types of endpoints, here we focus on time-to-event endpoints."
    +    "objectID": "minutes/posts/10June2024.html#monthly-contributions-update--christina",
    +    "href": "minutes/posts/10June2024.html#monthly-contributions-update--christina",
    +    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    +    "section": "Monthly Contributions update -Christina",
    +    "text": "Monthly Contributions update -Christina\nThank you to everyone whose contributed this month, Special shout outs to Seemani, Lukas, David & Agnieska and anyone else we’ve missed who completed pull requests this month.\nNOTE that if your work requires a package not yet in the renv.lock file, then you need to install the package and do renv::update() to update the lock file. When you do the pull request, check 2 files change (i.e. the renv.lock file & your file you are submitting).\n\nChristina plans to update the renv control method soon which will hopefully avoid some of the package / renv issues going forward. Remember if you do have problems with the install.packages() & update to renv lock file just let Christina know. ACTION: Christina: To add to the contributions guidance once new method agreed.\nIt was noted by Seemani, that her MANOVA Python content was loaded to the folder, but not visible on the website. ACTION: Christina: to update the TOC to point to the material.\nPlease can people when picking up new pieces to work on update the table of assignments saved in the following readme Or ask Lyn/ Christina to update it for you. This ensures we dont have multiple people working at the same time duplicating effort, when they could be working together."
       },
       {
    -    "objectID": "R/gsd-tte.html#available-r-packages",
    -    "href": "R/gsd-tte.html#available-r-packages",
    -    "title": "Group sequential design in R",
    -    "section": "Available R packages",
    -    "text": "Available R packages\nThe commonly used R packages for power and sample size calculations utilizing a GSD are: gsDesign (also has a web interface), gsDesign2, and rpact."
    +    "objectID": "minutes/posts/10June2024.html#conferences-update---lyn",
    +    "href": "minutes/posts/10June2024.html#conferences-update---lyn",
    +    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    +    "section": "Conferences update - Lyn",
    +    "text": "Conferences update - Lyn\nReminder that if you are attending a conference to represent CAMIS to add the detail here.\nWe have updated the page linking to much of the content presented in 2024 and showing we are currently presenting at 7 seminars/ SDEs/ conferences in 2024.\nChristina also presented at the Merck R users group last month. ACTION: Christina: to add to the conferences list to show we did this. If anyone else wants a presentation to their companies please let her know.\nStephen McCawille is also attending PHUSE EU as well as Christine & Agnieska, so the 3 of them can meet up in person.\nAndras Kasa - informed us that there is a PHUSE SDE at UCB in Brussels in september. Details can be found here. Contact UCB biosciences team: Christophe.Praet@ucb.com and marc.derycke@ucb.com if we have someone who could present at this meeting.\nUnfortunately Soma and Vikash were unable to present the workshop at PHUSE CSS last week, however Mike Stackhouse kindly stood in for us, and led a round table discussion about the project. Huge Thank you to Mike for his support and last minute help so we could continue with a session.\nACTION: Volunteer please!! to attend and present at this SDE in person as it would be really good for CAMIS to be presented at this event.\nKeevan asked if we had a single slide to advertise CAMIS. ACTION: Lyn to load single slide to non-website content and add a link to it on conferences tab. Can be found here.\nACTION: Christina : Move Phuse-EU2023 pptx into 2023 folder."
       },
       {
    -    "objectID": "R/gsd-tte.html#design-assumptions",
    -    "href": "R/gsd-tte.html#design-assumptions",
    -    "title": "Group sequential design in R",
    -    "section": "Design assumptions",
    -    "text": "Design assumptions\nUsing a toy example, we will assume that a primary objective of a phase III oncology trial is to compare a new therapy to a control in terms of progression-free survival (PFS) and overall survival (OS). Note that, in this example, we have a family of primary endpoints, i.e., if at least one of the endpoints is successful, the study will be declared a success. A GSD will be utilized for each endpoint. PFS will be tested at one interim analysis (IA) for both efficacy and non-binding futility, while OS will be tested at two IAs for efficacy only. An O’Brien-Fleming spending function will be used for efficacy testing and a Hwang-Shih-Decani spending function with \\(\\gamma = -10\\) will be used for futility.\nFurther design assumptions are as follows:\n\n# PFS HR = 0.6\nhr1_pfs <- 0.6\n# Median PFS of 9.4 months in the control arm\nmed_pfs <- 9.4\n# Median follow-up of 10 months for PFS\nminfu_pfs <- 10\n# Monthly dropout of 0.019 for PFS\ndo_rate_pfs <- 0.019\n# IA timing for PFS is at 75% information fraction\ntiming_pfs <- c(0.75, 1)\n# Power of 95% for PFS\npower_pfs <- 0.95\n\n# OS HR = 0.65\nhr1_os <- 0.65\n# Median OS of 3 years in the control arm\nmed_os <- 12 * 3\n# Median follow-up of 42 months for OS\nminfu_os <- 42\n# Monthly dropout of 0.001 for OS\ndo_rate_os <- 0.001\n# IA timing for OS is at 60% and 80% information fraction\ntiming_os <- c(0.6, 0.8, 1)\n# Power of 82% for OS\npower_os <- 0.82\n\n# Enrollment period of 24 months\nenroll_dur <- 24\n# 1:1 randomization ratio\nrand_ratio <- 1\n# alpha level of 1.25% for each endpoint\nalphal <- 0.0125\n\nWe assume that given the above assumptions, we need to calculate the target number of events for each analysis as well as the total sample size."
    +    "objectID": "minutes/posts/10June2024.html#pharma---sug-linkedin-post---chi",
    +    "href": "minutes/posts/10June2024.html#pharma---sug-linkedin-post---chi",
    +    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    +    "section": "Pharma - SUG linkedin Post - Chi",
    +    "text": "Pharma - SUG linkedin Post - Chi\nChi highlighted the incredible post from Phil Bowsher advertising the CAMIS project. This has been seen by over 400 people with 38 reposts to date ! It has also been commented on by renowned statisticians all enthusiastic about CAMIS, so it’s great to have the awareness of the project growing.\nhttps://www.linkedin.com/posts/philip-bowsher-67151015_rinpharma-rstats-pharmaverse-activity-7202038957512036352-k1AU?utm_source=share&utm_medium=member_desktop\nACTION: Harshil to repost/share in a couple of weeks to maximize the reach of the post.\n##Update from Survival team - Christina\nSoma has officially stepped down as CAMIS-ONCO lead, so Christina will act as this for the time being.\nKick off meeting has occurred last month & the team are now meeting monthly. The first objective is for people to bring together information on the non-proportional hazards models.\nIn future, would be great to have someone take on the lead / co-lead if they feel strongly about leading this, but needs someone dedication to making progress !\n##Dissertation scheme kick off - Chi / Lyn/Christina##\nWe have launched a new page here which will provide ideas for students wanting to look at dissertation projects involved in comparing analysis method differences across software. If you have an idea for a project that you want to research but dont have time to investigate the project yourself, then you could write an abstract and save it to this page, where students looking for projects (or academics looking on behalf of students), could find ideas for projects. Expectation is that most would be MSc level (summer 3 month project), however longer PhD style project could also be offered. Please reach out to us if you are interested in contributing to this area."
       },
       {
    -    "objectID": "R/gsd-tte.html#example-code",
    -    "href": "R/gsd-tte.html#example-code",
    -    "title": "Group sequential design in R",
    -    "section": "Example code",
    -    "text": "Example code\n\nExample using gsDesign\n\nPFS calculations:\n\n\nlibrary(gsDesign)\n\n\npfs_gsDesign <- gsSurv(\n  k = length(timing_pfs),\n  timing = timing_pfs,\n  R = enroll_dur,\n  eta = do_rate_pfs,\n  minfup = minfu_pfs,\n  T = enroll_dur + minfu_pfs,\n  lambdaC = log(2) / med_pfs,\n  hr = hr1_pfs,\n  beta = 1 - power_pfs,\n  alpha = alphal,\n  sfu = sfLDOF,\n  sfl = sfHSD,\n  sflpar = -10,\n  test.type = 4\n)\n\npfs_gsDesign |> gsBoundSummary()\n\n    Analysis              Value Efficacy Futility\n   IA 1: 75%                  Z   2.6584   0.7432\n      N: 398        p (1-sided)   0.0039   0.2287\n Events: 176       ~HR at bound   0.6693   0.8938\n   Month: 25   P(Cross) if HR=1   0.0039   0.7713\n             P(Cross) if HR=0.6   0.7668   0.0041\n       Final                  Z   2.2801   2.2801\n      N: 398        p (1-sided)   0.0113   0.0113\n Events: 234       ~HR at bound   0.7421   0.7421\n   Month: 34   P(Cross) if HR=1   0.0125   0.9875\n             P(Cross) if HR=0.6   0.9500   0.0500\n\n\n\nOS calculations:\n\n\nos_gsDesign <- gsSurv(\n  k = length(timing_os),\n  timing = timing_os,\n  R = enroll_dur,\n  eta = do_rate_os,\n  minfup = minfu_os,\n  T = enroll_dur + minfu_os,\n  lambdaC = log(2) / med_os,\n  hr = hr1_os,\n  beta = 1 - power_os,\n  alpha = alphal,\n  sfu = sfLDOF,\n  test.type = 1\n)\n\nos_gsDesign |> gsBoundSummary()\n\n    Analysis               Value Efficacy\n   IA 1: 60%                   Z   3.0205\n      N: 394         p (1-sided)   0.0013\n Events: 131        ~HR at bound   0.5896\n   Month: 38    P(Cross) if HR=1   0.0013\n             P(Cross) if HR=0.65   0.2899\n   IA 2: 80%                   Z   2.5874\n      N: 394         p (1-sided)   0.0048\n Events: 175        ~HR at bound   0.6758\n   Month: 51    P(Cross) if HR=1   0.0052\n             P(Cross) if HR=0.65   0.6082\n       Final                   Z   2.2958\n      N: 394         p (1-sided)   0.0108\n Events: 218        ~HR at bound   0.7327\n   Month: 66    P(Cross) if HR=1   0.0125\n             P(Cross) if HR=0.65   0.8200\n\n\n\n\nExample using gsDesign2\n\nPFS calculations:\n\n\nlibrary(gsDesign2)\nlibrary(tibble)\n\n\nenroll_rate <- tibble(\n  stratum = \"All\",\n  duration = enroll_dur,\n  rate = 1\n)\nfail_rate_pfs <- tibble(\n  stratum = \"All\",\n  duration = Inf, # Can be set to `Inf` when proportional hazard is assumed\n  fail_rate = log(2) / med_pfs,\n  hr = hr1_pfs,\n  dropout_rate = do_rate_pfs\n)\n\npfs_gsDesign2 <- gs_design_ahr(\n  enroll_rate = enroll_rate,\n  fail_rate = fail_rate_pfs,\n  ratio = rand_ratio,\n  beta = 1 - power_pfs,\n  alpha = alphal,\n  info_frac = timing_pfs,\n  analysis_time = enroll_dur + minfu_pfs,\n  upper = gs_spending_bound,\n  upar = list(\n    sf = gsDesign::sfLDOF,\n    total_spend = alphal\n  ),\n  lower = gs_spending_bound,\n  lpar = list(\n    sf = gsDesign::sfHSD,\n    total_spend = 1 - power_pfs,\n    param = -10\n  ),\n  info_scale = \"h0_info\"\n)\n\npfs_gsDesign2 |>\n  summary() |>\n  as_gt()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nBound summary for AHR design\n\n\nAHR approximations of ~HR at bound\n\n\nBound\nZ\nNominal p1\n~HR at bound2\n\nCumulative boundary crossing probability\n\n\n\nAlternate hypothesis\nNull hypothesis\n\n\n\n\nAnalysis: 1 Time: 25.3 N: 405.8 Event: 179.2 AHR: 0.6 Information fraction: 0.75\n\n\nFutility\n0.74\n0.2287\n0.8940\n0.0041\n0.7713\n\n\nEfficacy\n2.66\n0.0039\n0.6697\n0.7668\n0.0039\n\n\nAnalysis: 2 Time: 34 N: 405.8 Event: 238.9 AHR: 0.6 Information fraction: 1\n\n\nFutility\n2.28\n0.0113\n0.7424\n0.0500\n0.9875\n\n\nEfficacy\n2.28\n0.0113\n0.7424\n0.9500\n3 0.0125\n\n\n\n1 One-sided p-value for experimental vs control treatment. Value < 0.5 favors experimental, > 0.5 favors control.\n\n\n2 Approximate hazard ratio to cross bound.\n\n\n3 Cumulative alpha for final analysis (0.0125) is less than the full alpha (0.025) when the futility bound is non-binding. The smaller value subtracts the probability of crossing a futility bound before crossing an efficacy bound at a later analysis (0.025 - 0.0125 = 0.0125) under the null hypothesis.\n\n\n\n\n\n\n\n\n\nOS calculations:\n\n\nfail_rate_os <- tibble(\n  stratum = \"All\",\n  duration = Inf, # Can be set to `Inf` when proportional hazard is assumed\n  fail_rate = log(2) / med_os,\n  hr = hr1_os,\n  dropout_rate = do_rate_os\n)\n\nos_gsDesign2 <- gs_design_ahr(\n  enroll_rate = pfs_gsDesign2$enroll_rate,\n  fail_rate = fail_rate_os,\n  ratio = rand_ratio,\n  beta = 1 - power_os,\n  alpha = alphal,\n  info_frac = timing_os,\n  analysis_time = enroll_dur + minfu_os,\n  test_lower = FALSE,\n  upper = gs_spending_bound,\n  upar = list(\n    sf = gsDesign::sfLDOF,\n    total_spend = alphal\n  ),\n  info_scale = \"h0_info\"\n)\n\nos_gsDesign2 |>\n  summary() |>\n  as_gt()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nBound summary for AHR design\n\n\nAHR approximations of ~HR at bound\n\n\nBound\nZ\nNominal p1\n~HR at bound2\n\nCumulative boundary crossing probability\n\n\n\nAlternate hypothesis\nNull hypothesis\n\n\n\n\nAnalysis: 1 Time: 38.4 N: 402.6 Event: 133.7 AHR: 0.65 Information fraction: 0.6\n\n\nEfficacy\n3.02\n0.0013\n0.5901\n0.2899\n0.0013\n\n\nAnalysis: 2 Time: 50.6 N: 402.6 Event: 178.2 AHR: 0.65 Information fraction: 0.8\n\n\nEfficacy\n2.59\n0.0048\n0.6762\n0.6082\n0.0052\n\n\nAnalysis: 3 Time: 66 N: 402.6 Event: 222.8 AHR: 0.65 Information fraction: 1\n\n\nEfficacy\n2.30\n0.0108\n0.7330\n0.8200\n3 0.0125\n\n\n\n1 One-sided p-value for experimental vs control treatment. Value < 0.5 favors experimental, > 0.5 favors control.\n\n\n2 Approximate hazard ratio to cross bound.\n\n\n3 Cumulative alpha for final analysis (0.0125) is less than the full alpha (0.025) when the futility bound is non-binding. The smaller value subtracts the probability of crossing a futility bound before crossing an efficacy bound at a later analysis (0.025 - 0.0125 = 0.0125) under the null hypothesis.\n\n\n\n\n\n\n\n\n\n\nExample using rpact\n\nPFS calculations:\n\n\nlibrary(rpact)\n\n\npfs_rpact_gsd <- getDesignGroupSequential(\n  sided = 1,\n  alpha = alphal,\n  informationRates = timing_pfs,\n  typeOfDesign = \"asOF\",\n  beta = 1 - power_pfs,\n  typeBetaSpending = \"bsHSD\",\n  gammaB = -10,\n  bindingFutility = FALSE\n)\n\npfs_rpact <- getSampleSizeSurvival(\n  design = pfs_rpact_gsd,\n  accrualTime = enroll_dur,\n  followUpTime = minfu_pfs,\n  lambda2 = log(2) / med_pfs,\n  hazardRatio = hr1_pfs,\n  dropoutRate1 = 0.2,\n  dropoutRate2 = 0.2,\n  dropoutTime = 12\n)\n\nkable(summary(pfs_rpact))\n\nWarning in kable.ParameterSet(summary(pfs_rpact)): Manual use of kable() for\nrpact result objects is no longer needed, as the formatting and display will be\nhandled automatically by the rpact package\n\n\nSample size calculation for a survival endpoint\nSequential analysis with a maximum of 2 looks (group sequential design), one-sided overall significance level 1.25%, power 95%. The results were calculated for a two-sample logrank test, H0: hazard ratio = 1, H1: hazard ratio = 0.6, control lambda(2) = 0.074, accrual time = 24, accrual intensity = 16.5, follow-up time = 10, dropout rate(1) = 0.2, dropout rate(2) = 0.2, dropout time = 12.\n\n\n\nStage\n1\n2\n\n\n\n\nPlanned information rate\n75%\n100%\n\n\nCumulative alpha spent\n0.0039\n0.0125\n\n\nCumulative beta spent\n0.0041\n0.0500\n\n\nStage levels (one-sided)\n0.0039\n0.0113\n\n\nEfficacy boundary (z-value scale)\n2.658\n2.280\n\n\nFutility boundary (z-value scale)\n0.743\n\n\n\nEfficacy boundary (t)\n0.670\n0.742\n\n\nFutility boundary (t)\n0.894\n\n\n\nCumulative power\n0.7668\n0.9500\n\n\nNumber of subjects\n396.9\n396.9\n\n\nExpected number of subjects under H1\n\n396.9\n\n\nCumulative number of events\n175.8\n234.4\n\n\nExpected number of events under H1\n189.2\n\n\n\nAnalysis time\n25.36\n34.00\n\n\nExpected study duration under H1\n\n27.34\n\n\nOverall exit probability (under H0)\n0.7752\n\n\n\nOverall exit probability (under H1)\n0.7709\n\n\n\nExit probability for efficacy (under H0)\n0.0039\n\n\n\nExit probability for efficacy (under H1)\n0.7668\n\n\n\nExit probability for futility (under H0)\n0.7713\n\n\n\nExit probability for futility (under H1)\n0.0041\n\n\n\n\nLegend:\n\n(t): treatment effect scale\n\n\n\nNote: the dropoutRate1, dropoutRate2 arguments in getSampleSizeSurvival() refer to the % of drop-outs by the dropoutTime, while the eta argument in gsDesign::gsSurv() and the dropout_rate value in the fail_rate argument in gsDesign2::gs_design_ahr() refer to the annual drop-out rate parameter under the exponential distribution. In our example, if \\(X\\) is a drop-out time and \\(X \\sim \\text{Exponential} (\\lambda)\\), we assume that by month 12 the drop-out rate was 20%, which implies: \\(P(X\\le12) = 1 - e^{-12\\lambda} = 0.2 \\Rightarrow \\lambda = 0.019\\). Due to the above differences, the value \\(\\lambda = 0.019\\) was used in the gsDesign and gsDesign2 example, while 0.2 was used in the rpact example.\n\nOS calculations:\n\n\nos_rpact_gsd <- getDesignGroupSequential(\n  sided = 1,\n  alpha = alphal,\n  informationRates = timing_os,\n  typeOfDesign = \"asOF\",\n  beta = 1 - power_os\n)\n\nos_rpact <- getSampleSizeSurvival(\n  design = os_rpact_gsd,\n  accrualTime = enroll_dur,\n  followUpTime = minfu_os,\n  lambda2 = log(2) / med_os,\n  hazardRatio = hr1_os,\n  dropoutRate1 = 1 - exp(-do_rate_os * 12),\n  dropoutRate2 = 1 - exp(-do_rate_os * 12),\n  dropoutTime = 12\n)\n\nkable(summary(os_rpact))\n\nSample size calculation for a survival endpoint\nSequential analysis with a maximum of 3 looks (group sequential design), one-sided overall significance level 1.25%, power 82%. The results were calculated for a two-sample logrank test, H0: hazard ratio = 1, H1: hazard ratio = 0.65, control lambda(2) = 0.019, accrual time = 24, accrual intensity = 16.5, follow-up time = 42, dropout rate(1) = 0.012, dropout rate(2) = 0.012, dropout time = 12.\n\n\n\nStage\n1\n2\n3\n\n\n\n\nPlanned information rate\n60%\n80%\n100%\n\n\nCumulative alpha spent\n0.0013\n0.0052\n0.0125\n\n\nStage levels (one-sided)\n0.0013\n0.0048\n0.0108\n\n\nEfficacy boundary (z-value scale)\n3.020\n2.587\n2.296\n\n\nEfficacy boundary (t)\n0.590\n0.676\n0.733\n\n\nCumulative power\n0.2899\n0.6082\n0.8200\n\n\nNumber of subjects\n395.1\n395.1\n395.1\n\n\nExpected number of subjects under H1\n\n\n395.1\n\n\nCumulative number of events\n131.2\n174.9\n218.6\n\n\nExpected number of events under H1\n179.4\n\n\n\n\nAnalysis time\n38.44\n50.60\n66.00\n\n\nExpected study duration under H1\n\n\n53.11\n\n\nExit probability for efficacy (under H0)\n0.0013\n0.0040\n\n\n\nExit probability for efficacy (under H1)\n0.2899\n0.3182\n\n\n\n\nLegend:\n\n(t): treatment effect scale"
    +    "objectID": "minutes/posts/10June2024.html#goals-reminder",
    +    "href": "minutes/posts/10June2024.html#goals-reminder",
    +    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    +    "section": "2024 Goals Reminder!",
    +    "text": "2024 Goals Reminder!\n\nIncrease to 45 closed by the end of the year - Currently at 37 closed.\nIn addition, we’d like to improve some of the incomplete content such as MMRM - Stephen Waugh dissertation project launched, if accepted would run sept 24-july25.\nCreate a webpage for listings dissertation projects - Ongoing"
       },
       {
    -    "objectID": "R/binomial_test.html",
    -    "href": "R/binomial_test.html",
    -    "title": "Binomial Test",
    -    "section": "",
    -    "text": "The statistical test used to determine whether the proportion in a binary outcome experiment is equal to a specific value. It is appropriate when we have a small sample size and want to test the success probability \\(p\\) against a hypothesized value \\(p_0\\)."
    +    "objectID": "minutes/posts/10June2024.html#aob",
    +    "href": "minutes/posts/10June2024.html#aob",
    +    "title": "Repo Content Growth, Conferences 2024 & Advertising, CAMIS-ONCO & Dissertation project kick off",
    +    "section": "AOB",
    +    "text": "AOB\nOur Blog page dosn’t appear in date order or aligned! If anyone can fix let us know ! Saved under News here"
       },
       {
    -    "objectID": "R/binomial_test.html#creating-a-sample-dataset",
    -    "href": "R/binomial_test.html#creating-a-sample-dataset",
    -    "title": "Binomial Test",
    -    "section": "Creating a sample dataset",
    -    "text": "Creating a sample dataset\n\nWe will generate a dataset where we record the outcomes of 1000 coin flips.\nWe will use the binom.test function to test if the proportion of heads is significantly different from 0.5.\n\n\nset.seed(19)\ncoin_flips <- sample(c(\"H\", \"T\"), \n                     size = 1000, \n                     replace = T,\n                     prob = c(0.5, 0.5))\n\nNow, we will count the heads and tails and summarize the data.\n\nheads_count <- sum(coin_flips == \"H\")\ntails_count <- sum(coin_flips == \"T\")\ntotal_flips <- length(coin_flips)\n\n\nheads_count\n\n[1] 513\n\ntails_count\n\n[1] 487\n\ntotal_flips\n\n[1] 1000"
    +    "objectID": "minutes/posts/15May2023.html",
    +    "href": "minutes/posts/15May2023.html",
    +    "title": "White Paper, Website, Launch Plan",
    +    "section": "",
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n15_may_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nNo\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nYes\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nYes\n\n\nLily Hsieh\nNo\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nYes\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\n\nWhite paper - Lyn/Min-Hua\nWebsite progress - Christina\nUpdate on Launch - Lyn\nCAMIS-ONCO - Soma Sekhar\nVolunteer Open Roles\nConference Attendance\nAOB\n\n\n\nMeeting minutes\nWhite Paper Update: Min-Hua Paula at PHUSE will distribute for public review. Over the next days we’ll get a link to the official review. ACTION :Christina will put the white paper onto the website as draft open for public review\nWebsite progress: Christina Website content progressing well. Ben Arancibia - progressing MMRMs + other areas.\nSurvival - With Christina to fix importing. ANCOVA - Aditee in progress - change to CSV not SAV (SPSS file). Update to call it linear regression, Lyn to help find ANCOVA (testing treatments) Independant Two-Sample t-test in SAS - Vikash got a few changes then will load ok.\nLyn: To create a FAQ doc for the website. Make sure it references available material elsewhere so it doesn’t become out of date quickly.\nNOTE: When you do a pull request, check your action to see if the checks pass/fail & reach out to Lyn/CHristina if you have problems. Remember to do snapshot::renv, so that any packages you install were snapshot to the central repo. Else it will fail when you do the pull request as the repo wont have the packages in it that your code needs.\nLaunch Update\n\nBlog video now available here\nBlog text to use with various lengths also available here\nConference slides & abstract available here\n\nRather than a standard set, plan is to have abstracts & slides/posters put into this folder (inc. name & date of conference) then people can use the contact that they have preference to use.\nHarshal has loaded IASCT slides to same location.\n\nContacts for Societies\n\nPSI /EFSPI (Martin) - Content sent.\nR Consortium / PHUSE / RSS (Lyn) - Content sent.\nIASCT (Harshal) - Conference went well and lots of interest from IASCT.\nASA (Leon) - TBC who are ASA to reach out to? If Ben has any contacts that Leon could use please let him know.\nSAS - we may reach out to SAS directly through PHUSE. TBC if they would be Ok with us including their data, copyright. Hopefully they’d give approval as not or project & advertising what you can do in SAS. ACTION: to find contact who may be interested in update/review of SAS. Does PHUSE have a contact already that we can use. Lyn to ask Paula. Aiming/ Martin to let Lyn know if she has a contact. ACTION : Lyn/Christina to Add a disclaimer that we are volunteers adding open source content, but if you see anything that infringes copyright please let us know and we’ll remove it immediately.\n\n\nCAMIS- ONCO: Soma Sekhar\n\nValidation of endpoints (primary/secondary oncology endpoints). Propose to do poster at PHUSE CSS. Once Mia’s survival section is loaded. Sema Sekhar to review. Then highlight what’s missing - what else you want to add. Max combo. BICR vs RECIST? In future we can discuss how these fit with current CAMIS structure. Focus on the Stats method ideally. ACTION :Christina to email Semar Sekhar once Survival is live on Website.\n\nConferences Let’s review\nVikesh- plan for CSS. Abstract deadline 12th June, 30th june registration opens.\nPosters only - only invited people can be speakers. Somar Sekhar, Aditee Dani would be happy to do posters. Suggest all 3 meet to discuss contribution to poster or doing separate ones but not duplicating the same content.\nAsk PHUSE CSS working group (Data visualization and open source technology) DVOST - if we can have a presentation next year at the CSS.\nJSM - ASA conference. Leon attending. Abstract due Feb 2024 - so try have a rep there next year.\nPHUSE Single day event (SDE- Toronto Mississauga), PHUSE EU got a poster abstract: Jayashree Vendanayagam PHUSE Single day event (New york - regeneron hosting Oct 16, check check if Aiming can do any poster/presentation/advert)\nAZ R pharm conference 7th June. LYn & Martin presenting."
       },
       {
    -    "objectID": "R/binomial_test.html#conducting-binomial-test",
    -    "href": "R/binomial_test.html#conducting-binomial-test",
    -    "title": "Binomial Test",
    -    "section": "Conducting Binomial Test",
    -    "text": "Conducting Binomial Test\n\nbinom_test_result <- binom.test(heads_count, total_flips, p = 0.5)\nbinom_test_result\n\n\n    Exact binomial test\n\ndata:  heads_count and total_flips\nnumber of successes = 513, number of trials = 1000, p-value = 0.4292\nalternative hypothesis: true probability of success is not equal to 0.5\n95 percent confidence interval:\n 0.4815213 0.5444020\nsample estimates:\nprobability of success \n                 0.513 \n\n\n\nResults:\nThe output has a p-value 0.4292098 \\(> 0.05\\) (chosen level of significance). Hence, we fail to reject the null hypothesis and conclude that the coin is fair."
    +    "objectID": "minutes/posts/20Nov2023.html",
    +    "href": "minutes/posts/20Nov2023.html",
    +    "title": "End of year summary, plan for 2024",
    +    "section": "",
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n20_nov_2023\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nYes\n\n\nChi Zhang\nYes\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nYes\n\n\nFilip Kabaj\nYes\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nNo\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nYes\n\n\nOrla Doyle\nYes\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nEnd of year summary\nPost & summary diagram of 2023 will go onto linkedIn soon, please like/share\nWe would like to welcome Harshal Khanolkar to become a co-lead of the PHUSE CAMIS Repo. Harshal has been instrumental through 2023 helping Christina and I stay on track and making suggestions for improving the social media and knowledge sharing within the group.\nMMRM now updated & Complete for now.\nGithub training will be on youtube following R/pharma conference soon\n\n2023 : A Year of Progress for PHUSE CAMIS Working Group\nAs we draw towards the end of 2023, the PHUSE CAMIS Working Group reflect on their key progress and successes this year.\nThe CAMIS repository went live in January 2023, drawing on the content from the PHUSE CSRMLW project.  This searchable repo compares analysis method implementations in software (CAMIS) such as SAS, R and python. \nThe White Paper was published in June, which highlighted the importance of clearly specifying your analysis, such that it can be replicated in different software, and isn’t relying on default options which can be different.\nFor more complex analyses, it can still be hard to understand what defaults and algorithms your software is using, so the team focused 2023 on expanding our repo content, comparing SAS vs R methods.  By August, we had covered the following topics in the repo: quartiles, rounding, anova, mmrm, cmh, log-rank, cox-ph, mcnemar’s test, kruskal-wallis test and logistic. October saw the launch of the sub-working group: CAMIS-Oncology, led by Somasekhar Sriadibhatla (AstraZeneca).  This team will focus specifically on oncology endpoints and analyzing them in SAS, R and Python.  The CAMIS team have expanded in membership during 2023 presenting at numerous conferences around the world. In November, we welcomed Harshal Khanolkar (NovoNordisk), to join the leadership team alongside Christina Fillmore (GSK) and Lyn Taylor (PAREXEL).  Our focus for 2024, will be on the creation of additional content for the repo, and sharing awareness of the project across the medical research and wider community.  We’d like to take this opportunity to thank all of our team members and contributors, and encourage everyone to check out the repository and help us to grow our content CAMIS (psiaims.github.io).  If you would like to join the team please get in touch through the repo.\n2023: lessons learnt: What we did well?\n\nAdverts to industry & linkedin posts. To be Continued into 2024 - engage more unis, internship projects, academia, posit conf, r users conf, target key conferences\nGood sharing of conference content through the repo & improving the slides in an ongoing way.\nLeadership & project progress with plans. Transparency of the work. Nice to get Agendas pre-meeting & minutes after meeting in timely manner.\nLarge range of individual contributions helping to grow repo. 1/2 contributors within the phuse group, but 1/2 outside of the group. So spreading the word is really helping us to get external contributions.\nACTION: Christina & Chi: Please can you improve the 2023 conference tab, create a 2024 tab which contains link to presentations within the github repo.\n\n2023: lessons learnt: What we didn’t do so well?\n\nTime to get pull requests approved. Aim for 2024 to reduce the time so it’s a maximum of 2 weeks. The delay was often caused by issues with renv. Christina is working with posit directly to improve renv issues & has already updated contributions guidance to help instruct people on how to contribute such as using Forks rather than needing github username access.\npython - Delayed discussion in how to design the repo to store python content.\nACTION: Vikash/ Soma / Filip - to meet with Lyn / Christina to agree format going forward.\nMore discussion on CAMIS ONCO below.\n\n\n2023: lessons learnt: What is our focus for next year?\n\nMore content\nengage more unis, internship projects, academia, posit conf, r users conf, target key conferences\nCAMIS ONCO white paper, workshop & python/sas/r comparison (See below)\nCSS 2024 workshop, interaction with audience. 3-4 hrs hopefully. TBD at separate meeting, agenda workshop. Vikash, Harshal, Soma. 3-5 June.\nIdea for 2024: Set up a method such that people with no git / github skills can still contribute to the project. Perhaps set up a CAMIS email address. Assign volunteers for someone to email, then the github experts can load it in. Decide best process to non-R, non-github people.\n\nCAMIS-ONCO\nPlan to create cheat sheet for phuse 2024 - can go on CAMIS.\nNeed more volunteers in order to address all the endpoints. Oncology / survival team members needed to join Soma & Team. AZ investing in ChatGPT AZ version, it can create python code from SAS.\nIf AI can convert SAS code to python, we will then need people to test it. Volunteers needed to run in python. Can use the CAMIS repo data to test on hopefully but may need more detailed data? To see what data we currently have in the repo: see “data-info” and “data” folders.\nAction: Chi to have a look at the data folders, and decide better way to control/document data. Chi volunteered to help with Soma’s test to test Python. Harshal may also be able to find volunteers at novonordisk. Starting point for python would be the default options vs R.\n\nACTION: Lyn to Add to members list, who can run which languages & specialist areas (CAMIS-ONCO). ACTION: Soma to put poster into non_website_content/conferences.\nCAMIS: ONCO White paper: Needs to be progressed. invite all members to see if they can contribute. Set up regular meetings in 2024.\nPlan for 2024 : Project board in github: 5 categories\n\nCAMIS : Generic Method Implementation Team: More content\nCAMIS-ONCO: items as above\nUser Experience/Demo Team\nSocial media & Engagement: Advertise/ Universities\n\nbi-monthly post re: new content (newsletter: form to subscribe to newsletter so that when we post out they get informed). ACTION: lyn to check with PHUSE if we can do this, or if we want to ask R consortium to help similar to R validation hub email list.\nAlso would be good to have blog post tab on repository. ACTION: Chi to help Christina with design. Idea would be to have 1 post which goes out on social media, to the emails subscription & on the website.\nmore relationship with ASA OpenStatsware - Orla Doyle.\nopenstatsware (rconsortium.github.io) ACTION: Lyn/Christina/Orla to set up call to discuss collaboration.\n\n\nGeneral Tasks:\n\nPlan to review & accept content within 2 weeks of pull requests.\nPOSIT help with RENV situation\nSearch Engine Optimization: CAMIS full name on website? how do we become top hit ? Any volunteers to help with this let us know.\n\n\nACTION: Lyn to Cancel Dec Meeting 11th Dec. next meeting 8th Jan 2024"
       },
       {
    -    "objectID": "R/binomial_test.html#conduct-the-binomial-test",
    -    "href": "R/binomial_test.html#conduct-the-binomial-test",
    -    "title": "Binomial Test",
    -    "section": "Conduct the Binomial Test",
    -    "text": "Conduct the Binomial Test\nWe will conduct the Binomial test and hypothesize that the proportin of death should be 19%.\n\nbinom_test <- binom.test(num_deaths, total_pat, p = 0.19)\nbinom_test\n\n\n    Exact binomial test\n\ndata:  num_deaths and total_pat\nnumber of successes = 63, number of trials = 228, p-value = 0.001683\nalternative hypothesis: true probability of success is not equal to 0.19\n95 percent confidence interval:\n 0.2193322 0.3392187\nsample estimates:\nprobability of success \n             0.2763158"
    +    "objectID": "minutes/posts/8Jan2024.html",
    +    "href": "minutes/posts/8Jan2024.html",
    +    "title": "CAMIS-ONCO, Conferences, Academic & regulatory input plans",
    +    "section": "",
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n08_Jan_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nYes\n\n\nOrla Doyle\nYes\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nYes\n\n\nFilip Kabaj\nYes\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nYes\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nYes\n\n\nAditee Dani\nYes\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nNo\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nNo\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nNo\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nNo\n\n\nMichael Kane\nNo\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nNo\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\nSunil\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nCAMIS- ONCO: Update on progress & next steps to include:\nRegular meetings Cheat sheet for PHUSE 2024 PHUSE CSS planning (workshop in June). Python volunteers & code creation. White paper.\nACTION: Lyn to follow up with Soma/Vikesh to assess status of CAMIS-ONCO. Also set up meeting with team to discuss python content going into website\nOther Conference planning\nLyn will update the conference tab on the repo.\nPHUSE US Connect (Soma/ Vikesh) and Brian are attending.\nUseR is now open for abstract submission (deadline mid-march). Any volunteers to submit /attend. Salzburg (Europe) 8-11 July. Chi will be going, and volunteers to submit an abstract for us.\nPharmaSUG - Abstracts due 15th January. Conference is: May 19th-22nd Baltimore. Volunteers required to submit abstract if possible.\nContent updates\nAnyone with any questions about what they are working on or how to assign themselves?\n\nMMRM - Volunteer please to look at Proc Mixed vs Proc GLIMMIX and use this to expand the SAS/mmrm.qmd file.\nKeaven Anderson (Merck) - will start to look at SAS vs R for sample size / group sequential design / power. They use EAST, gsDesign, but others use rpact. Does anyone have experience of this (& using SAS for sample size)? Lyn & Martin & Keaven will meet to discuss on Friday.\nChristina: will add sales pitch to Website - Why CAMIS !? + re-arrangment of some of the content.\n\nObjective to get more regulatory input\nWork with PSI AIMS as they plan a EMA regulatory panel discussion on R Any other ideas?\nFDA/ Other regulators input/discussion.\nGit training plan for 2024 PSI conference abstract rejected. Creation of a short training session (like the R/pharma workshop) or 6 week 2 hr/ week course. ACTION: Lyn/Christina/Martin to follow up with PSI re: delivery of training. Restart GIT training meetings (Christina/Alex/ Irene)\nInteraction with more Academics & Universities\nPlease can you present/advertise to your universities contacts. Anyone got contacts they can utilize? Ideas for spreading the word? Lyn doing Presentation at University of Sheffield on 28th Feb for RSS local group.\nAcademia Projects ALL: to think about possible dissertation projects. Plan to list available projects in repo & write descriptions of what the project would entail such that universities students can use them at dissertation projects Prof Richard Stevens (Oxford) is open to projects if we have any. Also Novonordisk : working with Alberg Denmark university to have a proposal for project.\nRaising awareness within companies to flag issues to CAMIS\nALL: brainstorm how we can spread awareness within our organization & wider community\nEFSPI - PSI strategy day / heads meeting\nASA OpenStatsware - Orla Doyle: Focus is more on package development. If a gap comes up we could make them aware package is needed. Can also look to sassy r package to see if that replicates SAS (if it’s right to do so) David Bosak. Lyn meeting with David next later this week.\n\nPlan for next Blogs:\n\n\nadd blog tab to repo, then when we post we can link through.\nIdeas for next blogs? - perhaps pick a topic we have content already for & post blog on it.\n\n\nFunding requirements NOTE: We can apply for a grant for any funding if anyone sees an opportunity to progress our work quicker through this method. NOTE: if any university project or individuals need funding to do this CAMIS work (creation of content), then we do have an option to apply to the R Consortium for funding.\nAOB\n\nLinear Regression SAS & R, text are now live on website. Results match, but would be good to add a COMP file which just says what we checked & what matched… for example incase something comes up in future that does not match."
       },
       {
    -    "objectID": "R/binomial_test.html#results-1",
    -    "href": "R/binomial_test.html#results-1",
    -    "title": "Binomial Test",
    -    "section": "Results:",
    -    "text": "Results:\nThe output has a p-value 0.0016829 \\(< 0.05\\) (chosen level of significance). Hence, we reject the null hypothesis and conclude that the propotion of death is significantly different from 19%."
    +    "objectID": "minutes/posts/9sept2024.html",
    +    "href": "minutes/posts/9sept2024.html",
    +    "title": "Lessons learnt- Novartis Hackathon, Diversity Alliance, OSTCDA",
    +    "section": "",
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n09_Sep_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nNo\n\n\nOrla Doyle\nYes\n\n\nHarshal Khanolkar\nNo\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nYes\n\n\nSarah Rathwell\nNo\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nNo\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nYes\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nNo\n\n\nMichael Kane\nYes\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nNo\n\n\nSeemani Abhilipsa\nYes\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nNo\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nYes\n\n\nAnwesha Roy\nYes\n\n\nSamrit Pramanik\nYes\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nYes\n\n\nSunil\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\n\nNovartis Hackathon\nOrla presented back to the group on Novartis’s Open-Source in Action: Hackathon. Key points were:\n\nAim: to encourage more people to be confident to work in open source and break down barriers in their contributing (such as through git training). To give people exposure to open-source resources that are applicable to their daily work as well as building their network with external experts.\nHow: Novartis open-source enablement team will hold hackathons on a regular basis selecting topics that have the potential to impact day-to-day work. External experts to guide Novartis employees on key initiatives and packages. This time CAMIS was selected with Christina providing support.\nWhen: Prep session 16th July 2024, Intro to git training 17th July, then 2 weeks of hackathon w/c 22nd July and 29th July with support during daily office hours.\nWho: 158 signed up from Advanced quantitative science (AQS), 100+ attended git training, 25+ submitted contributions. 8 SAS, 7 R, 1 Python, 3 SAS vs R and 1 template\nFeedback: Awards for First PR (Quick draw), most closed PRs (Busy bees), Most complex methodology (trailblazing) and Above and beyond (thinking beyond the methods).\nLearnings:\n\nTiming: aligned to ‘summer rejuvenation’ period where Novartis get 2 weeks to catch up with reduced meeting loads\nTraining: git and renv were a steep learning curve for newcomers, but daily office hours and teams channels helped. Little direction was needed to write content in quarto.\nCAMIS: the natural structure of CAMIS minimized prep work as the gaps in the table show what content is missing. It provided a nice culture to work in, focusing on good quality content over perfection. It was inclusive as it’s a multi-language project so could include people who only work in SAS or in R.\nCAMIS repo cloning often hangs if network is busy. Suggestion to reduce size of repo by removing the powerpoint presentations which would improve cloning.\n\n\n\n\nContent update\n\nSuggest to add page on how to run/ conduct a hackathon for CAMIS\nOnly 4 current open pull requests which all require changes by author so we are up to date\nWe still have a lot of open issues, but are making progress. Aim to get issues to 1 page by End of year\n\n\n\nDiversity Alliance Hackathon\nThe R in Pharma diversity alliance aspire to be an inclusive R community for developers who wok in the pharma space. Their goal is to provide a welcoming, equitable and supportive space for people to upskill, share knowledge and build a community of diverse voices.\nThey are holding an upcoming hackathon as part of the R in Pharma conference, where anyone who considers themselves as under-represented in the R in Pharma space, can participate. The event requires volunteers experienced in open source collaboration to lead attendees in small groups helping them to contribute open source collaborations. If you would like more information, to volunteer or attend, please contact Christina @statasaurus\nSee here for more information\n\n\nConferences\nThe conferences tab is up to date, we didn’t get any volunteers to represent us at PHUSE US connect.\n\n\nOSTCDA numeric matching page\nMichael Rimler is putting together a repo containing information about “Open Source Technology in Clinical Data Analysis (OSTCDA) for PHUSE. We now have a ‘numerical matching’ page here.\nPlease review and feel free to suggest changes to the content. Contact Lyn @drlyntaylor for any further information.\nAOB\n\nSarah raised an issue regarding retrieval of the documentation associated with ‘old’ versions of the R ‘stats’ package. For contributed packages, the documentation is present, but she’s struggling to find the same for the ‘stats’ package. ACTION: Christina to help investigate.\nThe issue highlighted that we may have 1 version of a package which mis-matched with SAS, but that later versions would have different functionality, and may match. Keeping the repo up to date will be a challenge, but hopefully if people are using it, issues will be identified and corrected.\nIt’s a reminder to ensure the code runs, from the data wherever possible. An issue for the SASvsR comparison pages is the comparison table is often typed in, such that if numbers change it wont be automatically updated. This is something we could consider in future. Perhaps running the code to populate the comparison table, and putting out a FAIL if conclusion changes from previous run, highlighting we need to update our written text."
       },
       {
    -    "objectID": "R/survey-stats-summary.html",
    -    "href": "R/survey-stats-summary.html",
    -    "title": "Survey Summary Statistics using R",
    +    "objectID": "minutes/posts/21Aug2023.html",
    +    "href": "minutes/posts/21Aug2023.html",
    +    "title": "FDA quartely meeting, FDA CSS, SDEs, website & conference plans",
         "section": "",
    -    "text": "When conducting large-scale trials on samples of the population, it can be necessary to use a more complex sampling design than a simple random sample.\nAll of these designs need to be taken into account when calculating statistics, and when producing models. Only summary statistics are discussed in this document, and variances are calculated using the default Taylor series linearisation methods. For a more detailed introduction to survey statistics in R, see (Lohr 2022) or (Lumley 2004).\nWe will use the {survey} package, which is the standard for survey statistics in R. Note that for those who prefer the tidyverse, the {srvyr} package is a wrapper around {survey} with {dplyr} like syntax."
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n21_aug_2023\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nYes\n\n\nChi Zhang\nYes\n\n\nClara Beck\nNo\n\n\nAditee Dani\nYes\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nYes\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nYes\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nYes\n\n\nWilmar Igl\nYes\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\nPHUSE FDA CSS Poster acceptance & white paper planning: Soma Sekhar\nSocial Media update : Harshal\nPHUSE SDEs: Missisauga: June 8th feedback: Jayashreee\nPreparation for PHUSE FDA Quarterly meeting 13th sept:  Questions/Slides feedback: Lyn\nWebsite Christina/ All\n\nNew Role: “Content curation lead”\n\nWe have been missing some posts when added to issues/discussion pages on website\nThis role will Monitor the  “Discussion” and “Issues” pages of the repo, and help to raise at each meeting where we need volunteers to answer questions/ add to discussion.\nWe will add a Standard agenda item lead by the “Content curation lead” to go through issues, & assign to people / close down issues/ discussions.\nIf you would like to volunteer please let Lyn / Christina know.\n\nHow can we encourage creation of more content?\n\n\n\nWhat areas are key for us to focus on\nMMRM update\ngithub training plan (R/Pharma workshop & PSI training course)\n\nUpcoming conference planning.\n\nRSS 7th Sept: Lyn presentation\n\n\n\nPOSIT Conf: Lyn to reach out to Juliane / Doug to ask to include slide for CAMIS\nPHUSE SDE New York: Oct 16th :  Aiming\n\n\n\nMeeting minutes\nReview of Action log\n\n\n\nAction\nAssigned to\nStatus\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nWelcome to new members: Chi Zhang & Filip Kabaj\nPHUSE SDEs: Missisauga: June 8th feedback: Jayashreee\nGPT chat & machine learning for oncology presentations, needs for guidelines on how to use next level tools were discussed. Jayashree presented on behalf of CAMIS but on a Shiny App & got good questions including highlighting that for Endpoint /efficacy analysis they may require very specific standards so not easy to be generic/default. Chris Hurley (PHUSE SDE) also mentioned CAMIS which is great exposure for us.\nPreparation for PHUSE FDA Quarterly meeting 27th sept:  Questions/Slides feedback: Lyn/ Harshal\nMeeting was postponed by 4 weeks so we have time to prepare a short survey and send out on social media. Harshal went through the proposed questionnaire. Filip suggested Q2 to refer to frequency more specifically. Harshal to update & distribute\nSocial Media update : Harshal\nHarshal has posted the PSI poster post to social media. Going forward the proposal is to run a series of posts to focus on the content on the website - perhaps a short post just to say have you seen this new content and provide links.\nRE: Workshop - FDA CSS event (5-7 June): could run a comparison of SAS vs R workshop. Could focus on a set of issues & work though them make content & resolve issues. Could turn to linkedIn to ask wider community to vote for the biggest issue outstanding that they’d like to look into and select these for resolving at the workshop. See item below, as can discuss with Soma following this years FDA CSS event.\nWebsite Christina/ All\n\nThank you ALL!! Much content has been recenly pushed to the website.\nNew Role needed for a “Content curation lead”\n\nWe have been missing some posts when added to issues/discussion pages on website\nThis role will Monitor the  “Discussion” and “Issues” pages of the repo, and help to raise at each meeting where we need volunteers to answer questions/ add to discussion.\nWe will add a Standard agenda item lead by the “Content curation lead” to go through issues, & assign to people / close down issues/ discussions.\nJayashree & Chi volunteered to take on the role & to help monitor the repo activity. Lyn & Christina can put together guidance of what’s needed. Currently it’s just the issues & discussion, as pull requests are currently Ok being approved by Lyn & Christina as it’s a bit tricky to make sure it fits in with the repo and doens’t break anything!\nChi suggested that Christina check out projects to see if that would help to monitor whose doing what - may not work if can only be accessed by those already with granted access as we want anyone to be able to assign themselves. ACTION Christina to: Change the readme to say how to assign yourselves to content tasks.\n\nHow can we encourage creation of more content? / What areas are key for us to focus on\n\nGreat increase in content pre-meeting so Ok to grow organically for now.\nMMRM update : Christina to add link to MMRM website to cross reference.\n\ngithub training plan (R/Pharma workshop - free to attend in end October & PSI training course - series of session each week for x weeks, & PSI Conference Amsterdam - workshop 1.5 hrs.)\n\nPHUSE FDA CSS Poster acceptance (sept 20th) & white paper planning/ CAMIS ONCO: Soma Sekhar\nSoma demonstrated the poster which he’ll present with Vikash at CSS. Focused on Solid tumors OS/PFS but could broaden CAMIS ONCO with time to include other cancer.\nLonger term plan to create a white paper and to load survival analysis in python to repo.\nSoma to work with Harshil & others, to plan a sub team to work on CSS workshop for June 2023.\nLyn asked if there is demand for packages to be written that do standard stats analysis? The difficulty with this is how to standardise the programming and what it adds in addition to existing packages. It may not be worthwhile as options need to be considered so can’t automate.\nUpcoming conference planning.\n\nRSS 7th Sept: Lyn presentation\n\n\n\nPOSIT Conf: Lyn to reach out to Juliane / Doug to ask to include slide for CAMIS\nPHUSE SDE New York: Oct 16th :  Aiming\nR/Pharma - Christina submitted presentation\n\nAOQ/AOB - None."
       },
       {
    -    "objectID": "R/survey-stats-summary.html#mean",
    -    "href": "R/survey-stats-summary.html#mean",
    -    "title": "Survey Summary Statistics using R",
    -    "section": "Mean",
    -    "text": "Mean\nIf we want to calculate a mean of a variable in a dataset which has been obtained from a simple random sample such as apisrs, in R we can create a design object using the survey::svydesign function (specifying that there is no PSU using id = ~1 and the finite population correction using fpc=~fpc).\n\nsrs_design <- svydesign(id = ~1, fpc = ~fpc, data = apisrs)\n\nThis design object stores all metadata about the sample alongside the data, and is used by all subsequent functions in the {survey} package. To calculate the mean, standard error, and confidence intervals of the growth variable, we can use the survey::svymean and confint functions:\n\n# Calculate mean and SE of growth. The standard error will be corrected by the finite population correction specified in the design\nsrs_means <- svymean(~growth, srs_design)\n\nsrs_means\n\n       mean     SE\ngrowth 31.9 2.0905\n\n# Use degf() to get the degrees of freedom\nconfint(srs_means, df=degf(srs_design))\n\n          2.5 %   97.5 %\ngrowth 27.77764 36.02236\n\n\nNote that to obtain correct results, we had to specify the degrees of freedom using the design object."
    +    "objectID": "minutes/posts/23Jan2023.html",
    +    "href": "minutes/posts/23Jan2023.html",
    +    "title": "New Website Discussion",
    +    "section": "",
    +    "text": "attendees\n23_Jan_2023\n\n\n\n\nAiming Yang\nYes\n\n\nBen Arancibia\nYes\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nYes\n\n\nChelsea Dickens\nNo\n\n\nChi Zhang\nNo\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nNo\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nNo\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nJoe Rickert\nYes\n\n\nKyle Lee\nYes\n\n\nLeon Shi\nYes\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nYes\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nYes\n\n\nVandana Yadav\nNo\n\n\nVidya Gopal\nNo\n\n\nVikash Jain\nNo\n\n\nWilmar Igl\nNo\n\n\nOrla Doyle\nNo"
       },
       {
    -    "objectID": "R/survey-stats-summary.html#total",
    -    "href": "R/survey-stats-summary.html#total",
    -    "title": "Survey Summary Statistics using R",
    -    "section": "Total",
    -    "text": "Total\nCalculating population totals can be done using the survey::svytotal function in R.\n\nsvytotal(~growth, srs_design)\n\n        total    SE\ngrowth 197589 12949"
    +    "objectID": "minutes/posts/23Jan2023.html#christina-provided-a-summary-of-work-to-date-on-the-website",
    +    "href": "minutes/posts/23Jan2023.html#christina-provided-a-summary-of-work-to-date-on-the-website",
    +    "title": "New Website Discussion",
    +    "section": "Christina provided a summary of work to date on the website",
    +    "text": "Christina provided a summary of work to date on the website\nRepo now live: [https://psiaims.github.io/CAMIS/]\nPrimary mode of navigation will be the table of contents..\nComprehensive Search function is available to supplement the use of the TOC.\nThe website is build from 3 folders in github:\nR SAS Comp\nThese folders, map to the columns of the table, I.e. everything about R is in Quarto files under R.\nComp folder: for the Comparison – name sure you name the two software you are using r-sas - so we can use this when dynamically selecting.\nIn future we can add Python / Julia directories.\nThe idea would be for people to use the: [CAMIS/templates/R_template.qmd] - A template of how to write documentation for the R part of the site. They’d Edit template & save it back into the R folder naming it clearly for what it is. Template should also contain name packages being used at start of each method comparison. It’d be difficult to be exhaustive with all the survival analysis packages i.e. accelerated failure time packages, etc.., but as long as stated hopefully can grow over time.\nThe Data-info folder – contains description of all data being used for the comparisons. Going forward if different data used, the information about the data would be put into this folder. This allows the data description to sit outside of the comparison folders & where possible same data be used across comparisons.\n\nQuestions & Discussion\nJoe & Michael raised that the About tab which has information about the project is out of date, so should be updated. We also have no detail on the driving mechanism… I.e. what we would like from collaborators. Add “How to collaborate” button.\nItems to be discussed further which may need to be included in the site:\n\nupdate Methods: needs to make it more robust to future uploads - i.e. topics within linear models? (Sub categories) focus on methods, but how sort the methods for inclusion of all in future\nRating the software discrepancies. I..e How severe the difference is?\nNeed to create a template for comparisons. Discuss if we would have a purpose/highlight of comparison/ summary/conclusions at the top first. Also if we put List of R packages this comparison uses (use Tags?) - Need to consider if package superseeded/ multiple packages whether they go in 1 document or multiple.\nHow to expand to sort by: therapeutic area relevance (would be good to link from methods to Oncology somehow\nWhat if a different package.., does same analysis… have to make it clear which package is being used & include multiple packages. It was agreed that as long as we are clear on what we have compared then Its ok to not be all inclusive. That can be added by other collaborators later. It was noted by Kyle that for survival (I.e. accelerated failure time packages), it may be hard to include all. The recommendation is to start with 1 and can expand further as it grows. We may have to re-think website design as it grows to accommodate. Hence why we want everything written in smaller parts to can easily manipulate going forward."
       },
       {
    -    "objectID": "R/survey-stats-summary.html#ratios",
    -    "href": "R/survey-stats-summary.html#ratios",
    -    "title": "Survey Summary Statistics using R",
    -    "section": "Ratios",
    -    "text": "Ratios\nTo perform ratio analysis for means or proportions of analysis variables in R, we can survey::svyratio, here requesting that we do not separate the ratio estimation per Strata as this design is not stratified.\n\nsvy_ratio <- svyratio(\n  ~api00,\n  ~api99,\n  srs_design,\n  se=TRUE,\n  df=degf(srs_design),\n  separate=FALSE\n)\n\nsvy_ratio\n\nRatio estimator: svyratio.survey.design2(~api00, ~api99, srs_design, se = TRUE, \n    df = degf(srs_design), separate = FALSE)\nRatios=\n         api99\napi00 1.051066\nSEs=\n            api99\napi00 0.003603991\n\nconfint(svy_ratio, df=degf(srs_design))\n\n               2.5 %   97.5 %\napi00/api99 1.043959 1.058173"
    +    "objectID": "minutes/posts/23Jan2023.html#min-hua-provided-an-update-on-the-white-paper",
    +    "href": "minutes/posts/23Jan2023.html#min-hua-provided-an-update-on-the-white-paper",
    +    "title": "New Website Discussion",
    +    "section": "Min-Hua provided an update on the white paper:",
    +    "text": "Min-Hua provided an update on the white paper:\nIn its final stages of review by team, and will now be sent for wider review."
       },
       {
    -    "objectID": "R/survey-stats-summary.html#proportions",
    -    "href": "R/survey-stats-summary.html#proportions",
    -    "title": "Survey Summary Statistics using R",
    -    "section": "Proportions",
    -    "text": "Proportions\nTo calculate a proportion in R, we use the svymean function on a factor or character column:\n\nprops <- svymean(~sch.wide, srs_design)\n\nprops\n\n             mean     SE\nsch.wideNo  0.185 0.0271\nsch.wideYes 0.815 0.0271\n\nconfint(props, df=degf(srs_design))\n\n                2.5 %    97.5 %\nsch.wideNo  0.1316041 0.2383959\nsch.wideYes 0.7616041 0.8683959\n\n\nFor proportions close to 0, it can be that survey::svyciprop is more accurate at producing confidence intervals than confint."
    +    "objectID": "minutes/posts/9oct2023.html",
    +    "href": "minutes/posts/9oct2023.html",
    +    "title": "FDA quartely meeting, 1st survey feedback - general updates",
    +    "section": "",
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n09_oct_2023\n\n\n\n\nAiming Yang\nNo\n\n\nBen Arancibia\nNo\n\n\nBrian Varney\nYes\n\n\nChristina Fillmore\nNo\n\n\nChelsea Dickens\nYes\n\n\nChi Zhang\nYes\n\n\nClara Beck\nNo\n\n\nAditee Dani\nNo\n\n\nDoug Kelkoff\nNo\n\n\nDhvani Patel\nYes\n\n\nFilip Kabaj\nNo\n\n\nHarshal Khanolkar\nYes\n\n\nIris Wu\nNo\n\n\nJayashree Vedanayagam\nNo\n\n\nJoe Rickert\nNo\n\n\nKyle Lee\nNo\n\n\nLeon Shi\nNo\n\n\nLily Hsieh\nYes\n\n\nLyn Taylor\nYes\n\n\nMartin Brown\nYes\n\n\nMia Qi\nYes\n\n\nMichael Kane\nNo\n\n\nMichael Rimler\nNo\n\n\nMike Stackhouse\nNo\n\n\nMin-Hua Jen\nNo\n\n\nMolly MacDiarmid\nYes\n\n\nMona Mehraj\nNo\n\n\nPaula Rowley\nNo\n\n\nSoma Sekhar Sriadibhatla\nNo\n\n\nVandana Yadav\nYes\n\n\nVidya Gopal\nYes\n\n\nVikash Jain\nNo\n\n\nWilmar Igl\nYes\n\n\nOrla Doyle\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda\nWelcome New Members: Vikrant Vijay FDA, Ismael Rodriguez (Appsilon)\nPHUSE SDE: Missisauga: June 8th feedback: Jayashreee\nCAMIS-ONCO update: Soma Sekhar / Vikash Jain\nPHUSE US Connect 2024 planning (Poster accepted, will find out re: workshop oct 20th)\nWhite paper planning\nFDA meeting update /survey results.: presented to around 15 FDA representatives, but didn’t get any questions/ comments on the call. However, follow the meeting, our slides were passed to others at the FDA and Vikrant Vijay got in touch to join the group. He’s not available today, but will attend in future.\nQuestionnaire only got 16 responses, 9/16 had heard of CAMIS, 13/16 used R for GXP, 4/15 used python for GXP, 1/16 used Julia for GXP. 9/16 had experienced discrepancies whilst trying to replicate analysis between languages.\nACTION: To re-run maybe just before CSS 2024 / or each year to assess progress and use for conference presentations.\nCommon programming challenges\n\nWhilst executing Analysis in R, I come across challenge in Numerical Differences in Statistical results. Would it be great if Industry & regulatory work together to build Standard R package for Statistical Methods & details in CAMIS repository would be highly appreciated.\nEnsuring reproducible environments and having people accept that different results for different implementations of an algorithm should perhaps be interpreted as a hint towards the accuracy, rather than one of the methods being wrong.\nStandard deviation initially did not match between and SAS. Later resolved by using the type option\nChallenges to figure out array of methods to replicate the same results across different software platforms/ Finding why resutls differ / unclear documentation/ discrepancy in values\nLS means contrasts from GLMs or MMRMs between SAS and R (vis lme4/mmrm + emmeans)\nParsing issues, scalability issues and network crash.\nImplementation of median seem to differ between R and SAS…. Sometimes joins in dplyr can also behave differently than i would expect with raw SQL\nDifferent methodologies (e.g for sample size calculation0 and lack of non-standard methods in SAS (e.g sample size for adaptive design).\n\nSocial Media update : Harshal\nNewsletter, (quarterly, or monthly) to advertise progress (ie. content we created) & conferences we are attending. Can we advertize ourself more to EMA, PMDA etc.. Can send to Frank Petavy (methodological working party). ACTION: Harshal/Lyn put togther summary for newsletter & send to Wilmar to reach out to Frank & others. Lyn to email David to see if any wider participation.\nhttps://www.ema.europa.eu/en/committees/working-parties-other-groups/chmp/methodology-working-party\nWebsite Christina/ Chi / Jayashree\n\nAll pull requests accepted & everything up to date\nMMRM update - No update. ACTION: Chi Zhang: will follow up to see if we can get someone to add in MMRM package to our existing content.\ngithub training plan (R/Pharma workshop & PSI training course) - ongoing prep for workshop & course through PSI AIMS team.\nAgnieszka (PAREXEL) and Chi – working on Wilcoxon test content for paired & unpaired data.\nACTION: Chi & Christina to talk about local rendering & renv issue with not having the packages to be able to render… once we know a fix, can write up and put on the website.\n\nUpcoming conference planning\n\nPHUSE SDE New York: Oct 16th : Aiming\nPHUSE US Connect: Soma/Vikash\nR/Pharma – Christina?\nSESUG (South East SAS user group) late october 2023, Brian will present on CAMIS.\nNorth Carolina - SDE if anyone wants to volunteer to attend let us know.\n\nAOB - None."
       },
       {
    -    "objectID": "R/survey-stats-summary.html#quantiles",
    -    "href": "R/survey-stats-summary.html#quantiles",
    -    "title": "Survey Summary Statistics using R",
    -    "section": "Quantiles",
    -    "text": "Quantiles\nTo calculate quantiles in R, we can use the survey::svyquantile function. Note that this function was reworked in version 4.1 of {survey}, and prior to this had different arguments and results. The current version of svyquantile has an qrule which is similar to the type argument in quantile, and can be used to change how the quantiles are calculated. For more information, see vignette(\"qrule\", package=\"survey\").\n\nsvyquantile(\n  ~growth,\n  srs_design,\n  quantiles = c(0.025, 0.5, 0.975),\n  ci=TRUE,\n  se=TRUE\n)\n\n$growth\n      quantile ci.2.5 ci.97.5        se\n0.025      -16    -21     -12  2.281998\n0.5         27     24      31  1.774887\n0.975       99     84     189 26.623305\n\nattr(,\"hasci\")\n[1] TRUE\nattr(,\"class\")\n[1] \"newsvyquantile\""
    +    "objectID": "minutes/posts/15July2024.html",
    +    "href": "minutes/posts/15July2024.html",
    +    "title": "Repo Content Growth, Conferences 2024",
    +    "section": "",
    +    "text": "Attendees\n\n\n\n\n\n\n\n\n\n\n\nattendees\n15_Jul_24\n\n\n\n\nChristina Fillmore\nYes\n\n\nLyn Taylor\nYes\n\n\nMolly MacDiarmid\nYes\n\n\nBrian Varney\nYes\n\n\nChi Zhang\nNo\n\n\nOrla Doyle\nYes\n\n\nHarshal Khanolkar\nYes\n\n\nLily Hseih\nNo\n\n\nFilip Kabaj\nNo\n\n\nMartin Brown\nYes\n\n\nMin-Hua Jen\nYes\n\n\nSarah Rathwell\nYes\n\n\nKasa Andras\nNo\n\n\nAditee Dani\nNo\n\n\nKeaven Anderson\nYes\n\n\nBenjamin Arancibia\nNo\n\n\nWilmar Igl\nNo\n\n\nVikash Jain\nNo\n\n\nMia Qi\nNo\n\n\nLeon Shi\nNo\n\n\nVandaya Yadav\nNo\n\n\nStephen McCawille\nYes\n\n\nVikrant Vijay\nNo\n\n\nVidya Gopal\nNo\n\n\nDhvani Patel\nNo\n\n\nKyle Lee\nNo\n\n\nChelsea Dickens\nNo\n\n\nDavid Bosak\nNo\n\n\nMichael Kane\nYes\n\n\nLukas Brausch\nNo\n\n\nMichael Walshe\nYes\n\n\nSeemani Abhilipsa\nNo\n\n\nAiming Yang\nNo\n\n\nCuifeng Yin\nYes\n\n\nTodd Coffey\nNo\n\n\nJayashree Vedanayagam\nYes\n\n\nAshwath Gadapa\nNo\n\n\nMiriam Amor\nNo\n\n\nAnwesha Roy\nNo\n\n\nSamrit Pramanik\nNo\n\n\nAgnieszka Tomczyk\nNo\n\n\nPrem Kant Shekhar\nNo\n\n\nSunil\nNo\n\n\n\n\n\n\n\n\n\n\n\n\nAgenda & Minutes\nMonthly Contributions\n\nNot much content this month, but per the below, lots on the way !\n\nContent updates / assignments\nWe checked the assignments readme (under non-website content)\n\nSurvival – perhaps split into: non parametric, parametric (rather than AFT & non-proportional hazards), Update readme.md table to assign these rows to the survival team.\nTeam will meet again in 2 weeks.\nNegative binomial content has been posted, it’s a comparison, but would now be quick to write the SAS page. ACTION: Orla to ask the Novartis team to add that too.\nKeaven/Yulia – Group sequential designs: pull request internally east vs R – not doing comparison yet, but will do in future.\n\nQUESTIONS: Do we need to use SAS enterprise or SAS studio and should we state the version that gave the output? It’s probably good practice to do this in case something change. For R, we should use renv, any problem ask Christina. The R/Python code runs each time so output will be current per version being used. Only sas is static.\n22nd July – Novartis hackathon 150 signed up. Need to provide Orla with ideas of what we want them to look at. Stats SMEs will also review before doing pull requests. Possible topics could be:\n\nNegative binomial – comparison & SAS code Beecer – covariate adjustment for logistic regression\nLogistic regression page update – improve content & investigate why p value different.\nMANOVA – why R different to SAS\nFriedman test, Jonckheere test, bionomial, R / sas /comp both needed\nCorrelation in SAS\nChristina may need help to review pull request. Both Pfizer, Novartis & merck will have internal reviews prior to pull requests so review can be reduced.\n\nConferences\n\nChi’s UseR slides are now on the repository under\nPHUSE EU Brussels 23rd Sept - Qian Wang (Merck) will attend.\nPOSIT conf, R in pharma…R open now https://github.com/rinpharma/rinpharma-summit-2024?tab=readme-ov-file\nHarshal working with Daniel Sabanes Bove on the organizing committee for R in pharma: Asia pacific track – woudl be good to have a repo from Asia represent us\n25th July: Americas single day event pennylvania anyone going?\nJSM – 1st week august – Keaven Anderson going, lyn to send 1 slide.\n\nQUESTIONS: RE: funding to attend conferences, usually provided by your company, but in special circumstances we could request funding from: R consortium or PHUSE.\nBrainstorming session\nHow can we engage wider to increase content creation?\n\nPSI : enews,\nPHUSE bi-weekly news: Let Alexandra Peace (mailto:workinggroups@phuse.global) know of any events we are attending or new content we worked on and she will share in a weekly summary of progress.\nCould volunteer to host hackathons for conferences. Christina & orla volunteering to host a hackathon for R in pharma this week.\nAdvertise to PSI/PHUSE RE: if you have Findings please add an issue (even if you can’t look into it yourself).\nSpecial media post to Thank you Merck, Pfizer, Novartis for your contributions. Also companies can post what they’ve contributed. New content blogs. -\nBlog of Novartis hackathon.\n\nDissertations –still looking for new ideas for projects & widen engagement with universities."
       },
       {
    -    "objectID": "R/correlation.html",
    -    "href": "R/correlation.html",
    -    "title": "Correlation Analysis Using R",
    +    "objectID": "blogs/index.html",
    +    "href": "blogs/index.html",
    +    "title": "Blogs",
         "section": "",
    -    "text": "The most commonly used correlation analysis methods in clinical trials include:\n\nPearson correlation coefficient: product moment coefficient between two continuous variables, measuring linear associations.\n\n\\[\nr = \\frac{\\sum_{i=1}^n (x_i - m_x)(y_i - m_y)}{\\sqrt{\\sum_{i=1}^n (x_i - m_x)^2\\sum_{i=1}^n (y_i - m_y)^2}},\\]\nwhere \\(x\\) and \\(y\\) are observations from two continuous variables of length \\(n\\) and \\(m_x\\) and \\(m_y\\) are their respective means.\nSpearman correlation coefficient: rank correlation defined through the scaled sum of the squared values of the difference between ranks of two continuous variables.\n\\[\n\\rho = \\frac{\\sum_{i=1}^n (x'_i - m_{x'})(y'_i - m_{y'})}{\\sqrt{\\sum_{i=1}^n (x'_i - m_{x'})^2\\sum_{i=1}^n(y'_i - m_{y'})^2}},\n\\]\nwhere \\(x'\\) and \\(y'\\) are the ranks of \\(x\\) and \\(y\\) and \\(m_{x'}\\) and \\(m_{y'}\\) are the mean ranks of \\(x\\) and \\(y\\), respectively.\nKendall’s rank correlation: rank correlation based on the number of inversions in one ranking as compared with another.\n\\[\n\\tau = \\frac{n_c - n_d}{\\frac{1}{2}\\,n\\,(n-1)},\n\\]\nwhere \\(n_c\\) is the total number of concordant pairs, \\(n_d\\) is the total number of disconcordant pairs and \\(n\\) the total size of observations in \\(x\\) and \\(y\\).\n\nOther association measures are available for count data/contingency tables comparing observed frequencies with those expected under the assumption of independence\n\nFisher exact test\nChi-Square statistic\n\n\nExample: Lung Cancer Data\nData source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601-7, 1994.\nSurvival in patients with advanced lung cancer from the North Central Cancer Treatment Group. Performance scores rate how well the patient can perform usual daily activities.\n\nlibrary(survival) \n\nglimpse(lung)\n\nRows: 228\nColumns: 10\n$ inst      <dbl> 3, 3, 3, 5, 1, 12, 7, 11, 1, 7, 6, 16, 11, 21, 12, 1, 22, 16…\n$ time      <dbl> 306, 455, 1010, 210, 883, 1022, 310, 361, 218, 166, 170, 654…\n$ status    <dbl> 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …\n$ age       <dbl> 74, 68, 56, 57, 60, 74, 68, 71, 53, 61, 57, 68, 68, 60, 57, …\n$ sex       <dbl> 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, …\n$ ph.ecog   <dbl> 1, 0, 0, 1, 0, 1, 2, 2, 1, 2, 1, 2, 1, NA, 1, 1, 1, 2, 2, 1,…\n$ ph.karno  <dbl> 90, 90, 90, 90, 100, 50, 70, 60, 70, 70, 80, 70, 90, 60, 80,…\n$ pat.karno <dbl> 100, 90, 90, 60, 90, 80, 60, 80, 80, 70, 80, 70, 90, 70, 70,…\n$ meal.cal  <dbl> 1175, 1225, NA, 1150, NA, 513, 384, 538, 825, 271, 1025, NA,…\n$ wt.loss   <dbl> NA, 15, 15, 11, 0, 0, 10, 1, 16, 34, 27, 23, 5, 32, 60, 15, …\n\n\n\n\nOverview\ncor() computes the correlation coefficient between continuous variables x and y, where method chooses which correlation coefficient is to be computed (default: \"pearson\", \"kendall\", or \"spearman\").\ncor.test() calulates the test for association between paired samples, using one of Pearson’s product moment correlation coefficient, Kendall’s \\(\\tau\\) or Spearman’s \\(\\rho\\). Besides the correlation coefficient itself, it provides additional information.\nMissing values are assumed to be missing completely at random (MCAR). Different strategies are available, see ?cor for details.\n\n\nPearson Correlation\n\ncor.test(x = lung$age, y = lung$meal.cal, method = \"pearson\") \n\n\n    Pearson's product-moment correlation\n\ndata:  lung$age and lung$meal.cal\nt = -3.1824, df = 179, p-value = 0.001722\nalternative hypothesis: true correlation is not equal to 0\n95 percent confidence interval:\n -0.3649503 -0.0885415\nsample estimates:\n       cor \n-0.2314107 \n\n\n\n\nSpearman Correlation\n\ncor.test(x = lung$age, y = lung$meal.cal, method = \"spearman\")\n\nWarning in cor.test.default(x = lung$age, y = lung$meal.cal, method =\n\"spearman\"): Cannot compute exact p-value with ties\n\n\n\n    Spearman's rank correlation rho\n\ndata:  lung$age and lung$meal.cal\nS = 1193189, p-value = 0.005095\nalternative hypothesis: true rho is not equal to 0\nsample estimates:\n       rho \n-0.2073639 \n\n\nNote: Exact p-values require unanimous ranks.\n\n\nKendall’s rank correlation\n\ncor.test(x = lung$age, y = lung$meal.cal, method = \"kendall\")\n\n\n    Kendall's rank correlation tau\n\ndata:  lung$age and lung$meal.cal\nz = -2.7919, p-value = 0.00524\nalternative hypothesis: true tau is not equal to 0\nsample estimates:\n       tau \n-0.1443877 \n\n\n\n\nInterpretation of correlation coefficients\nCorrelation coefficient is comprised between -1 and 1:\n\n\\(-1\\) indicates a strong negative correlation\n\\(0\\) means that there is no association between the two variables\n\\(1\\) indicates a strong positive correlation"
    +    "text": "Introduction Comparing Analysis Method Implementations in Software (CAMIS)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n2023: A Year of Progress for the PHUSE CAMIS Working Group Project\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPHUSE US connect 2024 Poster Presentation by Soma & Vikash\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nNo matching items"
       },
       {
    -    "objectID": "R/R_Friedmantest.html",
    -    "href": "R/R_Friedmantest.html",
    -    "title": "Friedman Chi-Square test using R package rstatix",
    +    "objectID": "blogs/posts/202305_introduction_to_CAMIS_blog.html",
    +    "href": "blogs/posts/202305_introduction_to_CAMIS_blog.html",
    +    "title": "Introduction Comparing Analysis Method Implementations in Software (CAMIS)",
         "section": "",
    -    "text": "R 4.3.1\nrstatix 0.7.2"
    +    "text": "Are you trying to replicate results using different software/languages and struggling to find out why you can’t match the results? Check out the CAMIS repository!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe CAMIS repository stores documentation detailing the reasons for observed differences when performing statistical analysis in SAS and R. The repository is housed on github, and will be populated through open-source community contributions.\nDifferences between software could be due to different default and available options, including the methods being used. By documenting these known differences in a repository, we aim to reduce time-consuming efforts within the community, where multiple people are investigating the same issues. If you find an issue not already investigated, please log an Issue in github. If you have time to investigate and document the reason for the issue, then please submit a pull request with the new content in a quarto file. Details of how to contribute can be found on the website.\nCAMIS is a PHUSE working group in collaboration with PSI and the R consortium. Initially the repository contains R and SAS analysis result comparisons, however the team hope to extend to other software/languages in the near future. Our white paper will soon be available on the website. Please help us to build a high quality and comprehensive repository."
       },
       {
    -    "objectID": "R/R_Friedmantest.html#r-package-version",
    -    "href": "R/R_Friedmantest.html#r-package-version",
    -    "title": "Friedman Chi-Square test using R package rstatix",
    +    "objectID": "about.html",
    +    "href": "about.html",
    +    "title": "About",
         "section": "",
    -    "text": "R 4.3.1\nrstatix 0.7.2"
    +    "text": "CAMIS: Comparing Analysis Method Implementations in Software\nWe are a cross-industry PHUSE DVOST Working Group, run in collaboration with members from PHUSE, PSI, ASA and IASCT. In addition to discussions and issue comments which we do the github repo, we meet monthly on the 2nd Monday of each month. If you would like to join us please contact: workinggroups@phuse.global"
       },
       {
    -    "objectID": "R/R_Friedmantest.html#data-used",
    -    "href": "R/R_Friedmantest.html#data-used",
    -    "title": "Friedman Chi-Square test using R package rstatix",
    -    "section": "Data used",
    -    "text": "Data used\nSimulated dataset of 10 subjects(blocks) with continuous endpoints are generated for single-drug repeated measurements to check whether any significance exists between the responses(y) at different time points(4 time points simulated)(groups). The p-value will indicate whether differences in response for different time points are significant."
    +    "objectID": "about.html#who-are-we",
    +    "href": "about.html#who-are-we",
    +    "title": "About",
    +    "section": "",
    +    "text": "CAMIS: Comparing Analysis Method Implementations in Software\nWe are a cross-industry PHUSE DVOST Working Group, run in collaboration with members from PHUSE, PSI, ASA and IASCT. In addition to discussions and issue comments which we do the github repo, we meet monthly on the 2nd Monday of each month. If you would like to join us please contact: workinggroups@phuse.global"
       },
       {
    -    "objectID": "R/R_Friedmantest.html#data-source",
    -    "href": "R/R_Friedmantest.html#data-source",
    -    "title": "Friedman Chi-Square test using R package rstatix",
    -    "section": "Data source",
    -    "text": "Data source\n\nlibrary(dplyr)\n\n\nAttaching package: 'dplyr'\n\n\nThe following objects are masked from 'package:stats':\n\n    filter, lag\n\n\nThe following objects are masked from 'package:base':\n\n    intersect, setdiff, setequal, union\n\nlibrary(rstatix) \n\n\nAttaching package: 'rstatix'\n\n\nThe following object is masked from 'package:stats':\n\n    filter\n\n\n\nset.seed(123)\n\none_way_repeat <- data.frame(subject = rep(1:10, each=4),\n                          timepoint = rep(c(1, 2, 3, 4), times=10),\n                          response =round(runif(n = 40, 10, 50)))\n\nhead(one_way_repeat)\n\n  subject timepoint response\n1       1         1       22\n2       1         2       42\n3       1         3       26\n4       1         4       45\n5       2         1       48\n6       2         2       12"
    -  },
    -  {
    -    "objectID": "R/R_Friedmantest.html#overview",
    -    "href": "R/R_Friedmantest.html#overview",
    -    "title": "Friedman Chi-Square test using R package rstatix",
    -    "section": "Overview",
    -    "text": "Overview\nThe friedman.test() function from the R package ‘rstatix’ computes the following:\n\nFriedman chi-squared statistic\nits degrees of freedom and\np-value for checking whether the mean response is the same for all the time points."
    -  },
    -  {
    -    "objectID": "R/R_Friedmantest.html#handling-missing-values",
    -    "href": "R/R_Friedmantest.html#handling-missing-values",
    -    "title": "Friedman Chi-Square test using R package rstatix",
    -    "section": "Handling missing Values",
    -    "text": "Handling missing Values\nWhen the data contain NAs, the function Defaults to getOption(“na.action”) which discards the row with NAs."
    +    "objectID": "about.html#objectives",
    +    "href": "about.html#objectives",
    +    "title": "About",
    +    "section": "Objectives",
    +    "text": "Objectives\nThrough the creation of the CAMIS White Paper, the group provided guidance on the types of questions statistical staff should ask to aid with replication of analysis methods in different software and to identify the fundamental sources of discrepant results between software.\nThe group aims to save unnecessary repetition of work within the community, through the creation of this open source repository. This repository welcomes contributions from the wider community and is a resource comparing and documenting differences in analysis method implementations in software."
       },
       {
    -    "objectID": "R/R_Friedmantest.html#example-code-for-friedman-chi-square-test",
    -    "href": "R/R_Friedmantest.html#example-code-for-friedman-chi-square-test",
    -    "title": "Friedman Chi-Square test using R package rstatix",
    -    "section": "Example Code for Friedman Chi-square test",
    -    "text": "Example Code for Friedman Chi-square test\n\nfriedman.test(y=one_way_repeat$response, groups=one_way_repeat$timepoint, blocks=one_way_repeat$subject)\n\n\n    Friedman rank sum test\n\ndata:  one_way_repeat$response, one_way_repeat$timepoint and one_way_repeat$subject\nFriedman chi-squared = 3.0612, df = 3, p-value = 0.3823\n\n\nwhere:\n\ny - a vector of response values.\ngroups - a vector of values indicating the “group” an observation belongs in.\nblocks - a vector of values indicating the “blocking” variable."
    +    "objectID": "about.html#background",
    +    "href": "about.html#background",
    +    "title": "About",
    +    "section": "Background",
    +    "text": "Background\nTraditionally, highly regulated industries (such as the pharmaceutical industry), have limited themselves to the use of commercially available software. When taking such an approach, the responsibility for the validation and testing of the product was often delegated to the software development company themselves, to ensure the software performs in line with its documentation, producing accurate reliable and reproducible results. However, one downside of this approach is that new methods and functionality can be slow to be adopted, limiting new method implementation and tools that can bring in efficiency.\nWith the increase in popularity of data science, the rate at which community led tools and methods are being developed in open-source software is rapid. The availability of advanced analytic capabilities, has led to increased desire for statistical staff in regulated industries to have access and approval to use to open source software (Rimler et al. 2022). The use of open source software is now widely accepted (FDA 2015), however, this increased variety of tools has resulted in an overlap of capabilities. This has raised challenging questions of traditional approaches to clinical analyses – particularly in situations where the overlap yields different results.\nOne example of this challenge encompasses discrepancies which have been discovered in statistical analysis results between different programming languages, even when working within qualified statistical computing environments. Subtle differences exist between the fundamental approaches and assumptions implemented within each language, yielding differences in results which are correct and consistent with their respective documentation. The fact that these differences exist may cause unease for sponsor companies when submitting to a regulatory agency, as it is uncertain if the agency will view these differences as problematic. By understanding the source of any discrepancies, one can reinstate that confidence.\nThis cross-industry group aims to empower statistical staff to make informed choices on the implementation of statistical analyses when multiple languages yield different results."
       },
       {
    -    "objectID": "R/R_Friedmantest.html#references",
    -    "href": "R/R_Friedmantest.html#references",
    -    "title": "Friedman Chi-Square test using R package rstatix",
    +    "objectID": "about.html#references",
    +    "href": "about.html#references",
    +    "title": "About",
         "section": "References",
    -    "text": "References\nR friedman_test() documentation"
    +    "text": "References\n\nMichael S. Rimler, Joseph Rickert, Min-Hua Jen, Mike Stackhouse. 2022. Understanding differences in statistical methodology implementations across programming languages.\nStatistical Software Clarifying Statement (fda.gov)\nCAMIS White Paper"
       },
       {
    -    "objectID": "R/linear-regression.html",
    -    "href": "R/linear-regression.html",
    -    "title": "Linear Regression",
    +    "objectID": "publication/index.html",
    +    "href": "publication/index.html",
    +    "title": "Publications",
         "section": "",
    -    "text": "To demonstrate the use of linear regression we examine a dataset that illustrates the relationship between Height and Weight in a group of 237 teen-aged boys and girls. The dataset is available here and is imported to the workspace.\n\nDescriptive Statistics\nThe first step is to obtain the simple descriptive statistics for the numeric variables of htwt data, and one-way frequencies for categorical variables. This is accomplished by employing summary function. There are 237 participants who are from 13.9 to 25 years old. It is a cross-sectional study, with each participant having one observation. We can use this data set to examine the relationship of participants’ height to their age and sex.\n\nknitr::opts_chunk$set(echo = TRUE)\nhtwt<-read.csv(\"../data/htwt.csv\")\nsummary(htwt)\n\n      ROW          SEX                 AGE            HEIGHT     \n Min.   :  1   Length:237         Min.   :13.90   Min.   :50.50  \n 1st Qu.: 60   Class :character   1st Qu.:14.80   1st Qu.:58.80  \n Median :119   Mode  :character   Median :16.30   Median :61.50  \n Mean   :119                      Mean   :16.44   Mean   :61.36  \n 3rd Qu.:178                      3rd Qu.:17.80   3rd Qu.:64.30  \n Max.   :237                      Max.   :25.00   Max.   :72.00  \n     WEIGHT     \n Min.   : 50.5  \n 1st Qu.: 85.0  \n Median :101.0  \n Mean   :101.3  \n 3rd Qu.:112.0  \n Max.   :171.5  \n\n\nIn order to create a regression model to demonstrate the relationship between age and height for females, we first need to create a flag variable identifying females and an interaction variable between age and female gender flag.\n\nhtwt$female <- ifelse(htwt$SEX=='f',1,0)\nhtwt$fem_age <- htwt$AGE * htwt$female\nhead(htwt)\n\n  ROW SEX  AGE HEIGHT WEIGHT female fem_age\n1   1   f 14.3   56.3   85.0      1    14.3\n2   2   f 15.5   62.3  105.0      1    15.5\n3   3   f 15.3   63.3  108.0      1    15.3\n4   4   f 16.1   59.0   92.0      1    16.1\n5   5   f 19.1   62.5  112.5      1    19.1\n6   6   f 17.1   62.5  112.0      1    17.1\n\n\n\n\nRegression Analysis\nNext, we fit a regression model, representing the relationships between gender, age, height and the interaction variable created in the datastep above. We again use a where statement to restrict the analysis to those who are less than or equal to 19 years old. We use the clb option to get a 95% confidence interval for each of the parameters in the model. The model that we are fitting is height = b0 + b1 x female + b2 x age + b3 x fem_age + e\n\nregression<-lm(HEIGHT~female+AGE+fem_age, data=htwt, AGE<=19)\nsummary(regression)\n\n\nCall:\nlm(formula = HEIGHT ~ female + AGE + fem_age, data = htwt, subset = AGE <= \n    19)\n\nResiduals:\n    Min      1Q  Median      3Q     Max \n-8.2429 -1.7351  0.0383  1.6518  7.9289 \n\nCoefficients:\n            Estimate Std. Error t value Pr(>|t|)    \n(Intercept)  28.8828     2.8734  10.052  < 2e-16 ***\nfemale       13.6123     4.0192   3.387 0.000841 ***\nAGE           2.0313     0.1776  11.435  < 2e-16 ***\nfem_age      -0.9294     0.2478  -3.750 0.000227 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\nResidual standard error: 2.799 on 215 degrees of freedom\nMultiple R-squared:  0.4595,    Adjusted R-squared:  0.452 \nF-statistic: 60.93 on 3 and 215 DF,  p-value: < 2.2e-16\n\n\nFrom the coefficients table b0,b1,b2,b3 are estimated as b0=28.88 b1=13.61 b2=2.03 b3=-0.92942\nThe resulting regression model for height, age and gender based on the available data is height=28.8828 + 13.6123 x female + 2.0313 x age -0.9294 x fem_age"
    +    "text": "Whitepaper\nKey Considerations When Understanding Differences in Statistical Methodology Implementations Across Programming Languages - An Introduction to the CAMIS Project\nRead the whitepaper here\n\n\nConference presentations\n\n2024 Conference Schedule\nList of seminars and conferences that the CAMIS team will be attending in 2024.\nIf you are a volunteer on the CAMIS project and plan to present at a seminar or conference, please add details of the conference below. For help with slides or content go to HERE.\nTo cite the CAMIS project work in online content or presentations please use: “Content reproduced with the permission of PHUSE CAMIS - A DVOST Working Group”.\n\n\n\nConference name\nDate (2024)\nLocation\nName Attending\nDetails\nWebsite\n\n\n\n\nRSS Local Group Seminar\n28 Feb\nSheffield, England\nLyn Taylor\nSlides\nRSS\n\n\nphuse US Connect\n25-28 Feb\nBethesa, Maryland, USA\nSoma Sekhar Sriadibhatla, Vikash Jain, Brian Varney\nPoster\nConnect\n\n\nphuse chapter connect\n03 APR\nBangalore\nHarshal Khanolkar\n\n\n\n\nphuse/FDA CSS\n3-5 June\nSilver Spring Maryland, USA\nMike Stackhouse\nCAMIS Discussion\nCSS\n\n\nR/Medicine\n10-14 June\nOnline\nAgnieszka Tomczyk, Lyn Taylor\nPart1 and Part2 and slides\nR/Medicine 2024\n\n\nUseR!\n8-11 July\nSalzburg, Austria\nChi Zhang\nPresentation\nuseR! 2024\n\n\nphuse EU\n11-13 Nov\nStrasbourg, France\nAgnieszka Tomczyk, Christina Fillmore\nPresentation\nPHUSE EU Connect\n\n\n\n\n\nYearly Conference Planner\nTo help to plan our attendance throughout the year, here is a list of conferences we are looking to send representation to. If you plan to attend one of these conferences and are interested in representing us, then please get in touch.\n\n\n\nConference name\nUsual Abstract Deadline\nUsual Conference Date\nRegion\nLinks\n\n\n\n\nJoint Statistical Meetings (JSM) American Statistical Association (ASA)\n1st February\n1st week of August\nUSA\nJSM-ASA\n\n\nASA Biopharmaceutical Section Regulatory-Industry Statistics workshop\nEnd March\nLast week of September\nUSA\nBIOP\n\n\nPhuse US Connect\nNovember\nLast week of Feb\nUSA\nCDISC\n\n\nPhuse/FDA Computational Science Symposium(CSS)\nDecember\n1st week of June\nUSA\nCSS\n\n\nIASCT (ConSPIC)\nMid March\nEarly May\nIndia\nIASCT\n\n\nSociety of Clinical Trials (SCT)\nJanuary\nMid May\nUSA\nSCT\n\n\nPharmaSUG\nMid Jan\nMid May\nUSA\nPharmaSUG\n\n\nuseR\nEarly March\nEarly July\nEurope/Online\nuseR\n\n\nPSI\nNov-oral, Feb-Poster\nMid June\nEurope\nPSI\n\n\nDIA Global\nEnd Feb-poster\nMid June\nUSA\nDIA-USA\n\n\nDIA Europe\nNov\nMid March\nEurope\nDIA-Europe\n\n\nDIA China\nJan\nMid May\nChina\nDIA-China\n\n\nInternational Society for Clinical Biostatistics (ISCB)\nMid Feb\nMid July\nEurope\nISCB\n\n\nRoyal Statistical Society (RSS)\nEarly April\nEarly September\nEngland\nRSS\n\n\nSouthEast SAS User Group (SESUG)\nEnd Feb\nEnd Sept\nMaryland, USA\nSESUG\n\n\nPHUSE EU Connect\nMid March\nMid Nov\nEurope\nPHUSE EU Connect\n\n\nR/Pharma\nApril\nMid October\nVirtual\nR/pharma\n\n\nPOSIT conf.\nInvite only\nSeptember\nUSA\nPOSIT conf"
       },
       {
    -    "objectID": "R/survival.html",
    -    "href": "R/survival.html",
    -    "title": "Survival Analysis Using R",
    +    "objectID": "publication/conference.html",
    +    "href": "publication/conference.html",
    +    "title": "Conferences",
         "section": "",
    -    "text": "The most commonly used survival analysis methods in clinical trials include:\nAdditionally, other methods for analyzing time-to-event data are available, such as:\nWhile these models may be explored in a separate document, this particular document focuses solely on the three most prevalent methods: KM estimators, log-rank test and Cox PH model."
    -  },
    -  {
    -    "objectID": "R/survival.html#example-data",
    -    "href": "R/survival.html#example-data",
    -    "title": "Survival Analysis Using R",
    -    "section": "Example Data",
    -    "text": "Example Data\nData source: https://stats.idre.ucla.edu/sas/seminars/sas-survival/\nThe data include 500 subjects from the Worcester Heart Attack Study. This study examined several factors, such as age, gender and BMI, that may influence survival time after heart attack. Follow up time for all participants begins at the time of hospital admission after heart attack and ends with death or loss to follow up (censoring). The variables used here are:\n\nlenfol: length of followup, terminated either by death or censoring - time variable\nfstat: loss to followup = 0, death = 1 - censoring variable\nafb: atrial fibrillation, no = 0, 1 = yes - explanatory variable\ngender: males = 0, females = 1 - stratification factor\n\n\nlibrary(tidyverse)\nlibrary(haven)\nlibrary(survival)\nlibrary(survminer)\nlibrary(broom)\nlibrary(knitr)\nknitr::opts_chunk$set(echo = TRUE)\n\ndat <- read_sas(file.path(\"../data/whas500.sas7bdat\")) %>%\n  mutate(LENFOLY = round(LENFOL/365.25, 2), ## change follow-up days to years for better visualization\n         AFB = factor(AFB, levels = c(1, 0))) ## change AFB order to use \"Yes\" as the reference group to be consistent with SAS"
    -  },
    -  {
    -    "objectID": "R/survival.html#the-non-stratified-model",
    -    "href": "R/survival.html#the-non-stratified-model",
    -    "title": "Survival Analysis Using R",
    -    "section": "The Non-stratified Model",
    -    "text": "The Non-stratified Model\nFirst we try a non-stratified analysis following the mock-up above to describe the association between survival time and afb (atrial fibrillation).\nThe KM estimators are from survival::survfit function, the log-rank test uses survminer::surv_pvalue, and Cox PH model is conducted using survival::coxph function. Numerous R packages and functions are available for performing survival analysis. The author has selected survival and survminer for use in this context, but alternative options can also be employed for survival analysis.\n\nKM estimators\n\nfit.km <- survfit(Surv(LENFOLY, FSTAT) ~ AFB, data = dat)\n\n## quantile estimates\nquantile(fit.km, probs = c(0.25, 0.5, 0.75)) \n\n$quantile\n        25   50   75\nAFB=1 0.26 2.37 6.43\nAFB=0 0.94 5.91 6.44\n\n$lower\n        25   50   75\nAFB=1 0.05 1.27 4.24\nAFB=0 0.55 4.32 6.44\n\n$upper\n        25   50 75\nAFB=1 1.11 4.24 NA\nAFB=0 1.47   NA NA\n\n## landmark estimates at 1, 3, 5-year\nsummary(fit.km, times = c(1, 3, 5)) \n\nCall: survfit(formula = Surv(LENFOLY, FSTAT) ~ AFB, data = dat)\n\n                AFB=1 \n time n.risk n.event survival std.err lower 95% CI upper 95% CI\n    1     50      28    0.641  0.0543        0.543        0.757\n    3     27      12    0.455  0.0599        0.351        0.589\n    5     11       6    0.315  0.0643        0.211        0.470\n\n                AFB=0 \n time n.risk n.event survival std.err lower 95% CI upper 95% CI\n    1    312     110    0.739  0.0214        0.699        0.782\n    3    199      33    0.642  0.0245        0.595        0.691\n    5     77      20    0.530  0.0311        0.472        0.595\n\n\n\n\nLog-rank test\n\nsurvminer::surv_pvalue(fit.km, data = dat)\n\n  variable         pval   method    pval.txt\n1      AFB 0.0009646027 Log-rank p = 0.00096\n\n\n\n\nCox PH model\n\nfit.cox <- coxph(Surv(LENFOLY, FSTAT) ~ AFB, data = dat)\nfit.cox %>% \n  tidy(exponentiate = TRUE, conf.int = TRUE, conf.level = 0.95) %>%\n  select(term, estimate, conf.low, conf.high)\n\n# A tibble: 1 × 4\n  term  estimate conf.low conf.high\n  <chr>    <dbl>    <dbl>     <dbl>\n1 AFB0     0.583    0.421     0.806"
    -  },
    -  {
    -    "objectID": "R/survival.html#the-stratified-model",
    -    "href": "R/survival.html#the-stratified-model",
    -    "title": "Survival Analysis Using R",
    -    "section": "The Stratified Model",
    -    "text": "The Stratified Model\nIn a stratified model, the Kaplan-Meier estimators remain the same as those in the non-stratified model. To implement stratified log-rank tests and Cox proportional hazards models, simply include the strata() function within the model formula.\n\nStratified Log-rank test\n\nfit.km.str <- survfit(Surv(LENFOLY, FSTAT) ~ AFB + strata(GENDER), data = dat)\n\nsurvminer::surv_pvalue(fit.km.str, data = dat)\n\n            variable        pval   method   pval.txt\n1 AFB+strata(GENDER) 0.001506607 Log-rank p = 0.0015\n\n\n\n\nStratified Cox PH model\n\nfit.cox.str <- coxph(Surv(LENFOLY, FSTAT) ~ AFB + strata(GENDER), data = dat)\nfit.cox.str %>% \n  tidy(exponentiate = TRUE, conf.int = TRUE, conf.level = 0.95) %>%\n  select(term, estimate, conf.low, conf.high)\n\n# A tibble: 1 × 4\n  term  estimate conf.low conf.high\n  <chr>    <dbl>    <dbl>     <dbl>\n1 AFB0     0.594    0.430     0.823"
    +    "text": "2024 Conference Schedule\nList of seminars and conferences that the CAMIS team will be attending in 2024.\nIf you are a volunteer on the CAMIS project and plan to present at a seminar or conference, please add details of the conference below. For help with slides or content go to HERE.\nIf you want a single slide which advertises the CAMIS project, you can find this HERE\nTo cite the CAMIS project work in online content or presentations please use: “Content reproduced with the permission of PHUSE CAMIS - A DVOST Working Group”.\n\n\n\nConference name\nDate (2024)\nLocation\nName Attending\nDetails\nWebsite\n\n\n\n\nRSS Local Group Seminar\n28 Feb\nSheffield, England\nLyn Taylor\nSlides\nRSS\n\n\nphuse US Connect\n25-28 Feb\nBethesa, Maryland, USA\nSoma Sekhar Sriadibhatla, Vikash Jain, Brian Varney\nPoster\nConnect\n\n\nphuse chapter connect\n03 APR\nBangalore\nHarshal Khanolkar\n\n\n\n\nphuse/FDA CSS\n3-5 June\nSilver Spring Maryland, USA\nMike Stackhouse\nCAMIS Discussion\nCSS\n\n\nR/Medicine\n10-14 June\nOnline\nAgnieszka Tomczyk, Lyn Taylor\nslides\nR/Medicine 2024\n\n\nUseR!\n8-11 July\nSalzburg, Austria\nChi Zhang\nPresentation\nuseR! 2024\n\n\nPHUSE Belgian SDE\n23 Sept\nBrussels, Belgium\nQian Wang (msd)\nPresentation\nPHUSE SDE\n\n\nSESUG\n22-24 Sept\nBethesda, MD, USA\nBrian\n\nSESUG 2024\n\n\nR/pharma APAC track\n30 Oct- 1 Nov\nOnline, APAC\nSamrit Pramanik\nPresentation\n\n\n\nphuse EU\n11-13 Nov\nStrasbourg, France\nAgnieszka Tomczyk, Christina Fillmore, Stephen Mccawille and Anwesha Roy\nPresentation\nPHUSE EU Connect\n\n\nEffective statistician conference\n11-12 Nov\nVirtual\nLyn Taylor\nPresentation\nlink\n\n\n\n\n\nYearly Conference Planner\nTo help to plan our attendance throughout the year, here is a list of conferences we are looking to send representation to. If you plan to attend one of these conferences and are interested in representing us, then please get in touch.\n\n\n\nConference name\nUsual Abstract Deadline\nUsual Conference Date\nRegion\nLinks\n\n\n\n\nJoint Statistical Meetings (JSM) American Statistical Association (ASA)\n1st February\n1st week of August\nUSA\nJSM-ASA\n\n\nASA Biopharmaceutical Section Regulatory-Industry Statistics workshop\nEnd March\nLast week of September\nUSA\nBIOP\n\n\nPhuse US Connect\nNovember\nLast week of Feb\nUSA\nCDISC\n\n\nPhuse/FDA Computational Science Symposium(CSS)\nDecember\n1st week of June\nUSA\nCSS\n\n\nIASCT (ConSPIC)\nMid March\nEarly May\nIndia\nIASCT\n\n\nSociety of Clinical Trials (SCT)\nJanuary\nMid May\nUSA\nSCT\n\n\nPharmaSUG\nMid Jan\nMid May\nUSA\nPharmaSUG\n\n\nuseR\nEarly March\nEarly July\nEurope/Online\nuseR\n\n\nPSI\nNov-oral, Feb-Poster\nMid June\nEurope\nPSI\n\n\nDIA Global\nEnd Feb-poster\nMid June\nUSA\nDIA-USA\n\n\nDIA Europe\nNov\nMid March\nEurope\nDIA-Europe\n\n\nDIA China\nJan\nMid May\nChina\nDIA-China\n\n\nInternational Society for Clinical Biostatistics (ISCB)\nMid Feb\nMid July\nEurope\nISCB\n\n\nRoyal Statistical Society (RSS)\nEarly April\nEarly September\nEngland\nRSS\n\n\nSouthEast SAS User Group (SESUG)\nEnd Feb\nEnd Sept\nMaryland, USA\nSESUG\n\n\nPHUSE EU Connect\nMid March\nMid Nov\nEurope\nPHUSE EU Connect\n\n\nR/Pharma\nApril\nMid October\nVirtual\nR/pharma\n\n\nPOSIT conf.\nInvite only\nSeptember\nUSA\nPOSIT conf"
       },
       {
    -    "objectID": "R/ttest_1Sample.html",
    -    "href": "R/ttest_1Sample.html",
    -    "title": "One Sample t-test",
    +    "objectID": "Comp/r-sas_logistic-regr.html",
    +    "href": "Comp/r-sas_logistic-regr.html",
    +    "title": "R vs SAS: Logistic Regression",
         "section": "",
    -    "text": "The One Sample t-test is used to compare a single sample against an expected hypothesis value. In the One Sample t-test, the mean of the sample is compared against the hypothesis value. In R, a One Sample t-test can be performed using the Base R t.test() from the stats package or the proc_ttest() function from the procs package.\n\n\nThe following data was used in this example.\n\n# Create sample data\nread <- tibble::tribble(\n  ~score, ~count,\n  40, 2,   47, 2,   52, 2,   26, 1,   19, 2,\n  25, 2,   35, 4,   39, 1,   26, 1,   48, 1,\n  14, 2,   22, 1,   42, 1,   34, 2 ,  33, 2,\n  18, 1,   15, 1,   29, 1,   41, 2,   44, 1,\n  51, 1,   43, 1,   27, 2,   46, 2,   28, 1,\n  49, 1,   31, 1,   28, 1,   54, 1,   45, 1\n)\n\n\n\n\nBy default, the R one sample t-test functions assume normality in the data and use a classic Student’s t-test.\n\n\n\n\nThe following code was used to test the comparison in Base R. Note that the baseline null hypothesis goes in the “mu” parameter.\n\n  # Perform t-test\n  t.test(read$score, mu = 30)\n\n\n    One Sample t-test\n\ndata:  read$score\nt = 2.3643, df = 29, p-value = 0.02497\nalternative hypothesis: true mean is not equal to 30\n95 percent confidence interval:\n 30.67928 39.38739\nsample estimates:\nmean of x \n 35.03333 \n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a one sample t-test. Note that the null hypothesis value goes in the “options” parameter.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(read, var = score,\n             options = c(\"h0\" = 30))\n\n$Statistics\n    VAR  N     MEAN      STD   STDERR MIN MAX\n1 score 30 35.03333 11.66038 2.128884  14  54\n\n$ConfLimits\n    VAR     MEAN     LCLM     UCLM      STD  LCLMSTD  UCLMSTD\n1 score 35.03333 30.67928 39.38739 11.66038 9.286404 15.67522\n\n$TTests\n    VAR DF        T     PROBT\n1 score 29 2.364306 0.0249741\n\n\nViewer Output:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThe Base R t.test() function does not have an option for lognormal data. Likewise, the procs proc_ttest() function also does not have an option for lognormal data.\nOne possibility may be the tTestLnormAltPower() function from the EnvStats package. This package has not been evaluated yet."
    +    "text": "Comparison of results between SAS vs R for different applications of logistic regression; where possible we try to ensure the same statistical method or algorithm is specified. However, there are some underlying differences between the algorithms in SAS vs R that cannot be (at least not easily) “tweaked”. The document also provides some remarks on what parameters to look out for and what could have caused the numerical differences.\n\n\n\n\n\n\n\n\n\n\n\nMethodologies\n\n\n\n\n\n\nLogistic regression\nFirth’s bias-reduced logistic regression\ng-computation / standardization with covariate adjustment\n\n\n\n\n\n\n\n\n\n\n\nTechnical implementations\n\n\n\n\n\n\nSAS: PROC LOGISTIC (with and without firth option) and %margins macro\n\nR: stats::glm, logistf::logistf and beeca::get_marginal_effect\n\n\n\n\n\n\n\n\n\nBelow are summary of findings from a numerical comparison using example data, where possible we specify the same algorithm in R and SAS.\n\n\n\n\n\n\nLogistic regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm in R vs PROC LOGISTIC procedure (without Firth option) in SAS.\n\n\n\n\n\n\n\n\n\nFirth logistic regression\n\n\n\n\n\nExact match cannot be obtained for all estimates using logistf vs PROC LOGISTIC procedure (with Firth option). More specifically:\n- Coefficient estimate and 95% CI matched at 0.001 level;\n- Standard error are not the same (e.g., 0.02023 for age in R vs 0.02065 in SAS);\n- p-value is not the same (0.6288 in R for age vs 0.6348 in SAS);\n\n\n\n\n\n\n\n\n\n\ng-computation with covariate adjustment\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using get_marginal_effect in R vs %margins macro in SAS.\n\n\n\nIn the following sections, the parameterisation of logistic regression implementation (with an without Firth option) will be compared followed by numerical comparison using example data."
       },
       {
    -    "objectID": "R/ttest_1Sample.html#normal",
    -    "href": "R/ttest_1Sample.html#normal",
    -    "title": "One Sample t-test",
    +    "objectID": "Comp/r-sas_logistic-regr.html#goal",
    +    "href": "Comp/r-sas_logistic-regr.html#goal",
    +    "title": "R vs SAS: Logistic Regression",
         "section": "",
    -    "text": "By default, the R one sample t-test functions assume normality in the data and use a classic Student’s t-test.\n\n\n\n\nThe following code was used to test the comparison in Base R. Note that the baseline null hypothesis goes in the “mu” parameter.\n\n  # Perform t-test\n  t.test(read$score, mu = 30)\n\n\n    One Sample t-test\n\ndata:  read$score\nt = 2.3643, df = 29, p-value = 0.02497\nalternative hypothesis: true mean is not equal to 30\n95 percent confidence interval:\n 30.67928 39.38739\nsample estimates:\nmean of x \n 35.03333 \n\n\n\n\n\n\n\n\nThe following code from the procs package was used to perform a one sample t-test. Note that the null hypothesis value goes in the “options” parameter.\n\n  library(procs)\n\n  # Perform t-test\n  proc_ttest(read, var = score,\n             options = c(\"h0\" = 30))\n\n$Statistics\n    VAR  N     MEAN      STD   STDERR MIN MAX\n1 score 30 35.03333 11.66038 2.128884  14  54\n\n$ConfLimits\n    VAR     MEAN     LCLM     UCLM      STD  LCLMSTD  UCLMSTD\n1 score 35.03333 30.67928 39.38739 11.66038 9.286404 15.67522\n\n$TTests\n    VAR DF        T     PROBT\n1 score 29 2.364306 0.0249741\n\n\nViewer Output:"
    +    "text": "Comparison of results between SAS vs R for different applications of logistic regression; where possible we try to ensure the same statistical method or algorithm is specified. However, there are some underlying differences between the algorithms in SAS vs R that cannot be (at least not easily) “tweaked”. The document also provides some remarks on what parameters to look out for and what could have caused the numerical differences."
       },
       {
    -    "objectID": "R/ttest_1Sample.html#lognormal",
    -    "href": "R/ttest_1Sample.html#lognormal",
    -    "title": "One Sample t-test",
    +    "objectID": "Comp/r-sas_logistic-regr.html#scope",
    +    "href": "Comp/r-sas_logistic-regr.html#scope",
    +    "title": "R vs SAS: Logistic Regression",
         "section": "",
    -    "text": "The Base R t.test() function does not have an option for lognormal data. Likewise, the procs proc_ttest() function also does not have an option for lognormal data.\nOne possibility may be the tTestLnormAltPower() function from the EnvStats package. This package has not been evaluated yet."
    +    "text": "Methodologies\n\n\n\n\n\n\nLogistic regression\nFirth’s bias-reduced logistic regression\ng-computation / standardization with covariate adjustment\n\n\n\n\n\n\n\n\n\n\n\nTechnical implementations\n\n\n\n\n\n\nSAS: PROC LOGISTIC (with and without firth option) and %margins macro\n\nR: stats::glm, logistf::logistf and beeca::get_marginal_effect"
       },
       {
    -    "objectID": "R/rounding.html",
    -    "href": "R/rounding.html",
    -    "title": "Rounding in R",
    +    "objectID": "Comp/r-sas_logistic-regr.html#findings",
    +    "href": "Comp/r-sas_logistic-regr.html#findings",
    +    "title": "R vs SAS: Logistic Regression",
         "section": "",
    -    "text": "Attaching package: 'janitor'\n\n\nThe following objects are masked from 'package:stats':\n\n    chisq.test, fisher.test\n\n\n\nAttaching package: 'dplyr'\n\n\nThe following objects are masked from 'package:stats':\n\n    filter, lag\n\n\nThe following objects are masked from 'package:base':\n\n    intersect, setdiff, setequal, union"
    +    "text": "Below are summary of findings from a numerical comparison using example data, where possible we specify the same algorithm in R and SAS.\n\n\n\n\n\n\nLogistic regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm in R vs PROC LOGISTIC procedure (without Firth option) in SAS.\n\n\n\n\n\n\n\n\n\nFirth logistic regression\n\n\n\n\n\nExact match cannot be obtained for all estimates using logistf vs PROC LOGISTIC procedure (with Firth option). More specifically:\n- Coefficient estimate and 95% CI matched at 0.001 level;\n- Standard error are not the same (e.g., 0.02023 for age in R vs 0.02065 in SAS);\n- p-value is not the same (0.6288 in R for age vs 0.6348 in SAS);\n\n\n\n\n\n\n\n\n\n\ng-computation with covariate adjustment\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using get_marginal_effect in R vs %margins macro in SAS.\n\n\n\nIn the following sections, the parameterisation of logistic regression implementation (with an without Firth option) will be compared followed by numerical comparison using example data."
       },
       {
    -    "objectID": "R/rounding.html#round-from-r-base",
    -    "href": "R/rounding.html#round-from-r-base",
    -    "title": "Rounding in R",
    -    "section": "round from R base",
    -    "text": "round from R base\nThe round() function in Base R will round to the nearest whole number and ‘rounding to the even number’ when equidistant, meaning that exactly 12.5 rounds to the integer 12. However, this is dependent on OS services and on representation error (since e.g. 0.15 is not represented exactly, the rounding rule applies to the represented number and not to the printed number, and so round(0.15, 1) could be either 0.1 or 0.2).\n\nround(1:9/10+0.05,1)\n\n[1] 0.2 0.2 0.3 0.4 0.6 0.7 0.8 0.9 1.0"
    +    "objectID": "Comp/r-sas_logistic-regr.html#r-packages",
    +    "href": "Comp/r-sas_logistic-regr.html#r-packages",
    +    "title": "R vs SAS: Logistic Regression",
    +    "section": "R packages",
    +    "text": "R packages\n\nlibrary(tidyverse)\n\n── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──\n✔ dplyr     1.1.4     ✔ readr     2.1.5\n✔ forcats   1.0.0     ✔ stringr   1.5.1\n✔ ggplot2   3.5.1     ✔ tibble    3.2.1\n✔ lubridate 1.9.3     ✔ tidyr     1.3.1\n✔ purrr     1.0.2     \n── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag()    masks stats::lag()\nℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors\n\nlibrary(survival) # for example data\nlibrary(logistf) # for firth regression\nlibrary(beeca) # for covariate adjustment"
       },
       {
    -    "objectID": "R/rounding.html#round_half_up-from-package-janitor",
    -    "href": "R/rounding.html#round_half_up-from-package-janitor",
    -    "title": "Rounding in R",
    -    "section": "round_half_up from package janitor",
    -    "text": "round_half_up from package janitor\nNote that the janitor package in R contains a function round_half_up() that rounds away from zero. In this case it rounds to the nearest whole number and ‘away from zero’ or ‘rounding up’ when equidistant, meaning that exactly 12.5 rounds to the integer 13.\n\n#Example code\nmy_number <-c(2.2,3.99,1.2345,7.876,13.8739)\n\nr_0_dec <- round(my_number, digits=0);\nr_1_dec <- round(my_number, digits=1);\nr_2_dec <- round(my_number, digits=2);\nr_3_dec <- round(my_number, digits=3);\n\nr_0_dec\n\n[1]  2  4  1  8 14\n\nr_1_dec\n\n[1]  2.2  4.0  1.2  7.9 13.9\n\nr_2_dec\n\n[1]  2.20  3.99  1.23  7.88 13.87\n\nr_3_dec\n\n[1]  2.200  3.990  1.234  7.876 13.874\n\n\nIf using the janitor package in R, and the function round_half_up(), the results would be the same with the exception of rounding 1.2345 to 3 decimal places where a result of 1.235 would be obtained instead of 1.234. However, in some rare cases, round_half_up() does not return result as expected. There are two kinds of cases for it. 1. Round down for positive decimal like 0.xx5.\n\nround_half_up(524288.1255, digits = 3)\n\n[1] 524288.1\n\n\nThe cause is that when the decimal is stored in binary, the value usually does not exactly the same with the original number. In the example above, 524288.1255 is stored as a value a little less than the original value. Then round_half_up() rounds it down.\n\noptions(digits=22)\n524288.1255\n\n[1] 524288.1254999999655411\n\n\nIn round_half_up(), a small decimal sqrt(.Machine$double.eps) is added before rounding. It avoids some incorrect rounding due to the stored numeric value is a little less than the original value, but does not cover all conditions.\n\nround_half_up <- function (x, digits = 0) \n{\n    posneg <- sign(x)\n    z <- abs(x) * 10^digits\n    z <- z + 0.5 + sqrt(.Machine$double.eps)\n    z <- trunc(z)\n    z <- z/10^digits\n    z * posneg\n}\n\nMore examples can be found from the code below. It creates numeric values containing different digit numbers of integer part and decimal part, and all ending with 5 for rounding.\n\noptions(digits=15) #set digit number to display \nint1 <- c(0,2^(1:19)) #create values of integer part\nround_digits <- 1:7 #define values of rounding digits\ndec1 <- 2^(-round_digits)+10^(-round_digits-1)*5 #create values of decimal part\ndf1 <- cross_join(tibble(int1),tibble(dec1,round_digits)) |>\n  mutate(num1=int1+dec1) #combine integer part and decimal part\ndf1 |> mutate(rounded_num=round_half_up(num1,round_digits)) |> #round the numbers\n  filter(rounded_num<num1) |>  #incorrect if rounded result is less than the original number\n  print.data.frame()\n\n    int1       dec1 round_digits            num1    rounded_num\n1  32768 0.01562550            6  32768.01562550  32768.0156250\n2  65536 0.03125500            5  65536.03125500  65536.0312500\n3 262144 0.06255000            4 262144.06255000 262144.0625000\n4 262144 0.03125500            5 262144.03125500 262144.0312500\n5 524288 0.12550000            3 524288.12550000 524288.1250000\n6 524288 0.00781255            7 524288.00781255 524288.0078125\n\n\n6 of 140 numbers have incorrect results. Most of them are big numbers or long decimals to round.\n\nRound up for positive decimal like 0.4999….\n\n\noptions(digits=16)\nround_half_up(1.4999999851,0)\n\n[1] 2\n\n\nIt occurs when the number is smaller than but so closed to 0.xx5. As described in point 1 above, in round_half_up(), a small decimal sqrt(.Machine$double.eps) is added before rounding, which causes a number bigger than 0.xx5 to be rounded. It occurs only when the decimal is long, so round_half_up() is still reliable.\nAnd the added decimal sqrt(.Machine$double.eps) is necessary. Without it, or even replace it to a smaller decimal, there will be more incorrect results under point 1, as the example below. Some of them are common, e.g. rounding 16.1255 to 3 decimals.\n\n#a new function to round away from zero, by replacing sqrt(.Machine$double.eps) in round_half_up to a smaller number\nround_half_up_test <- function (x, digits = 0){\n  posneg <- sign(x)\n  z <- abs(x) * 10^digits\n  z <- z + 0.5 + .Machine$double.eps *100\n  z <- trunc(z)\n  z <- z/10^digits\n  z * posneg\n}\n\noptions(digits=15) #set digit number to display \ndf1 |> mutate(rounded_num=round_half_up_test(num1,round_digits)) |> #round the numbers\n  filter(rounded_num<num1) |>  #incorrect if rounded result is less than the original number\n  print.data.frame()\n\n     int1       dec1 round_digits            num1    rounded_num\n1       2 0.03125500            5      2.03125500      2.0312500\n2       4 0.01562550            6      4.01562550      4.0156250\n3      16 0.12550000            3     16.12550000     16.1250000\n4      16 0.01562550            6     16.01562550     16.0156250\n5     128 0.12550000            3    128.12550000    128.1250000\n6     128 0.06255000            4    128.06255000    128.0625000\n7     128 0.03125500            5    128.03125500    128.0312500\n8    8192 0.25500000            2   8192.25500000   8192.2500000\n9   16384 0.12550000            3  16384.12550000  16384.1250000\n10  32768 0.25500000            2  32768.25500000  32768.2500000\n11  32768 0.01562550            6  32768.01562550  32768.0156250\n12  65536 0.12550000            3  65536.12550000  65536.1250000\n13  65536 0.03125500            5  65536.03125500  65536.0312500\n14 262144 0.06255000            4 262144.06255000 262144.0625000\n15 262144 0.03125500            5 262144.03125500 262144.0312500\n16 524288 0.12550000            3 524288.12550000 524288.1250000\n17 524288 0.00781255            7 524288.00781255 524288.0078125"
    +    "objectID": "Comp/r-sas_logistic-regr.html#data",
    +    "href": "Comp/r-sas_logistic-regr.html#data",
    +    "title": "R vs SAS: Logistic Regression",
    +    "section": "Data",
    +    "text": "Data\n\nLogistic regressions\nWe use the lung dataset provided with {survival} R package. Initial data preparation involves generating a new binary outcome based on the weight change.\n\n# the lung dataset is available in ./data/lung_cancer.csv\nlung2 <- survival::lung %>% \n  mutate(\n    wt_grp = factor(wt.loss > 0, labels = c(\"weight loss\", \"weight gain\"))\n  ) \nglimpse(lung2)\n\nRows: 228\nColumns: 11\n$ inst      <dbl> 3, 3, 3, 5, 1, 12, 7, 11, 1, 7, 6, 16, 11, 21, 12, 1, 22, 16…\n$ time      <dbl> 306, 455, 1010, 210, 883, 1022, 310, 361, 218, 166, 170, 654…\n$ status    <dbl> 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …\n$ age       <dbl> 74, 68, 56, 57, 60, 74, 68, 71, 53, 61, 57, 68, 68, 60, 57, …\n$ sex       <dbl> 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, …\n$ ph.ecog   <dbl> 1, 0, 0, 1, 0, 1, 2, 2, 1, 2, 1, 2, 1, NA, 1, 1, 1, 2, 2, 1,…\n$ ph.karno  <dbl> 90, 90, 90, 90, 100, 50, 70, 60, 70, 70, 80, 70, 90, 60, 80,…\n$ pat.karno <dbl> 100, 90, 90, 60, 90, 80, 60, 80, 80, 70, 80, 70, 90, 70, 70,…\n$ meal.cal  <dbl> 1175, 1225, NA, 1150, NA, 513, 384, 538, 825, 271, 1025, NA,…\n$ wt.loss   <dbl> NA, 15, 15, 11, 0, 0, 10, 1, 16, 34, 27, 23, 5, 32, 60, 15, …\n$ wt_grp    <fct> NA, weight gain, weight gain, weight gain, weight loss, weig…\n\n\n\n\ng-computation\nWe use the trial01 dataset provided with {beeca} R package. Initial data preparation involves setting the treatment indicator as a categorical variable and removing any incomplete cases.\n\ndata(\"trial01\")\n\ntrial01$trtp <- factor(trial01$trtp) ## set treatment to a factor\n\ntrial01 <- trial01 %>% filter(!is.na(aval)) ## remove missing data i.e complete cases analysis\n# save the dataset to be imported in SAS\n# write.csv(trial01, file = \"data/trial01.csv\", na = \".\")"
       },
       {
    -    "objectID": "R/rounding.html#other-methods",
    -    "href": "R/rounding.html#other-methods",
    -    "title": "Rounding in R",
    -    "section": "Other methods",
    -    "text": "Other methods\nhttps://stackoverflow.com/a/12688836 discussed multiple algorithms to round away from zero, including the one implemented in round_half_up(). Below is another algorithm modified from it.\n\nround_v2 <- function(x, digits = 0, eps = .Machine$double.eps) round(x + x * eps, digits = digits)\n\nLike round_half_up(), it also contains the two kinds of incorrect results. And like round_half_up(), a small decimal is added to make 0.xx5 round up. The parameter eps is provided to let user decide which small decimal to add.\nTo avoid the rounding issue totally, the only way is to increase precision, e.g. using package Rmpfr. It will need CPU resource. And it’s not always necessary considering the accuracy of current functions."
    +    "objectID": "Comp/r-sas_logistic-regr.html#parameterisation-comparison",
    +    "href": "Comp/r-sas_logistic-regr.html#parameterisation-comparison",
    +    "title": "R vs SAS: Logistic Regression",
    +    "section": "Parameterisation Comparison",
    +    "text": "Parameterisation Comparison\nThe following set of tables compare how to configure particular parameters / attributes of the methodologies.\n\n\n\nTable 1: Standard Logistic Regression in SAS vs R\n\n\n\n\n\n\n\n\n\n\n\n\nAttribute\nSAS  PROC LOGISTIC\nR stats::glm\nDescription\nNote\n\n\n\n\nLikelihood optimization algorithm\nDefault\nDefault\nFisher’s scoring method (i.e., iteratively reweighted least squares (IRLS))\nFor logistic regression, parameter estimates and covariance matrices estimated should be the same for both Fisher’s and Newton-Raphson algorithm for maximum likelihood.\n\n\nConvergence criteria\nDefault\nNA\nSpecifies relative gradient convergence criterion (GCONV=1E–8)\nInPROC LOGISTIC there are three other convergence criteria which can be specified. However, there is no exact criterion that matches the criteria in stats::glm.\n\n\nConvergence criteria\nNA\nDefault\nSpecifies relative difference between deviance < 1E–8.\n\n\n\nConfidence interval (CI) estimation method\nDefault\nconfint.default()\nWald CI\nIn stats::glm in R, function confint.default() gives the Wald confidence limits; whereas function confint() gives the profile-likelihood limits.\n\n\nHypothesis tests for regression coefficients\nDefault\nDefault\nWald tests, which are based on estimates for the regression coefficients and its corresponding standard error."
       },
       {
    -    "objectID": "R/rounding.html#conclusion",
    -    "href": "R/rounding.html#conclusion",
    -    "title": "Rounding in R",
    -    "section": "Conclusion",
    -    "text": "Conclusion\nSo far, round_half_up() from package janitor is still one of the best solutions to round away from zero, though users may meet incorrect results in rare cases when the numbers are big or the decimal is long.\n\noptions(digits = 7) #This just returns the number of displayed digits back to the default"
    +    "objectID": "Comp/r-sas_logistic-regr.html#sec-num-comp",
    +    "href": "Comp/r-sas_logistic-regr.html#sec-num-comp",
    +    "title": "R vs SAS: Logistic Regression",
    +    "section": "Numerical Comparison",
    +    "text": "Numerical Comparison\nEvery effort is made to ensure that the R code employs estimation methods/ optimization algorithms/ other components that closely match (as much as possible) those used in the SAS code.\n\nglm in R\nNote, the default fitting method in glm is consistent with the default fitting method in PROC LOGISTIC procedure.\n\nDefault fitting method in glm is iteratively reweighted least squares, and the documentation can be found here.\nDefault fitting method for PROC LOGISTIC procedure is Fisher’s scoring method, which is reported as part of the SAS default output, and it is equivalent to “Iteratively reweighted least squares” method as reported in this documentation.\n\n\n# stats::glm function\nm1 <- glm(wt_grp ~ age + sex + ph.ecog + meal.cal, data = lung2, family = binomial(link=\"logit\"))\n# model coefficients summary\nsummary(m1)$coefficients\n\n                 Estimate   Std. Error    z value   Pr(>|z|)\n(Intercept)  3.2631672833 1.6488206996  1.9790917 0.04780569\nage         -0.0101717451 0.0208107243 -0.4887742 0.62500157\nsex         -0.8717357187 0.3714041991 -2.3471348 0.01891841\nph.ecog      0.4179665342 0.2588653214  1.6146100 0.10639518\nmeal.cal    -0.0008869427 0.0004467405 -1.9853642 0.04710397\n\n\nNote, function confint.default gives the Wald confidence limits, which is the default option in SAS PROC LOGISTIC procedure; whereas confint gives the profile-likelihood limits. Conditional odds ratio is calculated by taking the exponential of the model parameters.\n\ncbind(est = coef(m1), \n          confint.default(m1))\n\n                      est        2.5 %        97.5 %\n(Intercept)  3.2631672833  0.031538095  6.494796e+00\nage         -0.0101717451 -0.050960015  3.061653e-02\nsex         -0.8717357187 -1.599674572 -1.437969e-01\nph.ecog      0.4179665342 -0.089400173  9.253332e-01\nmeal.cal    -0.0008869427 -0.001762538 -1.134731e-05\n\n\n\n\nPROC LOGISTIC in SAS (without firth option)\n\nPROC LOGISTIC DATA=LUNG2; # import lung\n    MODEL WT_GRP(EVENT=\"weight_gain\") = AGE SEX PH_ECOG MEAL_CAL;\n    ods output ESTIMATEs=estimates;\nrun;\n\nBelow is screenshot of output tables summarizing coefficient estimates and confidence intervals\n\n\n\n\n\n\n\n\n\n\n\n\nComment on model selection\nAs indicated in Logistic regression in R and Logistic regression in SAS, the chi-Sq test statistics and p-values are different when performing model selections in R vs. SAS. The reason for this discrepancy is that the chi-Sq statistics from anova() in R is based on deviance test using residual deviance while the chi-Sq statistics from PROC LOGISTIC w/ SELECTION option in SAS is based on Wald test using z-values squared.\n\n\n\n\n\n\nConclusion for logistic regression\n\n\n\n\n\nExact match (at 0.001 level) can be obtained using glm in R vs PROC LOGISTIC procedure (without Firth option) in SAS, for coefficient estimates, 95% CI, and for p-value."
       },
       {
    -    "objectID": "R/Weighted-log-rank.html",
    -    "href": "R/Weighted-log-rank.html",
    -    "title": "Testing approaches under non-proportional hazards",
    -    "section": "",
    -    "text": "In clinical studies with time-to-event outcomes, it is commonly assumed that the hazard functions of two groups are proportional. The standard log-rank test is widely used to test the equivalence of survival functions. However, several scenarios can lead to non-proportional hazards (NPH). For example, a delayed treatment effect may be observed in the treatment arm which can lead to departure from proportionality of the survival curves. Thus there are many tests available in the literature that can handle such scenarios. Most commonly used tests are as follows:\n\nWeighted log-rank test\nRestricted Mean Survival Time (RMST)\nMilestone survival\nMax-Combo test.\n\nWhile these tests may be explored in a separate document, this particular document focuses solely on the weighted log-rank test."
    +    "objectID": "Comp/r-sas_logistic-regr.html#parameterisation-comparison-1",
    +    "href": "Comp/r-sas_logistic-regr.html#parameterisation-comparison-1",
    +    "title": "R vs SAS: Logistic Regression",
    +    "section": "Parameterisation Comparison",
    +    "text": "Parameterisation Comparison\n\n\n\nTable 2: Firth’s Bias-Reduced Logistic Regression in SAS vs R\n\n\n\n\n\n\n\n\n\n\n\n\nAttribute\nSAS  PROC LOGISTIC w/ Firth option\nR logistf::logistf\nDescription\nNote\n\n\n\n\nLikelihood optimization algorithm\nDefault\ncontrol =logistf.control (fit =“IRLS”)\nFisher’s scoring method (i.e., iteratively reweighted least squares (IRLS))\n\n\n\nLikelihood optimization algorithm\nTECHNIQUE = NEWTON\nDefault\nNewton-Raphson algorithm\n\n\n\nConvergence criteria\nDefault\nNA\nSpecifies relative gradient convergence criterion (GCONV=1E–8).\nInPROC LOGISTIC there are three other convergence criteria which can be specified. If more than one convergence criterion is specified, the optimization is terminated as soon as one of the criteria is satisfied.\n\n\nConvergence criteria\nNA\nDefault\nSpecifies three criteria that need to be met: the change in log likelihood is less than lconv (default is 1E-5), the maximum absolute element of the score vector is less than gconv (default is 1E-5), and the maximum absolute change in beta is less than xconv (default is 1E-5).\nThe gconv criteria in logistif is different from GCONV in SAS. The lconv criteria is also not exactly the same as the ABSFCONV or FCONV in PROC LOGISTIC in SAS, although the criteria use log likelihood. However, the xconv in R and XCONV in SAS seems to be consistent.\n\n\nConvergence criteria\nXCONV = 1E–8\ncontrol = logistf.control( xconv = 1E–8, lconv = 1, gconv = 1)\nSpecifies the maximum absolute change in beta < 1E–8.\nIn logistf, three convergence criteria are checked at the same time. So here we use a large convergence criteria value for lconv and gconv to mimic the scenario where only xconv is checked.\n\n\nConfidence interval (CI) estimation method\nDefault\npl= FALSE\nWald CI\nFor logistf: “Note that from version 1.24.1 on, the variance-covariance matrix is based on the second derivative of the likelihood of the augmented data rather than the original data, which proved to be a better approximation if the user chooses to set a higher value for the penalty strength.” This could cause differences in standard error estimates in R vs SAS for Firth logistic regression, and consequently results in differences in the corresponding Wald CI estimates and hypothesis tests results (e.g., p-values).\n\n\nConfidence interval (CI) estimation method\nCLPARM = PL  CLODDS = PL\nDefault\nProfile likelihood-based CI\nFor Firth’s bias-reduced logistic regression, it makes more sense to use penalized likelihood-based CI so it is consistent with the parameter estimation method which uses penalized maximum likelihood.\n\n\nHypothesis tests for regression coefficients\nDefault\npl= FALSE\nWald tests, which are based on estimates for the regression coefficients and its corresponding standard error.\n\n\n\nHypothesis tests for regression coefficients\nNA\nDefault\n“Likelihood ratio tests”, which are based on profile penalized log likelihood.\nIn SAS, when the model statement option CLPARM = PL is specified, the CI will be calculated based on profile likelihood. However, the hypothesis testing method is still a Wald method. This could cause results mismatch in the p-value."
       },
       {
    -    "objectID": "R/Weighted-log-rank.html#survdiff",
    -    "href": "R/Weighted-log-rank.html#survdiff",
    -    "title": "Testing approaches under non-proportional hazards",
    -    "section": "survdiff()",
    -    "text": "survdiff()\nThis function uses \\(G(\\rho)=\\hat{S}(t)^\\rho, \\rho \\geq 0\\) , where \\(\\hat{S}(t)\\) is the Kaplan-Meier estimate of the survival function at time \\(t\\). If \\(\\rho = 0\\), then this is the standard log-rank test.\n\nlibrary(survival)\nWLRtest<-survdiff(Surv(LENFOL,FSTAT)~ AFB,rho = 3,data=dat)\n\n\nWLRtest\n\nCall:\nsurvdiff(formula = Surv(LENFOL, FSTAT) ~ AFB, data = dat, rho = 3)\n\n        N Observed Expected (O-E)^2/E (O-E)^2/V\nAFB=0 422     86.3     94.5     0.718      7.68\nAFB=1  78     24.2     16.0     4.245      7.68\n\n Chisq= 7.7  on 1 degrees of freedom, p= 0.006 \n\n\nFor the illustration, \\(\\rho\\) is taken as 3 while calculating weights and the weighted log rank test reject the null hypothesis at 2.5% level of significance."
    +    "objectID": "Comp/r-sas_logistic-regr.html#numerical-comparison",
    +    "href": "Comp/r-sas_logistic-regr.html#numerical-comparison",
    +    "title": "R vs SAS: Logistic Regression",
    +    "section": "Numerical Comparison",
    +    "text": "Numerical Comparison\nNote that while Firth logistic regression is not required for our example dataset nonetheless we use it for demonstration purposes only.\n\nlogistf in R\n\nBy default, the convergence criteria in logistf specifies that three criteria need to be met at the same time, i.e., the change in log likelihood is less than lconv (default is 1E-5), the maximum absolute element of the score vector is less than gconv (default is 1E-5), and the maximum absolute change in beta is less than xconv (default is 1E-5). In SAS, the default convergence criteria in PROC LOGISTIC specifies relative gradient convergence criterion (GCONV=1E–8); while SAS also support three other convergence criteria but when there are more than one convergence criterion specified, the optimization is terminated as soon as one of the criteria is satisfied. By looking at the R pacakge/SAS documentation, the gconv criteria in logistif function is different from the GCONV in SAS. The lconv criteria is also not exactly the same as the ABSFCONV or FCONV in PROC LOGISTIC in SAS, although the criteria use log likelihood. However, similar convergence criteria might be obtained by using the maximum absolute change in parameter estimates (i.e., xconv in R and SAS). Therefore, for comparison with the SAS output, in logistf function, we use a large convergence criteria value for lconv and gconv to mimic the scenario where only xconv is checked, i.e., specify logistf.control(xconv = 0.00000001, gconv = 1, lconv = 1) for the control argument.\nBy default, logistf function in R computes the confidence interval estimates and hypothesis tests (including p-value) for each parameter based on profile likelihood, which is also reported in the output below. However, Wald method (confidence interval and tests) can be specified by specifying the control argument with pl = FALSE.\n\n\nfirth_mod <- logistf(wt_grp ~ age + sex + ph.ecog + meal.cal,\n                     data=lung2, \n                     control = logistf.control(fit =\"IRLS\", \n                                               xconv = 0.00000001, \n                                               gconv = 1, \n                                               lconv = 1))\nsummary(firth_mod)$coefficients\n\nlogistf(formula = wt_grp ~ age + sex + ph.ecog + meal.cal, data = lung2, \n    control = logistf.control(fit = \"IRLS\", xconv = 1e-08, gconv = 1, \n        lconv = 1))\n\nModel fitted by Penalized ML\nCoefficients:\n                     coef     se(coef)   lower 0.95    upper 0.95     Chisq\n(Intercept)  3.1532937589 1.6031659729  0.051844703  6.410119e+00 3.9726447\nage         -0.0098111679 0.0202315630 -0.050518148  2.974343e-02 0.2337368\nsex         -0.8455619163 0.3632129422 -1.571158740 -1.356810e-01 5.4536777\nph.ecog      0.4018229715 0.2520090355 -0.090278518  9.093255e-01 2.5553004\nmeal.cal    -0.0008495327 0.0004288525 -0.001722033 -7.098976e-06 3.9058205\n                     p method\n(Intercept) 0.04624509      2\nage         0.62876680      2\nsex         0.01952718      2\nph.ecog     0.10992492      2\nmeal.cal    0.04811912      2\n\nMethod: 1-Wald, 2-Profile penalized log-likelihood, 3-None\n\nLikelihood ratio test=10.54964 on 4 df, p=0.03212009, n=170\nWald test = 33.85701 on 4 df, p = 7.972359e-07\n\n\n  (Intercept)           age           sex       ph.ecog      meal.cal \n 3.1532937589 -0.0098111679 -0.8455619163  0.4018229715 -0.0008495327 \n\n## Code below would give Wald CI and tests results by adding `pl = FALSE`\n# logistf(..., pl = FALSE)\n\nNote, function confint gives the profile-likelihood limits. Given the parameters from Firth’s bias-reduced logistic regression is estimated using penalized maximum likelihood, confint function is used. Conditional odds ratio is calculated by taking the exponential of the model parameters.\n\ncbind(est = coef(firth_mod), \n          confint(firth_mod))\n\n                      est    Lower 95%     Upper 95%\n(Intercept)  3.1532937589  0.051844703  6.410119e+00\nage         -0.0098111679 -0.050518148  2.974343e-02\nsex         -0.8455619163 -1.571158740 -1.356810e-01\nph.ecog      0.4018229715 -0.090278518  9.093255e-01\nmeal.cal    -0.0008495327 -0.001722033 -7.098976e-06\n\n\n\n\nPROC LOGISTIC in SAS (with firth option)\n\nNote, by default, SAS computes confidence interval based on Wald tests. Given the parameters from Firth’s method is estimated using penalized maximum likelihood, below specifies CLODDS = PL CLPARM=PL (based on profile likelihood), which is consistent with the maximization method and the R code above. However, the default hypothesis test for the regression coefficients is still a Wald test, and the Chi-square statistics is calculated based on coefficient estimate and its corresponding standard error.\nXCONV specifies relative parameter convergence criterion, which should correspond to the xconv in logistf function in R. We specify XCONV = 0.00000001 so it should be consistent with the R code above.\n\n\nPROC LOGISTIC DATA=LUNG2;\n    MODEL WT_GRP(EVENT=\"weight gain\") = AGE SEX PH_ECOG MEAL_CAL / firth clodds=PL clparm=PL xconv = 0.00000001;\n    ods output ESTIMATEs=estimates;\nrun;\n\nBelow is screenshot of output tables summarizing coefficient estimates and it’s 95% CI\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nConclusion for Firth logistic regression\n\n\n\n\n\nExact match cannot be obtained for all estimates using logistf vs PROC LOGISTIC procedure with Firth option. More specifically:\n- Coefficient estimate and its 95% CI matched at 0.001 level;\n- Standard error are not the same (e.g., 0.02023 for age in R vs 0.02065 in SAS);\n- p-value is not the same (0.6288 in R for age vs 0.6348 in SAS);"
       },
       {
    -    "objectID": "R/Weighted-log-rank.html#wlrt",
    -    "href": "R/Weighted-log-rank.html#wlrt",
    -    "title": "Testing approaches under non-proportional hazards",
    -    "section": "wlrt()",
    -    "text": "wlrt()\nThis function uses \\(G(\\rho,\\gamma)=\\hat{S}(t)^\\rho (1-\\hat{S}(t))^\\gamma; \\rho,\\gamma \\geq 0,\\) , where \\(\\hat{S}(t)\\) is the Kaplan-Meier estimate of the survival function at time \\(t\\). If \\(\\rho = \\gamma = 0\\), then this is the standard log-rank test. When \\(\\rho=0, \\gamma=1\\) this test can be used to detect early difference in the survival curves, when \\(\\rho=1, \\gamma = 0\\), this test can be used to detect late differences in the survival curves and when \\(\\rho=1, \\gamma = 1\\) this test can be used to test middle differences in the survival curves. Also it is to be noted that this test gives the Z-score as the test statistic which can be squared to obtain the chi-square statistic.\n\nlibrary(nphRCT)\nWL<-wlrt(Surv(LENFOL,FSTAT)~ AFB, data=dat, method=\"fh\", rho = 0, gamma = 0)\nWL\n\n         u      v_u        z trt_group\n1 16.77487 25.81609 3.301521         1\n\n\nTo obtain the corresponding \\(p\\)-value we can either use 2(1-pnorm(abs(WL$z),0,1)) or we can square the test statistic WL$z by using (WL$z)^2 and obtain the corresponding \\(p\\)-values as 1 - pchisq((WL$z)^2,1) , both the \\(p\\)-values will be the same.\n\n2*(1-pnorm(abs(WL$z),0,1))\n\n[1] 0.0009616214\n\n(WL$z)^2\n\n[1] 10.90004\n\n1-pchisq((WL$z)^2,1)\n\n[1] 0.0009616214\n\n\nFor the illustration purpose we used \\(\\rho=0,\\  \\gamma=0\\) and in this scenario weighted log-rank test becomes standard log-rank test. Therefore, the result obtained in this illustration is consistent with the result obtained in standard log-rank test."
    +    "objectID": "Comp/r-sas_logistic-regr.html#numerical-comparison-1",
    +    "href": "Comp/r-sas_logistic-regr.html#numerical-comparison-1",
    +    "title": "R vs SAS: Logistic Regression",
    +    "section": "Numerical Comparison",
    +    "text": "Numerical Comparison\n\nget_marginal_effect in R\nWe fit a logistic regression model with covariate adjustment to estimate the marginal treatment effect using the delta method for variance estimation: as outlined in Ge et al (2011).\n\n## fit the model including model based variance estimation with delta method\nfit1 <-\n  glm(aval ~ trtp + bl_cov, family = \"binomial\", data = trial01) %>% \n  get_marginal_effect(\n    trt = \"trtp\",\n    method = \"Ge\",\n    contrast = \"diff\",\n    reference = \"0\",\n    type = \"model-based\"\n  )\ncat(\"Marginal treatment effect = \", fit1$marginal_est, \"\\n\",\n    \"Standard error = \", fit1$marginal_se, \"\\n\"\n    )\n\nMarginal treatment effect =  -0.06836399 \n Standard error =  0.06071641 \n\n\n\n\n%Margins macro in SAS\nWe now use the SAS [%Margins] (https://support.sas.com/kb/63/038.html) macro to perform the Ge et al. (2011) method on trial01 to estimate the marginal risk difference and it’s standard error.\n\n%Margins(data      = myWork.trial01,\n         class     = trtp,\n         classgref = first, /*Set reference to first level*/\n         response  = avaln,\n         roptions  = event='1', /*Ensure event is set to 1 = Yes */\n         dist      = binomial,  \n         model     = trtp bl_cov,\n         margins   = trtp, \n         options   = cl diff reverse, /*Specify risk difference contrast and \n                                      direction of treatment effect is correct*/\n         link      = logit);  /*Specify logit link function */\n    \n** Store output data sets ; \ndata myWork.margins_trt_estimates;\n  set work._MARGINS;\nrun;\n         \ndata myWork.margins_trt_diffs;\n  set work._DIFFSPM;\nrun;\n\n\n\n\n\n\n\n\n%LR macro in SAS (Ge et al, 2011)\n\n%LR(data = myWork.trial01, /* input data set */\n    var1 = bl_cov, /* continuous covariates in the logistic regression */\n    var2 = trtp, /* categorical covariates in the logistic regression */\n    p1 = 1, /* number of continuous covariates in the logistic regression */\n    p2 = 1, /* number of categorical covariates in the logistic regression */\n    resp = avaln, /* binary response variable in the logistic regression */\n    ntrt = 1); /* position of the treatment variable in the categorical covariates */\n    \ndata myWork.ge_macro_trt_diffs;\n  set work.geout;\nrun;\n\n\n\n\n\n\n\n\n\n\n\n\nConclusion for g-computation with covariate adjustment\n\n\n\n\n\nExact match at the 0.001 level."
       },
       {
    -    "objectID": "R/survival_cif.html",
    -    "href": "R/survival_cif.html",
    -    "title": "Estimating Cumulative Incidence Functions Using R",
    +    "objectID": "Comp/r-sas_manova.html",
    +    "href": "Comp/r-sas_manova.html",
    +    "title": "Multivariate Analysis of Variance in R vs SAS",
         "section": "",
    -    "text": "In this document we present how to estimate the cumulative incidence function (CIF) in R. We focus on the competing risks model where each subject experiences only one out of k possible events as depicted in the figure below."
    +    "text": "MANOVA: Testing for group mean vectors are the same vs at least one is different\nWhen applying the following hypothesis, SAS and R match identically see R and SAS.\n\nH0: Group mean vectors are the same for all groups or they don’t differ significantly.\nH1: At least one of the group mean vectors is different from the rest.\n\nHowever, if interest was in comparing 1 level of a parameter vs the others, this was only achieved using SAS. Contrast statements in SAS were easy to implement as shown here SAS however R did not replicate these results and to date a solution has not been found.\nNOTE: if you feel you can help with the above discrepancy please contribute to the CAMIS repo by following the instructions on the contributions page."
       },
       {
    -    "objectID": "R/survival_cif.html#objective",
    -    "href": "R/survival_cif.html#objective",
    -    "title": "Estimating Cumulative Incidence Functions Using R",
    +    "objectID": "Comp/r-sas_friedman.html",
    +    "href": "Comp/r-sas_friedman.html",
    +    "title": "R vs SAS Non-parametric Analysis - Friedman test",
         "section": "",
    -    "text": "In this document we present how to estimate the cumulative incidence function (CIF) in R. We focus on the competing risks model where each subject experiences only one out of k possible events as depicted in the figure below."
    +    "text": "library(tidyverse)\nlibrary(rstatix) \nlibrary(ggpubr)"
       },
       {
    -    "objectID": "R/survival_cif.html#r-packages",
    -    "href": "R/survival_cif.html#r-packages",
    -    "title": "Estimating Cumulative Incidence Functions Using R",
    -    "section": "R Packages",
    -    "text": "R Packages\nWe identify three packages:\n\ncmprsk\ntidycmprsk\nsurvival\n\nThe cmprsk package implements the methods described in Gray (1988) for testing CIFs across different groups. The tidycmprsk package is a wrapper for cmprsk. It uses syntax similar to other survival analysis packages, and returns survival objects. In this document, we illustrate how to use the tidycmprsk package for estimating and testing CIFs. More details and other functionalities can be found here.\nThe survival package is a general purpose survival analysis package. Its scope is far beyond the competing risks model. We will demonstrate how to estimate the CIFs using this package.\n\nData used\nThe bone marrow transplant (BTM) dataset as presented by Guo & So (2018) is used. The dataset has the following variables:\n\nGroup has three levels, indicating three disease groups: ALL, AML-Low Risk, AML-High Risk.\nT is the disease-free survival time in days. A derived variable TYears = T/365.25 is used in the analysis.\nStatus has value 0 if T is censored; 1 if T is time to relapse; 2 if T is time to death.\nWaitTime is the waiting time to transplant in days. This variable is not used here.\nA new variable ID is created.\n\n\nrequire(dplyr)\nbmt <- haven::read_sas(file.path(\"../data/bmt.sas7bdat\")) %>%\n  mutate(\n    Group = factor(Group, \n                   levels = c(1, 2, 3), \n                   labels = c('ALL', 'AML-Low Risk', 'AML-High Risk')\n    ),\n    Status = factor(Status,\n                    levels = c(0, 1, 2),\n                    labels = c('Censored', 'Relapse', 'Death')),\n    TYears = T / 365.25,\n    ID = row_number()\n  )"
    +    "objectID": "Comp/r-sas_friedman.html#data-used",
    +    "href": "Comp/r-sas_friedman.html#data-used",
    +    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    +    "section": "Data used",
    +    "text": "Data used\nFriedman’s test is used when you have one within-subjects independent variable with two or more levels and a dependent variable that is not interval and normally distributed (but at least ordinal). To build such unreplicated blocked data, we’ll create a data frame called  df_bp from random number. In  df_bp : dependent variable bp is randomly generated; Block: subjid ; Group: time_point.\n\nset.seed(123)\n\ndf_bp = data.frame(bp = runif(n = 50, 138, 200)) %>% \n  mutate(subjid = as.factor(row_number() %% 5),  \n         time_point = as.factor((row_number()-1) %/% 5 + 1))\n\nhead(df_bp)\n\n        bp subjid time_point\n1 155.8298      1          1\n2 186.8749      2          1\n3 163.3566      3          1\n4 192.7471      4          1\n5 196.3090      0          1\n6 140.8245      1          2\n\n\nLet’s see distribution of df_bp\n\nggpubr::ggboxplot(df_bp, x = \"time_point\", y = \"bp\", add = \"jitter\")"
       },
       {
    -    "objectID": "R/survival_cif.html#estimating-cifs",
    -    "href": "R/survival_cif.html#estimating-cifs",
    -    "title": "Estimating Cumulative Incidence Functions Using R",
    -    "section": "Estimating CIFs",
    -    "text": "Estimating CIFs\n\nThe tidycmprsk Package\n\nCIF Estimates and Gray’s Test\nThe tidycmprsk::cuminc() function requires a Surv object. Therefore, the first level of the event status variable (in this example Status) must represent censoring.\n\nrequire(survival)\nrequire(tidycmprsk)\nrequire(tidyverse)\ncif.1 <- cuminc(Surv(TYears, Status) ~ Group, data = bmt) \n\nGray’s test statistics and p-value:\n\nknitr::kable(\n  glance(cif.1) %>% \n  pivot_longer(\n    everything(),\n    names_to = c(\".value\", \"outcome_id\"),\n    names_pattern = \"(.*)_(.*)\"\n  )\n)\n\n\n\n\noutcome_id\noutcome\nstatistic\ndf\np.value\n\n\n\n\n1\nRelapse\n11.9228820\n2\n0.0025762\n\n\n2\nDeath\n0.1374108\n2\n0.9336017\n\n\n\n\n\nCIF estimates for time to relapse at selected timepoints for ‘AML-Low Risk’ patients:\n\nknitr::kable(\n  cif.1 %>% \n  tidy(times = c(0.5, 1, 1.5, 2, 3)) %>%\n  select(time, outcome, strata, estimate, std.error, conf.low, conf.high) %>% \n  filter(outcome == 'Relapse' & strata == 'AML-Low Risk') %>%\n  mutate(time = as.character(time),\n         across(where(is.numeric), ~ num(., digits = 4))\n  )\n)\n\n\n\n\ntime\noutcome\nstrata\nestimate\nstd.error\nconf.low\nconf.high\n\n\n\n\n0.5\nRelapse\nAML-Low Risk\n0.0000\n0.0000\nNA\nNA\n\n\n1\nRelapse\nAML-Low Risk\n0.0741\n0.0360\n0.0234\n0.1646\n\n\n1.5\nRelapse\nAML-Low Risk\n0.1296\n0.0463\n0.0563\n0.2344\n\n\n2\nRelapse\nAML-Low Risk\n0.1481\n0.0489\n0.0685\n0.2565\n\n\n3\nRelapse\nAML-Low Risk\n0.1667\n0.0514\n0.0813\n0.2783\n\n\n\n\n\nTwo points to note:\n\nThe current version of cmprsk, and hence tidycmprsk, estimates the variance of the CIF estimates asymptotically as in Aalen (1978). There is no option to change it to other methods.\ntidycmprsk::cuminc() offers pointwise CIs for the CIF estimates using the log-log transforms. There is no other options.\n\n\n\nCIF Plots\n\nrequire(ggsurvfit)\ncif.1 %>%\n  ggcuminc(outcome = 'Death') +\n  ## add_confidence_interval() +\n  add_risktable() +\n  xlab('Time (years) to death')\n\n\n\n\n\n\n\ncif.1 %>%\n  ggcuminc(outcome = 'Relapse') +\n  ## add_confidence_interval() +\n  add_risktable() +\n  xlab('Time (years) to relapse')\n\n\n\n\n\n\n\n\n\n\n\nThe survival Package\n\nCIF Estimates\nUsing the bone marrow transplant example, the following code shows how to estimate the CIF for time to relapse or to death:\n\ncif.2 <- survfit(Surv(TYears, Status) ~ Group,\n                 data = bmt,\n                 se.fit = TRUE,\n                 conf.type = 'log-log', ## default is 'log'\n                 id = ID,\n                 robust = TRUE ## default for multi-state model\n                 )\n## summary(cif.2)\n\nA few points to note:\n\nsurvfit() returns the probability of being in a state (pstate). The CIF is its complement, i.e., CIF = 1 - pstate.\nGray’s test for testing equality across groups is not performed.\nIn this example survfit() recognizes that the input are in multi-state model format; therefore, it estimates the variances of the CIFs with an infinitesimal jackknife (see Therneau (2024)). The CIs, as a result, are different from that estimated based on Aalen’s or the delta method as done in SAS PROC LIFETEST.\nThe survival package also offers a different syntax for estimating CIFs. Users need to first call finegray() separately for each event to reformat the data, then apply survfit() for each event. The CIF estimates are identical since the same estimation method is used; the variances can be different from directly calling survfit() with data in multi-state model format, since finegray() artificially extends the observed time for the competing events (see Therneau (2024)).\n\n\n\nCIF Plots\nThe same ggcuminc() syntax can be applied to the survfit() output cif.2."
    +    "objectID": "Comp/r-sas_friedman.html#example-code-using-rstatix",
    +    "href": "Comp/r-sas_friedman.html#example-code-using-rstatix",
    +    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    +    "section": "Example Code using {rstatix}",
    +    "text": "Example Code using {rstatix}\nIn R, friedman_test can be used to compare multiple means of rank in bp grouped by time_point, stratified by subjid.\n\nres.fried <- df_bp %>% \n  friedman_test(bp ~ time_point | subjid)\nres.fried\n\n# A tibble: 1 × 6\n  .y.       n statistic    df     p method       \n* <chr> <int>     <dbl> <dbl> <dbl> <chr>        \n1 bp        5      10.9     9 0.284 Friedman test"
       },
       {
    -    "objectID": "R/survival_cif.html#summary",
    -    "href": "R/survival_cif.html#summary",
    -    "title": "Estimating Cumulative Incidence Functions Using R",
    -    "section": "Summary",
    -    "text": "Summary\nBoth tidycmprsk::cminc() (as inherited from cmprsk::cuminc()) and survival::survfit() implement Aalen-Johansen estimator. For competing risks it reduces to CIF, which has a closed form formulation. The results are identical as produced by SAS PROC LIFETEST.\nCertain options in SAS, e.g., the delta method for variance estimation or other types of transformation for calculating the CIs, are not available in the current versions of tidycmprsk::cuminc() or survival::survfit(). However, the outputs from both contain enough information that these options can be manually implemented by users. For example, Pintilie (2006) provides R code for deriving the variances for the estimated CIFs based on the delta method.\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n #| echo: false\n si <- sessioninfo::session_info(\n c(\"cmprsk\", \"tidycmprsk\", \"survival\" ) #Vector of packages used \n , dependencies = FALSE)\n si\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 22.04.5 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-10\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package    * version date (UTC) lib source\n P cmprsk       2.2-12  2024-05-19 [?] RSPM (R 4.4.0)\n P survival   * 3.7-0   2024-06-05 [?] RSPM (R 4.4.0)\n P tidycmprsk * 1.1.0   2024-08-17 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────"
    +    "objectID": "Comp/r-sas_friedman.html#example-code-using-proc-freq",
    +    "href": "Comp/r-sas_friedman.html#example-code-using-proc-freq",
    +    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    +    "section": "Example Code using {PROC FREQ}",
    +    "text": "Example Code using {PROC FREQ}\nIn SAS, CMH2 option of PROC FREQ is used to perform Friedman’s test.\nproc freq data=data_bp;\n   tables patient*dos*bp / \n          cmh2 scores=rank noprint;\nrun;"
       },
       {
    -    "objectID": "R/survival_cif.html#reference",
    -    "href": "R/survival_cif.html#reference",
    -    "title": "Estimating Cumulative Incidence Functions Using R",
    -    "section": "Reference",
    -    "text": "Reference\nAalen O. (1978). Nonparametric Estimation of Partial Transition Probabilities in Multiple Decrement Models, Annals of Statistics, 6:534-545.\nGray R. (1988). A Class of K-Sample Tests for Comparing the Cumulative Incidence of a Competing Risk, Annals of Statistics, 16:1141-1154.\nGray R. (2024). cmprsk: Subdistribution Analysis of Competing Risks. R package version 2.2-12. https://cran.r-project.org/web/packages/cmprsk/cmprsk.pdf\nGuo C and So Y. (2018). Cause-Specific Analysis of Competing Risks Using the PHREG Procedure. In Proceedings of the SAS Global Forum 2018 Conference. Cary, NC: SAS Institute Inc. https://support.sas.com/resources/papers/proceedings18/2159-2018.pdf.\nPintilie M. (2006). Competing Risks: A Practical Perspective. Wiley.\nhttp://dx.doi.org/10.1002/9780470870709\nSjoberg D and Fei T. (2023). tidycmprsk: Competing Risks Estimation. https://github.com/MSKCC-Epi-Bio/tidycmprsk\nTherneau T. (2024). A Package for Survival Analysis in R. R package version 3.7-0, https://CRAN.R-project.org/package=survival."
    +    "objectID": "Comp/r-sas_friedman.html#comparison",
    +    "href": "Comp/r-sas_friedman.html#comparison",
    +    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    +    "section": "Comparison",
    +    "text": "Comparison\nThe Row Mean Scores Differ statistic of SAS result is compared with statistic of R result, together with p-value.\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\n\n\n\n\nFriedman Test\nYes\n\n\n\n\n\nYes\nYes"
       },
       {
    -    "objectID": "R/ancova.html",
    -    "href": "R/ancova.html",
    -    "title": "Ancova",
    -    "section": "",
    -    "text": "In this example, we’re looking at Analysis of Covariance. ANCOVA is typically used to analyse treatment differences, to see examples of prediction models go to the simple linear regression page."
    +    "objectID": "Comp/r-sas_friedman.html#comparison-results-from-more-data",
    +    "href": "Comp/r-sas_friedman.html#comparison-results-from-more-data",
    +    "title": "R vs SAS Non-parametric Analysis - Friedman test",
    +    "section": "Comparison Results from more data",
    +    "text": "Comparison Results from more data\nFriedman’s chi-suqare approximation varies when the number of blocks or the number of groups in the randomized block design differs. Similar comparison is done when number of block subjid ranges from 4 to 20 and number of group time_point ranges from 2 to 6. All results yield exact match (Comparison criterion is set to the tenth decimal place)."
       },
       {
    -    "objectID": "R/ancova.html#introduction",
    -    "href": "R/ancova.html#introduction",
    -    "title": "Ancova",
    +    "objectID": "Comp/r-sas_ttest_Paired.html",
    +    "href": "Comp/r-sas_ttest_Paired.html",
    +    "title": "R vs SAS Paired T-Test",
         "section": "",
    -    "text": "In this example, we’re looking at Analysis of Covariance. ANCOVA is typically used to analyse treatment differences, to see examples of prediction models go to the simple linear regression page."
    +    "text": "The following table shows the types of Paired t-test analysis, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nPaired t-test, normal data\nYes\nYes\nYes\nIn Base R, use paired = TRUE on t.test() function\n\n\nPaired t-test, lognormal data\nMaybe\nYes\nNA\nMay be supported by envstats package\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n11\n11\n11\nYes\n\n\n\nt value\n-1.089648\n-1.089648\n-1.089648\nYes\n\n\n\np value\n0.2992\n0.2992\n0.2992\nYes\n\n\n\n\n\n\n\nSince there is currently no known support for lognormal t-test in R, this comparison is not applicable."
       },
       {
    -    "objectID": "R/ancova.html#data-summary",
    -    "href": "R/ancova.html#data-summary",
    -    "title": "Ancova",
    -    "section": "Data Summary",
    -    "text": "Data Summary\n\ndf_sas %>% glimpse()\n\nRows: 30\nColumns: 3\n$ drug <fct> A, A, A, A, A, A, A, A, A, A, D, D, D, D, D, D, D, D, D, D, F, F,…\n$ pre  <dbl> 11, 8, 5, 14, 19, 6, 10, 6, 11, 3, 6, 6, 7, 8, 18, 8, 19, 8, 5, 1…\n$ post <dbl> 6, 0, 2, 8, 11, 4, 13, 1, 8, 0, 0, 2, 3, 1, 18, 4, 14, 9, 1, 9, 1…\n\ndf_sas %>% summary()\n\n drug        pre             post      \n A:10   Min.   : 3.00   Min.   : 0.00  \n D:10   1st Qu.: 7.00   1st Qu.: 2.00  \n F:10   Median :10.50   Median : 7.00  \n        Mean   :10.73   Mean   : 7.90  \n        3rd Qu.:13.75   3rd Qu.:12.75  \n        Max.   :21.00   Max.   :23.00"
    +    "objectID": "Comp/r-sas_ttest_Paired.html#comparison-results",
    +    "href": "Comp/r-sas_ttest_Paired.html#comparison-results",
    +    "title": "R vs SAS Paired T-Test",
    +    "section": "",
    +    "text": "Here is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n11\n11\n11\nYes\n\n\n\nt value\n-1.089648\n-1.089648\n-1.089648\nYes\n\n\n\np value\n0.2992\n0.2992\n0.2992\nYes\n\n\n\n\n\n\n\nSince there is currently no known support for lognormal t-test in R, this comparison is not applicable."
       },
       {
    -    "objectID": "R/ancova.html#the-model",
    -    "href": "R/ancova.html#the-model",
    -    "title": "Ancova",
    -    "section": "The Model",
    -    "text": "The Model\n\nmodel_ancova <- lm(post ~ drug + pre, data = df_sas)\nmodel_glance <- model_ancova %>% glance()\nmodel_tidy   <- model_ancova %>% tidy()\nmodel_glance %>% gt()\n\n\n\n\n\n\n\nr.squared\nadj.r.squared\nsigma\nstatistic\np.value\ndf\nlogLik\nAIC\nBIC\ndeviance\ndf.residual\nnobs\n\n\n\n\n0.6762609\n0.6389064\n4.005778\n18.10386\n1.501369e-06\n3\n-82.05377\n174.1075\n181.1135\n417.2026\n26\n30\n\n\n\n\n\n\nmodel_tidy   %>% gt()\n\n\n\n\n\n\n\nterm\nestimate\nstd.error\nstatistic\np.value\n\n\n\n\n(Intercept)\n-3.8808094\n1.9862017\n-1.9538849\n6.155192e-02\n\n\ndrugD\n0.1089713\n1.7951351\n0.0607037\n9.520594e-01\n\n\ndrugF\n3.4461383\n1.8867806\n1.8264647\n7.928458e-02\n\n\npre\n0.9871838\n0.1644976\n6.0012061\n2.454330e-06\n\n\n\n\n\n\n\n\nmodel_table <- \n  model_ancova %>% \n  anova() %>% \n  tidy() %>% \n  add_row(term = \"Total\", df = sum(.$df), sumsq = sum(.$sumsq))\nmodel_table %>% gt()\n\n\n\n\n\n\n\nterm\ndf\nsumsq\nmeansq\nstatistic\np.value\n\n\n\n\ndrug\n2\n293.6000\n146.80000\n9.148553\n9.812371e-04\n\n\npre\n1\n577.8974\n577.89740\n36.014475\n2.454330e-06\n\n\nResiduals\n26\n417.2026\n16.04625\nNA\nNA\n\n\nTotal\n29\n1288.7000\nNA\nNA\nNA\n\n\n\n\n\n\n\n\nType 1\n\ndf_sas %>%\n  anova_test(post ~ drug + pre, type = 1, detailed = TRUE) %>% \n  get_anova_table() %>%\n  gt()\n\n\n\n\n\n\n\nEffect\nDFn\nDFd\nSSn\nSSd\nF\np\np<.05\nges\n\n\n\n\ndrug\n2\n26\n293.600\n417.203\n9.149\n9.81e-04\n*\n0.413\n\n\npre\n1\n26\n577.897\n417.203\n36.014\n2.45e-06\n*\n0.581\n\n\n\n\n\n\n\n\n\nType 2\n\ndf_sas %>% \n  anova_test(post ~ drug + pre, type = 2, detailed = TRUE) %>% \n  get_anova_table() %>% \n  gt()\n\n\n\n\n\n\n\nEffect\nSSn\nSSd\nDFn\nDFd\nF\np\np<.05\nges\n\n\n\n\ndrug\n68.554\n417.203\n2\n26\n2.136\n1.38e-01\n\n0.141\n\n\npre\n577.897\n417.203\n1\n26\n36.014\n2.45e-06\n*\n0.581\n\n\n\n\n\n\n\n\n\nType 3\n\ndf_sas %>%\n  anova_test(post ~ drug + pre, type = 3, detailed = TRUE) %>% \n  get_anova_table() %>% \n  gt()\n\n\n\n\n\n\n\nEffect\nSSn\nSSd\nDFn\nDFd\nF\np\np<.05\nges\n\n\n\n\n(Intercept)\n31.929\n417.203\n1\n26\n1.990\n1.70e-01\n\n0.071\n\n\ndrug\n68.554\n417.203\n2\n26\n2.136\n1.38e-01\n\n0.141\n\n\npre\n577.897\n417.203\n1\n26\n36.014\n2.45e-06\n*\n0.581\n\n\n\n\n\n\n\n\n\nLS Means\n\nmodel_ancova %>% emmeans::lsmeans(\"drug\") %>% emmeans::pwpm(pvals = TRUE, means = TRUE) \n\n        A       D       F\nA [ 6.71]  0.9980  0.1809\nD  -0.109 [ 6.82]  0.1893\nF  -3.446  -3.337 [10.16]\n\nRow and column labels: drug\nUpper triangle: P values   adjust = \"tukey\"\nDiagonal: [Estimates] (lsmean) \nLower triangle: Comparisons (estimate)   earlier vs. later\n\nmodel_ancova %>% emmeans::lsmeans(\"drug\") %>% plot(comparisons = TRUE)"
    +    "objectID": "Comp/r-sas_mcnemar.html",
    +    "href": "Comp/r-sas_mcnemar.html",
    +    "title": "R v SAS McNemar’s test",
    +    "section": "",
    +    "text": "McNemar’s test; R and SAS\nIn R, the mcNemar function from the epibasix package can be used to perform McNemar’s test.\n\nX<-table(colds$age12,colds$age14)\nsummary(mcNemar(X))\n\nThe FREQ procedure can be used in SAS with the AGREE option to run the McNemar test, with OR, and RISKDIFF options stated for production of odds ratios and risk difference. These options were added as epibasix::mcNemar outputs the odds ratio and risk difference with confidence limits as default. In contrast to R, SAS outputs the Kappa coefficients with confident limits as default.\n\nproc freq data=colds;\n    tables age12*age14 / agree or riskdiff;\nrun;\n\nWhen calculating the odds ratio and risk difference confidence limits, SAS is not treating the data as matched-pairs. There is advice on the SAS blog and SAS support page to amend this, which requires a lot of additional coding.\nR is using Edward’s continuity correction with no option to remove this. In contrast, there is no option to include Edward’s continuity correction in SAS, but this can be manually coded to agree with R. However, its use is controversial due to being seen as overly conservative.\nR’s use of the continuity correction is consistent with other functions within the epibasix package, which was categorised as ‘High Risk’ by the Risk Assessment Shiny App created by the R Validation Hub. Risk is quantified by the app through a number of metrics relating to maintenance and community usage. It was found that the author is no longer maintaining the package and there was no documentation available for certain methods used. Therefore, the use of the epibasix package is advised against and other packages may be more suitable.\nThe mcnemar.test function in the stats package provides the option to remove continuity corrections which results in a match with SAS. This function does not output any other coefficients for agreement/difference in proportions etc. but (if required) these can be achieved within other functions and/or packages.\n\nmcnemar.test(X, correct = FALSE)"
       },
       {
    -    "objectID": "R/ancova.html#saslm-package",
    -    "href": "R/ancova.html#saslm-package",
    -    "title": "Ancova",
    -    "section": "sasLM Package",
    -    "text": "sasLM Package\nThe following code performs an ANCOVA analysis using the sasLM package. This package was written specifically to replicate SAS statistics. The console output is also organized in a manner that is similar to SAS.\n\nlibrary(sasLM)\n\nsasLM::GLM(post ~ drug + pre, df_sas, BETA = TRUE, EMEAN = TRUE)\n\n$ANOVA\nResponse : post\n                Df Sum Sq Mean Sq F value    Pr(>F)    \nMODEL            3  871.5 290.499  18.104 1.501e-06 ***\nRESIDUALS       26  417.2  16.046                      \nCORRECTED TOTAL 29 1288.7                              \n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$Fitness\n Root MSE post Mean Coef Var  R-square  Adj R-sq\n 4.005778       7.9 50.70604 0.6762609 0.6389064\n\n$`Type I`\n     Df Sum Sq Mean Sq F value    Pr(>F)    \ndrug  2  293.6   146.8  9.1486 0.0009812 ***\npre   1  577.9   577.9 36.0145 2.454e-06 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$`Type II`\n     Df Sum Sq Mean Sq F value    Pr(>F)    \ndrug  2  68.55   34.28  2.1361    0.1384    \npre   1 577.90  577.90 36.0145 2.454e-06 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$`Type III`\n     Df Sum Sq Mean Sq F value    Pr(>F)    \ndrug  2  68.55   34.28  2.1361    0.1384    \npre   1 577.90  577.90 36.0145 2.454e-06 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$Parameter\n            Estimate Estimable Std. Error Df t value  Pr(>|t|)    \n(Intercept)  -0.4347         0     2.4714 26 -0.1759   0.86175    \ndrugA        -3.4461         0     1.8868 26 -1.8265   0.07928 .  \ndrugD        -3.3372         0     1.8539 26 -1.8001   0.08346 .  \ndrugF         0.0000         0     0.0000 26                      \npre           0.9872         1     0.1645 26  6.0012 2.454e-06 ***\n---\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n\n$`Expected Mean`\n               LSmean  LowerCL   UpperCL        SE Df\n(Intercept)  7.900000 6.396685  9.403315 0.7313516 26\ndrugA        6.714963 4.066426  9.363501 1.2884943 26\ndrugD        6.823935 4.208337  9.439532 1.2724690 26\ndrugF       10.161102 7.456182 12.866021 1.3159234 26\npre          7.900000 6.396685  9.403315 0.7313516 26\n\n\nNote that the LSMEANS statistics are produced using the EMEAN = TRUE option. The BETA = TRUE option is equivalent to the SOLUTION option in SAS. See the sasLM documentation for additional information."
    +    "objectID": "Comp/r-sas_ttest_2Sample.html",
    +    "href": "Comp/r-sas_ttest_2Sample.html",
    +    "title": "R vs SAS Two Sample T-Test",
    +    "section": "",
    +    "text": "The following table shows the types of Two Sample t-test analysis, the capabilities of each language, and whether or not the results from each language match.\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nTwo sample Student’s t-test\nYes\nYes\nYes\nIn Base R, use t.test() function with paired = FALSE and var.equal = TRUE\n\n\nTwo sample Welch’s t-test\nYes\nYes\nYes\nIn Base R, use t.test() function with paired = FALSE and var.equal = FALSE\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n30\n30\n30\nYes\n\n\n\nt value\n-0.6969002\n-0.6969002\n-0.6969002\nYes\n\n\n\np value\n0.4912306\n0.4912306\n0.4912306\nYes\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n29.69359\n29.69359\n29.69359\nYes\n\n\n\nt value\n-0.6969002\n-0.6969002\n-0.6969002\nYes\n\n\n\np value\n0.4912856\n0.4912856\n0.4912856\nYes"
       },
       {
    -    "objectID": "R/anova.html",
    -    "href": "R/anova.html",
    -    "title": "ANOVA",
    +    "objectID": "Comp/r-sas_ttest_2Sample.html#comparison-results",
    +    "href": "Comp/r-sas_ttest_2Sample.html#comparison-results",
    +    "title": "R vs SAS Two Sample T-Test",
         "section": "",
    -    "text": "Getting Started\nTo demonstrate the various types of sums of squares, we’ll create a data frame called df_disease taken from the SAS documentation. The corresponding data can be found here.\n\n\nThe Model\nFor this example, we’re testing for a significant difference in stem_length using ANOVA. In R, we’re using lm() to run the ANOVA, and then using broom::glance() and broom::tidy() to view the results in a table format.\n\nlm_model <- lm(y ~ drug + disease + drug*disease, df_disease)\n\nThe glance function gives us a summary of the model diagnostic values.\n\nlm_model %>% \n  glance() %>% \n  pivot_longer(everything())\n\n# A tibble: 12 × 2\n   name               value\n   <chr>              <dbl>\n 1 r.squared        0.456  \n 2 adj.r.squared    0.326  \n 3 sigma           10.5    \n 4 statistic        3.51   \n 5 p.value          0.00130\n 6 df              11      \n 7 logLik        -212.     \n 8 AIC            450.     \n 9 BIC            477.     \n10 deviance      5081.     \n11 df.residual     46      \n12 nobs            58      \n\n\nThe tidy function gives a summary of the model results.\n\nlm_model %>% tidy()\n\n# A tibble: 12 × 5\n   term           estimate std.error statistic      p.value\n   <chr>             <dbl>     <dbl>     <dbl>        <dbl>\n 1 (Intercept)      29.3        4.29    6.84   0.0000000160\n 2 drug2            -1.33       6.36   -0.210  0.835       \n 3 drug3           -13          7.43   -1.75   0.0869      \n 4 drug4           -15.7        6.36   -2.47   0.0172      \n 5 disease2         -1.08       6.78   -0.160  0.874       \n 6 disease3         -8.93       6.36   -1.40   0.167       \n 7 drug2:disease2    6.58       9.78    0.673  0.504       \n 8 drug3:disease2  -10.9       10.2    -1.06   0.295       \n 9 drug4:disease2    0.317      9.30    0.0340 0.973       \n10 drug2:disease3   -0.900      9.00   -0.100  0.921       \n11 drug3:disease3    1.10      10.2     0.107  0.915       \n12 drug4:disease3    9.53       9.20    1.04   0.306       \n\n\n\n\nThe Results\nYou’ll see that R print the individual results for each level of the drug and disease interaction. We can get the combined F table in R using the anova() function on the model object.\n\nlm_model %>% \n  anova() %>% \n  tidy() %>% \n  kable()\n\n\n\n\nterm\ndf\nsumsq\nmeansq\nstatistic\np.value\n\n\n\n\ndrug\n3\n3133.2385\n1044.4128\n9.455761\n0.0000558\n\n\ndisease\n2\n418.8337\n209.4169\n1.895990\n0.1617201\n\n\ndrug:disease\n6\n707.2663\n117.8777\n1.067225\n0.3958458\n\n\nResiduals\n46\n5080.8167\n110.4525\nNA\nNA\n\n\n\n\n\nWe can add a Total row, by using add_row and calculating the sum of the degrees of freedom and sum of squares.\n\nlm_model %>%\n  anova() %>%\n  tidy() %>%\n  add_row(term = \"Total\", df = sum(.$df), sumsq = sum(.$sumsq)) %>% \n  kable()\n\n\n\n\nterm\ndf\nsumsq\nmeansq\nstatistic\np.value\n\n\n\n\ndrug\n3\n3133.2385\n1044.4128\n9.455761\n0.0000558\n\n\ndisease\n2\n418.8337\n209.4169\n1.895990\n0.1617201\n\n\ndrug:disease\n6\n707.2663\n117.8777\n1.067225\n0.3958458\n\n\nResiduals\n46\n5080.8167\n110.4525\nNA\nNA\n\n\nTotal\n57\n9340.1552\nNA\nNA\nNA\n\n\n\n\n\n\n\nSums of Squares Tables\nUnfortunately, it is not easy to get the various types of sums of squares calculations in using functions from base R. However, the rstatix package offers a solution to produce these various sums of squares tables. For each type, you supply the original dataset and model to the. anova_test function, then specify the ttype and se detailed = TRUE.\n\nType I\n\ndf_disease %>% \n  rstatix::anova_test(\n    y ~ drug + disease + drug*disease, \n    type = 1, \n    detailed = TRUE) %>% \n  rstatix::get_anova_table() %>% \n  kable()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEffect\nDFn\nDFd\nSSn\nSSd\nF\np\np<.05\nges\n\n\n\n\ndrug\n3\n46\n3133.239\n5080.817\n9.456\n5.58e-05\n*\n0.381\n\n\ndisease\n2\n46\n418.834\n5080.817\n1.896\n1.62e-01\n\n0.076\n\n\ndrug:disease\n6\n46\n707.266\n5080.817\n1.067\n3.96e-01\n\n0.122\n\n\n\n\n\n\n\nType II\n\ndf_disease %>% \n  rstatix::anova_test(\n    y ~ drug + disease + drug*disease, \n    type = 2, \n    detailed = TRUE) %>% \n  rstatix::get_anova_table() %>% \n  kable()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEffect\nSSn\nSSd\nDFn\nDFd\nF\np\np<.05\nges\n\n\n\n\ndrug\n3063.433\n5080.817\n3\n46\n9.245\n6.75e-05\n*\n0.376\n\n\ndisease\n418.834\n5080.817\n2\n46\n1.896\n1.62e-01\n\n0.076\n\n\ndrug:disease\n707.266\n5080.817\n6\n46\n1.067\n3.96e-01\n\n0.122\n\n\n\n\n\n\n\nType III\n\ndf_disease %>% \n  rstatix::anova_test(\n    y ~ drug + disease + drug*disease, \n    type = 3, \n    detailed = TRUE) %>% \n  rstatix::get_anova_table() %>% \n  kable()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEffect\nSSn\nSSd\nDFn\nDFd\nF\np\np<.05\nges\n\n\n\n\n(Intercept)\n20037.613\n5080.817\n1\n46\n181.414\n0.00e+00\n*\n0.798\n\n\ndrug\n2997.472\n5080.817\n3\n46\n9.046\n8.09e-05\n*\n0.371\n\n\ndisease\n415.873\n5080.817\n2\n46\n1.883\n1.64e-01\n\n0.076\n\n\ndrug:disease\n707.266\n5080.817\n6\n46\n1.067\n3.96e-01\n\n0.122\n\n\n\n\n\n\n\nType IV\nIn R there is no equivalent operation to the Type IV sums of squares calculation in SAS."
    +    "text": "Here is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n30\n30\n30\nYes\n\n\n\nt value\n-0.6969002\n-0.6969002\n-0.6969002\nYes\n\n\n\np value\n0.4912306\n0.4912306\n0.4912306\nYes\n\n\n\n\n\n\n\nHere is a table of comparison values between t.test(), proc_ttest(), and SAS PROC TTEST:\n\n\n\n\n\n\n\n\n\n\n\nStatistic\nt.test()\nproc_ttest()\nPROC TTEST\nMatch\nNotes\n\n\n\n\nDegrees of Freedom\n29.69359\n29.69359\n29.69359\nYes\n\n\n\nt value\n-0.6969002\n-0.6969002\n-0.6969002\nYes\n\n\n\np value\n0.4912856\n0.4912856\n0.4912856\nYes"
       },
       {
    -    "objectID": "R/summary_skew_kurt.html",
    -    "href": "R/summary_skew_kurt.html",
    -    "title": "Skewness/Kurtosis",
    +    "objectID": "Comp/r-sas_cmh.html",
    +    "href": "Comp/r-sas_cmh.html",
    +    "title": "R vs SAS CMH",
         "section": "",
    -    "text": "Skewness measures the the amount of asymmetry in a distribution, while Kurtosis describes the “tailedness” of the curve. These measures are frequently used to assess the normality of the data. There are several methods to calculate these measures. In R, there are at least four different packages that contain functions for Skewness and Kurtosis. This write-up will examine the following packages: e1071, moments, procs, and sasLM.\n\n\nThe following data was used in this example.\n\n# Create sample data\ndat <- tibble::tribble(\n  ~team, ~points, ~assists,\n  \"A\", 10, 2,\n  \"A\", 17, 5,\n  \"A\", 17, 6,\n  \"A\", 18, 3,\n  \"A\", 15, 0,\n  \"B\", 10, 2,\n  \"B\", 14, 5,\n  \"B\", 13, 4,\n  \"B\", 29, 0,\n  \"B\", 25, 2,\n  \"C\", 12, 1,\n  \"C\", 30, 1,\n  \"C\", 34, 3,\n  \"C\", 12, 4,\n  \"C\", 11, 7 \n)\n\n\n\n\nBase R and the stats package have no native functions for Skewness and Kurtosis. It is therefore necessary to use a packaged function to calculate these statistics. The packages examined use three different methods of calculating Skewness, and four different methods for calculating Kurtosis. Of the available packages, the functions in the e1071 package provide the most flexibility, and have options for three of the different methodologies.\n\n\nThe e1071 package contains miscellaneous statistical functions from the Probability Theory Group at the Vienna University of Technology. The package includes functions for both Skewness and Kurtosis, and each function has a “type” parameter to specify the method. There are three available methods for Skewness, and three methods for Kurtosis. A portion of the documentation for these functions is included below:\n\n\nThe documentation for the skewness() function describes three types of skewness calculations: Joanes and Gill (1998) discusses three methods for estimating skewness:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_1 = m_1/m_2^{3/2}\\]\n\nType 2: Used in SAS and SPSS\n\\[\nG_1 = g_1\\sqrt{n(n-1)}/(n-2)\n\\]\nType 3: Used in MINITAB and BMDP\n\\[\nb_1 = m_3/s^3 = g_1((n-1)/n)^{3/2}\n\\]\n\nAll three skewness measures are unbiased under normality. The three methods are illustrated in the following code:\n\ntype1 <- e1071::skewness(dat$points, type = 1)\nstringr::str_glue(\"Skewness - Type 1: {type1}\")\n\nSkewness - Type 1: 0.905444204379853\n\ntype2 <- e1071::skewness(dat$points, type = 2)\nstringr::str_glue(\"Skewness - Type 2: {type2}\")\n\nSkewness - Type 2: 1.00931792987094\n\ntype3 <- e1071::skewness(dat$points, type = 3)\nstringr::str_glue(\"Skewness - Type 3: {type3}\")\n\nSkewness - Type 3: 0.816426058828937\n\n\nThe default for the e1071 skewness() function is Type 3.\n\n\n\nThe documentation for the kurtosis() function describes three types of kurtosis calculations: Joanes and Gill (1998) discuss three methods for estimating kurtosis:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_2 = m_4/m_2^{2}-3\\]\n\nType 2: Used in SAS and SPSS\n\\[G_2 = ((n+1)g_2+6)*\\frac{(n-1)}{(n-2)(n-3)}\\]\nType 3: Used in MINITAB and BMDP\n\\[b_2 = m_4/s^4-3 = (g_2 + 3)(1-1/n)^2-3\\]\n\nOnly \\(G_2\\) (corresponding to type 2) is unbiased under normality. The three methods are illustrated in the following code:\n\n  # Kurtosis - Type 1\ntype1 <- e1071::kurtosis(dat$points, type = 1)\nstringr::str_glue(\"Kurtosis - Type 1: {type1}\")\n\nKurtosis - Type 1: -0.583341077124784\n\n# Kurtosis - Type 2\ntype2 <- e1071::kurtosis(dat$points, type = 2)\nstringr::str_glue(\"Kurtosis - Type 2: {type2}\")\n\nKurtosis - Type 2: -0.299156418435587\n\n# Kurtosis - Type 3\ntype3 <- e1071::kurtosis(dat$points, type = 3)\nstringr::str_glue(\"Kurtosis - Type 3: {type3}\")\n\nKurtosis - Type 3: -0.894821560517589\n\n\nThe default for the e1071 kurtosis() function is Type 3.\n\n\n\n\nThe moments package is a well-known package with a variety of statistical functions. The package contains functions for both Skewness and Kurtosis. But these functions provide no “type” option. The skewness() function in the moments package corresponds to Type 1 above. The kurtosis() function uses a Pearson’s measure of Kurtosis, which corresponds to none of the three types in the e1071 package.\n\n  library(moments)\n\n  # Skewness - Type 1\n  moments::skewness(dat$points)\n\n[1] 0.9054442\n\n  # [1] 0.9054442\n  \n  # Kurtosis - Pearson's measure\n  moments::kurtosis(dat$points)\n\n[1] 2.416659\n\n  # [1] 2.416659\n\nNote that neither of the functions from the moments package match SAS.\n\n\n\nThe procs package proc_means() function was written specifically to match SAS, and produces a Type 2 Skewness and Type 2 Kurtosis. This package also produces a data frame output, instead of a scalar value.\n\n  library(procs)\n\n  # Skewness and Kurtosis - Type 2 \n  proc_means(dat, var = points,\n             stats = v(skew, kurt))\n\n# A tibble: 1 × 5\n   TYPE  FREQ VAR     SKEW   KURT\n  <dbl> <int> <chr>  <dbl>  <dbl>\n1     0    15 points  1.01 -0.299\n\n\nViewer Output:\n\n\n\n\n\n\n\n\n\n\n\n\nThe sasLM package was also written specifically to match SAS. The Skewness() function produces a Type 2 Skewness, and the Kurtosis() function a Type 2 Kurtosis.\n\n  library(sasLM)\n\n  # Skewness - Type 2\n  Skewness(dat$points)\n\n[1] 1.009318\n\n  # [1] 1.009318\n  \n  # Kurtosis - Type 2\n  Kurtosis(dat$points)\n\n[1] -0.2991564\n\n  # [1] -0.2991564"
    +    "text": "The CMH procedure tests for conditional independence in partial contingency tables for a 2 x 2 x K design. However, it can be generalized to tables of X x Y x K dimensions.\n\n\n\n\n\n\n\n\n\n\n\nFor the remainder of this document, we adopt the following naming convention when referring to variables of a contingency table:\n\nX = exposure\nY = response\nK = control\n\n\n\n\nThe scale of the exposure (X) and response (Y) variables dictate which test statistic is computed for the contingency table. Each test statistic is evaluated on different degrees of freedom (df):\n\nGeneral association statistic (X and Y both nominal) results in (X-1) * (Y-1) dfs\nRow mean scores statistic (X is nominal and Y is ordinal) results in X-1 dfs\nNonzero correlation statistic (X and Y both ordinal) results in 1 df"
       },
       {
    -    "objectID": "R/summary_skew_kurt.html#data-used",
    -    "href": "R/summary_skew_kurt.html#data-used",
    -    "title": "Skewness/Kurtosis",
    +    "objectID": "Comp/r-sas_cmh.html#naming-convention",
    +    "href": "Comp/r-sas_cmh.html#naming-convention",
    +    "title": "R vs SAS CMH",
         "section": "",
    -    "text": "The following data was used in this example.\n\n# Create sample data\ndat <- tibble::tribble(\n  ~team, ~points, ~assists,\n  \"A\", 10, 2,\n  \"A\", 17, 5,\n  \"A\", 17, 6,\n  \"A\", 18, 3,\n  \"A\", 15, 0,\n  \"B\", 10, 2,\n  \"B\", 14, 5,\n  \"B\", 13, 4,\n  \"B\", 29, 0,\n  \"B\", 25, 2,\n  \"C\", 12, 1,\n  \"C\", 30, 1,\n  \"C\", 34, 3,\n  \"C\", 12, 4,\n  \"C\", 11, 7 \n)"
    +    "text": "For the remainder of this document, we adopt the following naming convention when referring to variables of a contingency table:\n\nX = exposure\nY = response\nK = control"
       },
       {
    -    "objectID": "R/summary_skew_kurt.html#package-examination",
    -    "href": "R/summary_skew_kurt.html#package-examination",
    -    "title": "Skewness/Kurtosis",
    +    "objectID": "Comp/r-sas_cmh.html#scale",
    +    "href": "Comp/r-sas_cmh.html#scale",
    +    "title": "R vs SAS CMH",
         "section": "",
    -    "text": "Base R and the stats package have no native functions for Skewness and Kurtosis. It is therefore necessary to use a packaged function to calculate these statistics. The packages examined use three different methods of calculating Skewness, and four different methods for calculating Kurtosis. Of the available packages, the functions in the e1071 package provide the most flexibility, and have options for three of the different methodologies.\n\n\nThe e1071 package contains miscellaneous statistical functions from the Probability Theory Group at the Vienna University of Technology. The package includes functions for both Skewness and Kurtosis, and each function has a “type” parameter to specify the method. There are three available methods for Skewness, and three methods for Kurtosis. A portion of the documentation for these functions is included below:\n\n\nThe documentation for the skewness() function describes three types of skewness calculations: Joanes and Gill (1998) discusses three methods for estimating skewness:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_1 = m_1/m_2^{3/2}\\]\n\nType 2: Used in SAS and SPSS\n\\[\nG_1 = g_1\\sqrt{n(n-1)}/(n-2)\n\\]\nType 3: Used in MINITAB and BMDP\n\\[\nb_1 = m_3/s^3 = g_1((n-1)/n)^{3/2}\n\\]\n\nAll three skewness measures are unbiased under normality. The three methods are illustrated in the following code:\n\ntype1 <- e1071::skewness(dat$points, type = 1)\nstringr::str_glue(\"Skewness - Type 1: {type1}\")\n\nSkewness - Type 1: 0.905444204379853\n\ntype2 <- e1071::skewness(dat$points, type = 2)\nstringr::str_glue(\"Skewness - Type 2: {type2}\")\n\nSkewness - Type 2: 1.00931792987094\n\ntype3 <- e1071::skewness(dat$points, type = 3)\nstringr::str_glue(\"Skewness - Type 3: {type3}\")\n\nSkewness - Type 3: 0.816426058828937\n\n\nThe default for the e1071 skewness() function is Type 3.\n\n\n\nThe documentation for the kurtosis() function describes three types of kurtosis calculations: Joanes and Gill (1998) discuss three methods for estimating kurtosis:\n\nType 1: This is the typical definition used in many older textbooks\n\n\\[g_2 = m_4/m_2^{2}-3\\]\n\nType 2: Used in SAS and SPSS\n\\[G_2 = ((n+1)g_2+6)*\\frac{(n-1)}{(n-2)(n-3)}\\]\nType 3: Used in MINITAB and BMDP\n\\[b_2 = m_4/s^4-3 = (g_2 + 3)(1-1/n)^2-3\\]\n\nOnly \\(G_2\\) (corresponding to type 2) is unbiased under normality. The three methods are illustrated in the following code:\n\n  # Kurtosis - Type 1\ntype1 <- e1071::kurtosis(dat$points, type = 1)\nstringr::str_glue(\"Kurtosis - Type 1: {type1}\")\n\nKurtosis - Type 1: -0.583341077124784\n\n# Kurtosis - Type 2\ntype2 <- e1071::kurtosis(dat$points, type = 2)\nstringr::str_glue(\"Kurtosis - Type 2: {type2}\")\n\nKurtosis - Type 2: -0.299156418435587\n\n# Kurtosis - Type 3\ntype3 <- e1071::kurtosis(dat$points, type = 3)\nstringr::str_glue(\"Kurtosis - Type 3: {type3}\")\n\nKurtosis - Type 3: -0.894821560517589\n\n\nThe default for the e1071 kurtosis() function is Type 3.\n\n\n\n\nThe moments package is a well-known package with a variety of statistical functions. The package contains functions for both Skewness and Kurtosis. But these functions provide no “type” option. The skewness() function in the moments package corresponds to Type 1 above. The kurtosis() function uses a Pearson’s measure of Kurtosis, which corresponds to none of the three types in the e1071 package.\n\n  library(moments)\n\n  # Skewness - Type 1\n  moments::skewness(dat$points)\n\n[1] 0.9054442\n\n  # [1] 0.9054442\n  \n  # Kurtosis - Pearson's measure\n  moments::kurtosis(dat$points)\n\n[1] 2.416659\n\n  # [1] 2.416659\n\nNote that neither of the functions from the moments package match SAS.\n\n\n\nThe procs package proc_means() function was written specifically to match SAS, and produces a Type 2 Skewness and Type 2 Kurtosis. This package also produces a data frame output, instead of a scalar value.\n\n  library(procs)\n\n  # Skewness and Kurtosis - Type 2 \n  proc_means(dat, var = points,\n             stats = v(skew, kurt))\n\n# A tibble: 1 × 5\n   TYPE  FREQ VAR     SKEW   KURT\n  <dbl> <int> <chr>  <dbl>  <dbl>\n1     0    15 points  1.01 -0.299\n\n\nViewer Output:\n\n\n\n\n\n\n\n\n\n\n\n\nThe sasLM package was also written specifically to match SAS. The Skewness() function produces a Type 2 Skewness, and the Kurtosis() function a Type 2 Kurtosis.\n\n  library(sasLM)\n\n  # Skewness - Type 2\n  Skewness(dat$points)\n\n[1] 1.009318\n\n  # [1] 1.009318\n  \n  # Kurtosis - Type 2\n  Kurtosis(dat$points)\n\n[1] -0.2991564\n\n  # [1] -0.2991564"
    +    "text": "The scale of the exposure (X) and response (Y) variables dictate which test statistic is computed for the contingency table. Each test statistic is evaluated on different degrees of freedom (df):\n\nGeneral association statistic (X and Y both nominal) results in (X-1) * (Y-1) dfs\nRow mean scores statistic (X is nominal and Y is ordinal) results in X-1 dfs\nNonzero correlation statistic (X and Y both ordinal) results in 1 df"
       },
       {
    -    "objectID": "blogs/index.html",
    -    "href": "blogs/index.html",
    -    "title": "Blogs",
    +    "objectID": "Comp/r-sas_cmh.html#data",
    +    "href": "Comp/r-sas_cmh.html#data",
    +    "title": "R vs SAS CMH",
    +    "section": "Data",
    +    "text": "Data\nTo begin investigating the differences in the SAS and R implementations of the CMH test, we decided to use the CDISC Pilot data set, which is publicly available on the PHUSE Test Data Factory repository. We applied very basic filtering conditions upfront (see below) and this data set served as the basis of the examples to follow.\n\n\n# A tibble: 6 × 36\n  STUDYID  SITEID SITEGR1 USUBJID TRTSDT     TRTEDT     TRTP  TRTPN   AGE AGEGR1\n  <chr>    <chr>  <chr>   <chr>   <date>     <date>     <chr> <dbl> <dbl> <chr> \n1 CDISCPI… 701    701     01-701… 2014-01-02 2014-07-02 Plac…     0    63 <65   \n2 CDISCPI… 701    701     01-701… 2012-08-05 2012-09-01 Plac…     0    64 <65   \n3 CDISCPI… 701    701     01-701… 2013-07-19 2014-01-14 Xano…    81    71 65-80 \n4 CDISCPI… 701    701     01-701… 2014-03-18 2014-03-31 Xano…    54    74 65-80 \n5 CDISCPI… 701    701     01-701… 2014-07-01 2014-12-30 Xano…    81    77 65-80 \n6 CDISCPI… 701    701     01-701… 2013-02-12 2013-03-09 Plac…     0    85 >80   \n# ℹ 26 more variables: AGEGR1N <dbl>, RACE <chr>, RACEN <dbl>, SEX <chr>,\n#   ITTFL <chr>, EFFFL <chr>, COMP24FL <chr>, AVISIT <chr>, AVISITN <dbl>,\n#   VISIT <chr>, VISITNUM <dbl>, ADY <dbl>, ADT <date>, PARAMCD <chr>,\n#   PARAM <chr>, PARAMN <dbl>, AVAL <dbl>, ANL01FL <chr>, DTYPE <chr>,\n#   AWRANGE <chr>, AWTARGET <dbl>, AWTDIFF <dbl>, AWLO <dbl>, AWHI <dbl>,\n#   AWU <chr>, QSSEQ <dbl>"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_cmh.html#schemes",
    +    "href": "Comp/r-sas_cmh.html#schemes",
    +    "title": "R vs SAS CMH",
    +    "section": "Schemes",
    +    "text": "Schemes\nIn order to follow a systematic approach to testing, and to cover variations in the CMH test, we considered the traditional 2 x 2 x K design as well as scenarios where the generalized CMH test is employed (e.g. 5 x 3 x 3).\nWe present 5 archetype test scenarios that illustrate diverging results, possibly related to sparse data and possibly considered edge cases.\n\n\n\n\n\n\n\n\n\n\nNumber\nSchema\nVariables\nRelevant Test\nDescription\n\n\n\n\n1\n2x2x2\nX = TRTP, Y = SEX, K = AGEGR1\nGeneral Association\nTRTP and AGEGR1 were limited to two categories, overall the the groups were rather balanced\n\n\n3\n2x2x3\nX = TRTP, Y = SEX, K = RACE\nGeneral Association\nGives back NaN in R because RACE is very imbalanced\n\n\n6\n2x5x2\nX = TRTP, Y = AVAL, K = SEX\nRow Means\nCompare Row Means results for R and SAS because Y is ordinal\n\n\n9\n3x5x17\nX = TRTP, Y = AVAL, K = SITEID\nRow Means\nSITEID has many strata and provokes sparse groups, AVAL is ordinal, therefore row means statistic applies here, R threw an error\n\n\n10\n5x3x3\nX = AVAL, Y = AGEGR1, K = TRTP\nCorrelation\nX and Y are ordinal variables and therefore the correlation statistics has to be taken here"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_cmh.html#cmh-statistics",
    +    "href": "Comp/r-sas_cmh.html#cmh-statistics",
    +    "title": "R vs SAS CMH",
    +    "section": "CMH Statistics",
    +    "text": "CMH Statistics\n\n\nLoading required package: vcd\n\n\nLoading required package: grid\n\n\nLoading required package: gnm\n\n\n\nAttaching package: 'vcdExtra'\n\n\nThe following object is masked from 'package:dplyr':\n\n    summarise\n\n\nscenarios this is a test\nAs it can be seen, there are two schemata where R does not provide any results:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nTest\n\nChi-Square\n\n\ndf\n\n\np-value\n\n\n\nSAS\nR\nSAS\nR\nSAS\nR\n\n\n\n\n1\nCorrelation\n0.01767040\n0.0008689711\n1\n1\n0.89424870\n0.9764831\n\n\nRow Means\n0.01767040\n2.4820278527\n1\n2\n0.89424870\n0.2890910\n\n\nGeneral Association\n0.01767040\n2.4820278527\n1\n2\n0.89424870\n0.2890910\n\n\n3*\nCorrelation\n0.00278713\nNaN\n1\n1\n0.95789662\nNaN\n\n\nRow Means\n2.38606985\nNaN\n2\n2\n0.30329938\nNaN\n\n\nGeneral Association\n2.38606985\nNaN\n2\n2\n0.30329938\nNaN\n\n\n6\nCorrelation\n1.14720000\n0.1115439738\n1\n1\n0.28410000\n0.7383931\n\n\nRow Means\n1.14720000\n2.6632420358\n1\n2\n0.28410000\n0.2640489\n\n\nGeneral Association\n2.56720000\n6.5238474681\n4\n8\n0.63260000\n0.5887637\n\n\n9†\nCorrelation\n0.08544312\nNA\n1\nNA\n0.77005225\nNA\n\n\nRow Means\n2.47631367\nNA\n2\nNA\n0.28991809\nNA\n\n\nGeneral Association\n7.03387844\nNA\n8\nNA\n0.53298189\nNA\n\n\n10\nCorrelation\n2.73816085\n0.8715295423\n1\n1\n0.09797747\n0.3505322\n\n\nRow Means\n4.40701092\n3.0445270087\n4\n4\n0.35371641\n0.5504018\n\n\nGeneral Association\n5.73053819\n5.7305381934\n8\n8\n0.67738613\n0.6773861\n\n\n\n* Reason for NaN in schema 3: Stratum k = AMERICAN INDIAN OR ALASKA NATIVE can not be compared because there are only values for one treatment and one gender.\n\n\n† Reason for Error 4: For large sparse table (many strata) CMHTest will occasionally throw an error in solve.default(AVA) because of singularity"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_survival_cif.html",
    +    "href": "Comp/r-sas_survival_cif.html",
    +    "title": "R vs SAS - Estimating Cumulative Incidence Functions",
         "section": "",
    -    "text": "Introduction Comparing Analysis Method Implementations in Software (CAMIS)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n2023: A Year of Progress for the PHUSE CAMIS Working Group Project\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPHUSE US connect 2024 Poster Presentation by Soma & Vikash\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nNo matching items"
    +    "text": "Comparison of R and SAS\nThe following table shows the options available in R and SAS for estimating cumulative incidence functions (CIFs) in a competing risk analysis, especially the capabilities and whether the results match.\n\n\n\n\n\n\n\n\n\nAnalysis\nSupported in R package tidycmprsk\nSupported in SAS PROC LIFETEST\nResults Match\n\n\n\n\nCIF estimates\nYes: with function cuminc()\nYes: with eventcode option in TIME statement\nYes\n\n\nGray’s test for equality across groups\nYes: default when the group variable (a factor) is on the right-hand side of the input formula\nYes: default with strata statement\nYes\n\n\nVariance estimates for the CIF estimates using Aalen (1978)\nYes: default\nYes (default)\nYes\n\n\nVariance estimates for the CIF estimates using the delta method\nNo\nYes: with option error=delta in PROC TEST statement\nN/A\n\n\nConfidence intervals for CIF estimates using log-log transformation\nYes: default\nYes: default\nYes\n\n\nConfidence intervals for CIF estimates using other transformations\nNo\nYes: with conftype option in LIFETEST statement\nN/A\n\n\nCIF estimates for specified time points\nYes: with times option when summarizing results, e.g., using tidy()\nYes: with timelist option in LIFETEST statement\nYes\n\n\nCIF plot by groups\nYes: with ggsurvfit::ggcumin()\nYes: with plots=cif option in LIFETEST statement\nN/A\n\n\n\nAdditional details for using tidycmprsk are given here and for SAS PROC LIFETEST here .\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 24.04.1 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-15\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n package    * version date (UTC) lib source\n cmprsk       2.2-12  2024-05-19 [1] RSPM (R 4.4.0)\n survival     3.7-0   2024-06-05 [1] RSPM (R 4.4.0)\n tidycmprsk   1.1.0   2024-08-17 [1] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n─ External software ──────────────────────────────────────────────────────────\n setting value\n SAS     9.04.01M7P080520\n\n──────────────────────────────────────────────────────────────────────────────\n\n\n\n\n\n\n\nReferences\nSAS PROC LIFETEST Documentation on CIF estimates\nR package ‘tidycmprsk’ Documentation"
       },
       {
    -    "objectID": "blogs/posts/202312_highlights_blog.html",
    -    "href": "blogs/posts/202312_highlights_blog.html",
    -    "title": "2023: A Year of Progress for the PHUSE CAMIS Working Group Project",
    +    "objectID": "Comp/r-sas_ci_for_prop.html",
    +    "href": "Comp/r-sas_ci_for_prop.html",
    +    "title": "R vs SAS Confidence Intervals for Proportions",
         "section": "",
    -    "text": "As we draw towards the end of 2023, the PHUSE DVOST CAMIS Working Group Project reflect on their key progress and successes this year.\nThe CAMIS repository went live in January 2023, drawing on the content from the CSRMLW Working Group. This searchable repository compares analysis method implementations in software (CAMIS) such as SAS, R and python.\nThe white paper, Key Considerations When Understanding Differences in Statistical Methodology Implementations Across Programming Languages – An Introduction to the CAMIS Project was published in June, which highlighted the importance of clearly specifying your analysis, such that it can be replicated in different software and doesn’t rely on default options, which can be different.\nFor more complex analyses, it can still be hard to understand what defaults and algorithms your software is using, so the team focused 2023 on expanding our github repo content, comparing SAS vs R methods. By August, we had covered the following topics in the repo: quartiles, rounding, ANOVA, MMRM, the CMH test, log-rank, Cox PH, the McNemar test, the Kruskal-Wallis test and logistic. October saw the launch of the CAMIS-Oncology sub-group, led by Somasekhar Sriadibhatla (AstraZeneca). This team will focus specifically on oncology endpoints and analysing them in SAS, R and Python.\nThe CAMIS team have expanded in membership this year and presented at conferences around the world. In November, we welcomed Harshal Khanolkar (Novo Nordisk) to join the leadership team alongside Christina Fillmore (GSK) and Lyn Taylor (Parexel). Our focus for 2024 will be on creating additional content for the repo and sharing awareness of the project across the medical research and wider community.\nWe would like to take this opportunity to thank all of our team members and contributors, and encourage everyone to check out the repository and help us grow our content. If you would like to join the team, please get in touch through the github repo."
    +    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (different subjects in each of the 2 groups), or can be matched (the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more technical derivation and reasons for use for each of the methods listed below, see the corresponding SAS page."
       },
       {
    -    "objectID": "templates/template.html",
    -    "href": "templates/template.html",
    -    "title": " ",
    +    "objectID": "Comp/r-sas_ci_for_prop.html#introduction",
    +    "href": "Comp/r-sas_ci_for_prop.html#introduction",
    +    "title": "R vs SAS Confidence Intervals for Proportions",
         "section": "",
    -    "text": "Italic words are note for you.\nYour choice to use part or all to fit your topic."
    +    "text": "There are several ways to calculate a confidence interval (CI) for a proportion. You need to select the method based on if you have a 1 sample proportion (1 proportion calculated from 1 group of subjects), or if you have 2 samples and you want a CI for the difference in the 2 proportions. The difference in proportion can come from either 2 independent samples (different subjects in each of the 2 groups), or can be matched (the same subject with 1 result in 1 group and 1 result in the other group [paired data]).\nThe method selected is also dependent on whether your proportion is close to 0 or 1 (or near to the 0.5 midpoint), and your sample size.\nFor more technical derivation and reasons for use for each of the methods listed below, see the corresponding SAS page."
       },
       {
    -    "objectID": "templates/template.html#data-used",
    -    "href": "templates/template.html#data-used",
    -    "title": " ",
    -    "section": "Data used",
    -    "text": "Data used\n\ndata ExData; \n    input Var1 $ Var2 ...; \n    datalines; \n[Data Lines]; \nrun; \n\n\nexData <- tibble::tribble( \n  ~Var1, ~Var2, \n  \"val1\", 1, \n  \"val2\", 2) \n\na sentence or two about the data. Consider using a package like {skimr} to help illustrate the data."
    +    "objectID": "Comp/r-sas_ci_for_prop.html#general-comparison-table-for-single-sample-proportions",
    +    "href": "Comp/r-sas_ci_for_prop.html#general-comparison-table-for-single-sample-proportions",
    +    "title": "R vs SAS Confidence Intervals for Proportions",
    +    "section": "General Comparison Table For Single Sample Proportions",
    +    "text": "General Comparison Table For Single Sample Proportions\nThe following table provides an overview of the results comparing between R and SAS for Single Sample Proportions and independent 2 sample proportions . See the corresponding SAS page and R page for results showing a single set of data run through both SAS and R.\n\n\n\n\n\n\n\n\n\nAnalysis of One Sample Proportion\nSupported in R\nSupported in SAS\nResults Match\n\n\n\n\nClopper-Pearson Exact\nYes {cardx}\nYes (default)\nYes\n\n\nNormal approximation (Wald Method)\nYes {cardx}\nYes (default)\nYes\n\n\nNormal approximation (Wald Method) with continuity correction\nYes {cardx}\nYes\nYes\n\n\nWilson (Score, Altman, Newcombe) method\nYes {cardx}\nYes\nYes\n\n\nWilson (Score, Altman, Newcombe) method with continuity correction\nYes {cardx}\nYes\nYes\n\n\nAgresti Coull\nYes {cardx}\nYes\nYes\n\n\nJeffreys Bayesian HPD\nYes {cardx}\nYes\nYes\n\n\nmidp\nYes {PropCIs}\nYes\nresults match to the 3rd decimal place\n\n\nBlaker\nYes {PropCIs}\nYes\nresults match to the 5th decimal place\n\n\nWilson Stratified score\nYes {cardx}\nNo\nNA"
       },
       {
    -    "objectID": "templates/template.html#example-code-using",
    -    "href": "templates/template.html#example-code-using",
    -    "title": " ",
    -    "section": "Example Code using ",
    -    "text": "Example Code using \nDescribe more details about the method.\nIf needed, add link to other web page/paper/SAS help methodology page, and list them in reference section.\nPrint key results as needed.\nAdd explanations about code and results as needed."
    +    "objectID": "Comp/r-sas_ci_for_prop.html#general-comparison-table-for-two-independent-samples-proportions",
    +    "href": "Comp/r-sas_ci_for_prop.html#general-comparison-table-for-two-independent-samples-proportions",
    +    "title": "R vs SAS Confidence Intervals for Proportions",
    +    "section": "General Comparison Table For Two Independent Samples Proportions",
    +    "text": "General Comparison Table For Two Independent Samples Proportions\n\n\n\n\n\n\n\n\n\nAnalysis of Two independant Sample Proportions\nSupported in R\nSupported in SAS\nResults Match\n\n\n\n\nNormal approximation (Wald Method)\nYes {cardx} ard_stats_prop_test function uses stats::prop.test\nYes (default)\nYes, but documentation for stats::prop.test says it’s using newcombe method so more research needed given results match wald method?\n\n\nNormal approximation (Wald Method) with continuity correction\nYes {cardx} ard_stats_prop_test function uses stats::prop.test\nYes\nUnknown.\n\n\nWilson (Score, Altman, Newcombe) method\nUnknown - more research needed\nYes\nSAS results match by hand calculation\n\n\nWilson (Score, Altman, Newcombe) method with continuity correction\nUnknown - more research needed\nYes\nSAS results match by hand calculation"
       },
       {
    -    "objectID": "templates/template.html#example-code-using-1",
    -    "href": "templates/template.html#example-code-using-1",
    -    "title": " ",
    -    "section": "Example Code using ",
    -    "text": "Example Code using \nAdd if there is more than one package"
    +    "objectID": "Comp/r-sas_ci_for_prop.html#prerequisites-r-packages",
    +    "href": "Comp/r-sas_ci_for_prop.html#prerequisites-r-packages",
    +    "title": "R vs SAS Confidence Intervals for Proportions",
    +    "section": "Prerequisites: R Packages",
    +    "text": "Prerequisites: R Packages\nSee the R page for more detail.\n\n# Example R packages required\nlibrary(cardx)"
       },
       {
    -    "objectID": "templates/template.html#comparison",
    -    "href": "templates/template.html#comparison",
    -    "title": " ",
    -    "section": "Comparison",
    -    "text": "Comparison\nIf you are comparing more than one package or between different languages, consider adding in a table to illustrate some of the differences. When comparing between languages it can be nice to have a table with links to the pages with deeper dive of each language for a given method method like this table from the ANCOVA page:\n\n\n\nAnalysis\nSupported in R\nSupported in SAS\nResults Match\nNotes\n\n\n\n\nANCOVA using general linear model and lsmeans\nYes\nYes\nYes\nGLM() function from sasLM with EMEANS=TRUE is the easiest to use and matches SAS\n\n\n\nBut, even if you are just comparing the difference in same language it can be helpful to have a table with values of interest across different packages. Using dynamic content you can add the values to a table without manually putting in each value.\nSAS result is very reliable in many cases."
    +    "objectID": "Comp/r-sas_rounding.html",
    +    "href": "Comp/r-sas_rounding.html",
    +    "title": "R v SAS rounding",
    +    "section": "",
    +    "text": "Rounding; R and SAS\nOn comparing the documentation of rounding rules for both languages, it will be noted that the default rounding rule (implemented in the respective language’s round() function) are different. Numerical differences arise in the knife-edge case where the number being rounded is equidistant between the two possible results. The round() function in SAS will round the number ‘away from zero’, meaning that 12.5 rounds to the integer 13. The round() function in Base R will round the number ‘to even’, meaning that 12.5 rounds to the integer 12. SAS does provide the rounde() function which rounds to even and the janitor package in R contains a function round_half_up() that rounds away from zero. In this use case, SAS produces a correct result from its round() function, based on its documentation, as does R. Both are right based on what they say they do, but they produce different results (Rimler, M.S. et al.).\nAs described in R - Rounding and SAS - Rounding, round() in SAS and round_half_up() in R are incorrect in rare different cases. It may need to be considered when comparing results between SAS and R.\nReferences\nRimler M.S., Rickert J., Jen M-H., Stackhouse M. Understanding differences in statistical methodology implementations across programming languages (2022, Fall). ASA Biopharmaceutical Report Issue 3, Volume 29.  Retrieved from https://higherlogicdownload.s3.amazonaws.com/AMSTAT/fa4dd52c-8429-41d0-abdf-0011047bfa19/UploadedImages/BIOP%20Report/BioPharm_fall2022FINAL.pdf"
       },
       {
    -    "objectID": "templates/template.html#conclusion",
    -    "href": "templates/template.html#conclusion",
    -    "title": " ",
    -    "section": "Conclusion",
    -    "text": "Conclusion\nadd a conclusion about which language(s) or package(s) are more recommended.\nThis section could have a feature like paper abstract, e.g. about the selection of package or SAS PROC."
    +    "objectID": "Comp/r-sas_mmrm.html",
    +    "href": "Comp/r-sas_mmrm.html",
    +    "title": "R vs SAS MMRM",
    +    "section": "",
    +    "text": "In this vignette we briefly compare the mmrm::mmrm, SAS’s PROC GLIMMIX, nlme::gls, lme4::lmer, and glmmTMB::glmmTMB functions for fitting mixed models for repeated measures (MMRMs). A primary difference in these implementations lies in the covariance structures that are supported “out of the box”. In particular, PROC GLIMMIX and mmrm are the only procedures which provide support for many of the most common MMRM covariance structures. Most covariance structures can be implemented in gls, though users are required to define them manually. lmer and glmmTMB are more limited. We find that mmmrm converges more quickly than other R implementations while also producing estimates that are virtually identical to PROC GLIMMIX’s."
       },
       {
    -    "objectID": "templates/template.html#reference",
    -    "href": "templates/template.html#reference",
    -    "title": " ",
    -    "section": "Reference",
    -    "text": "Reference\nCite all sources and references used in the analysis.\n\n\n\n\n\n\nSession Info\n\n\n\n\n\n\n\n─ Session info ───────────────────────────────────────────────────────────────\n setting  value\n version  R version 4.4.0 (2024-04-24)\n os       Ubuntu 22.04.5 LTS\n system   x86_64, linux-gnu\n ui       X11\n language (EN)\n collate  C.UTF-8\n ctype    C.UTF-8\n tz       UTC\n date     2024-10-10\n pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────\n ! package     * version date (UTC) lib source\n P cli           3.6.3   2024-06-21 [?] RSPM (R 4.4.0)\n P digest        0.6.37  2024-08-19 [?] RSPM (R 4.4.0)\n P evaluate      1.0.0   2024-09-17 [?] RSPM (R 4.4.0)\n P fansi         1.0.6   2023-12-08 [?] RSPM (R 4.4.0)\n P fastmap       1.2.0   2024-05-15 [?] RSPM (R 4.4.0)\n P glue          1.8.0   2024-09-30 [?] RSPM (R 4.4.0)\n P htmltools     0.5.8.1 2024-04-04 [?] RSPM (R 4.4.0)\n P htmlwidgets   1.6.4   2023-12-06 [?] RSPM (R 4.4.0)\n P jsonlite      1.8.9   2024-09-20 [?] RSPM (R 4.4.0)\n P knitr         1.48    2024-07-07 [?] RSPM (R 4.4.0)\n P lifecycle     1.0.4   2023-11-07 [?] RSPM (R 4.4.0)\n P magrittr      2.0.3   2022-03-30 [?] RSPM (R 4.4.0)\n P pillar        1.9.0   2023-03-22 [?] RSPM (R 4.4.0)\n P pkgconfig     2.0.3   2019-09-22 [?] RSPM (R 4.4.0)\n   renv          1.0.10  2024-10-05 [1] RSPM (R 4.4.0)\n P rlang         1.1.4   2024-06-04 [?] RSPM (R 4.4.0)\n P rmarkdown     2.28    2024-08-17 [?] RSPM (R 4.4.0)\n P sessioninfo   1.2.2   2021-12-06 [?] RSPM (R 4.4.0)\n P tibble        3.2.1   2023-03-20 [?] RSPM (R 4.4.0)\n P utf8          1.2.4   2023-10-22 [?] RSPM (R 4.4.0)\n P vctrs         0.6.5   2023-12-01 [?] RSPM (R 4.4.0)\n P xfun          0.48    2024-10-03 [?] RSPM (R 4.4.0)\n P yaml          2.3.10  2024-07-26 [?] RSPM (R 4.4.0)\n\n [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu\n [2] /opt/R/4.4.0/lib/R/library\n\n P ── Loaded and on-disk path mismatch.\n\n──────────────────────────────────────────────────────────────────────────────"
    +    "objectID": "Comp/r-sas_mmrm.html#fev-data",
    +    "href": "Comp/r-sas_mmrm.html#fev-data",
    +    "title": "R vs SAS MMRM",
    +    "section": "FEV Data",
    +    "text": "FEV Data\nThe FEV dataset contains measurements of FEV1 (forced expired volume in one second), a measure of how quickly the lungs can be emptied. Low levels of FEV1 may indicate chronic obstructive pulmonary disease (COPD). It is summarized below.\n                                      Stratified by ARMCD\n                               Overall       PBO           TRT\n  n                              800           420           380\n  USUBJID (%)\n     PT[1-200]                   200           105 (52.5)     95 (47.5)\n  AVISIT\n     VIS1                        200           105            95\n     VIS2                        200           105            95\n     VIS3                        200           105            95\n     VIS4                        200           105            95\n  RACE (%)\n     Asian                       280 (35.0)    152 (36.2)    128 (33.7)\n     Black or African American   300 (37.5)    184 (43.8)    116 (30.5)\n     White                       220 (27.5)     84 (20.0)    136 (35.8)\n  SEX = Female (%)               424 (53.0)    220 (52.4)    204 (53.7)\n  FEV1_BL (mean (SD))          40.19 (9.12)  40.46 (8.84)  39.90 (9.42)\n  FEV1 (mean (SD))             42.30 (9.32)  40.24 (8.67)  44.45 (9.51)\n  WEIGHT (mean (SD))            0.52 (0.23)   0.52 (0.23)   0.51 (0.23)\n  VISITN (mean (SD))            2.50 (1.12)   2.50 (1.12)   2.50 (1.12)\n  VISITN2 (mean (SD))          -0.02 (1.03)   0.01 (1.07)  -0.04 (0.98)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#bcva-data",
    +    "href": "Comp/r-sas_mmrm.html#bcva-data",
    +    "title": "R vs SAS MMRM",
    +    "section": "BCVA Data",
    +    "text": "BCVA Data\nThe BCVA dataset contains data from a randomized longitudinal ophthalmology trial evaluating the change in baseline corrected visual acuity (BCVA) over the course of 10 visits. BCVA corresponds to the number of letters read from a visual acuity chart. A summary of the data is given below:\n                                      Stratified by ARMCD\n                               Overall         CTL            TRT\n  n                             8605          4123           4482\n  USUBJID (%)\n     PT[1-1000]                 1000           494 (49.4)     506 (50.6)\n  AVISIT\n     VIS1                        983           482            501\n     VIS2                        980           481            499\n     VIS3                        960           471            489\n     VIS4                        946           458            488\n     VIS5                        925           454            471\n     VIS6                        868           410            458\n     VIS7                        816           388            428\n     VIS8                        791           371            420\n     VIS9                        719           327            392\n     VIS10                       617           281            336\n  RACE (%)\n     Asian                       297 (29.7)    151 (30.6)     146 (28.9)\n     Black or African American   317 (31.7)    149 (30.1)     168 (33.2)\n     White                       386 (38.6)    194 (39.3)     192 (37.9)\n  BCVA_BL (mean (SD))          75.12 (9.93)  74.90 (9.76)   75.40 (10.1)\n  BCVA_CHG (mean (SD))\n     VIS1                       5.59 (1.31)   5.32 (1.23)    5.86 (1.33)\n     VIS10                      9.18 (2.91)   7.49 (2.58)   10.60 (2.36)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#ante-dependence-heterogeneous",
    +    "href": "Comp/r-sas_mmrm.html#ante-dependence-heterogeneous",
    +    "title": "R vs SAS MMRM",
    +    "section": "Ante-dependence (heterogeneous)",
    +    "text": "Ante-dependence (heterogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=ANTE(1);\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + adh(VISITN | USUBJID),\n  data = fev_data\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#ante-dependence-homogeneous",
    +    "href": "Comp/r-sas_mmrm.html#ante-dependence-homogeneous",
    +    "title": "R vs SAS MMRM",
    +    "section": "Ante-dependence (homogeneous)",
    +    "text": "Ante-dependence (homogeneous)\n\nmmrm\nmmrm(\n  formula =FEV1 ~ ARMCD * AVISIT + ad(VISITN | USUBJID),\n  data = fev_data\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#auto-regressive-heterogeneous",
    +    "href": "Comp/r-sas_mmrm.html#auto-regressive-heterogeneous",
    +    "title": "R vs SAS MMRM",
    +    "section": "Auto-regressive (heterogeneous)",
    +    "text": "Auto-regressive (heterogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=ARH(1);\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + ar1h(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corCAR1(form = ~AVISIT | USUBJID),\n  weights = varIdent(form = ~1|AVISIT),\n  na.action = na.omit\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#auto-regressive-homogeneous",
    +    "href": "Comp/r-sas_mmrm.html#auto-regressive-homogeneous",
    +    "title": "R vs SAS MMRM",
    +    "section": "Auto-regressive (homogeneous)",
    +    "text": "Auto-regressive (homogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 =  ARMCD|AVISIT / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=AR(1);\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + ar1(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corCAR1(form = ~AVISIT | USUBJID),\n  na.action = na.omit\n)\n\n\n\nglmmTMB\nglmmTMB(\n  FEV1 ~ ARMCD * AVISIT + ar1(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#compound-symmetry-heterogeneous",
    +    "href": "Comp/r-sas_mmrm.html#compound-symmetry-heterogeneous",
    +    "title": "R vs SAS MMRM",
    +    "section": "Compound symmetry (heterogeneous)",
    +    "text": "Compound symmetry (heterogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=CSH;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + csh(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corCompSymm(form = ~AVISIT | USUBJID),\n  weights = varIdent(form = ~1|AVISIT),\n  na.action = na.omit\n)\n\n\n\nglmmTMB\nglmmTMB(\n  FEV1 ~ ARMCD * AVISIT + cs(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#compound-symmetry-homogeneous",
    +    "href": "Comp/r-sas_mmrm.html#compound-symmetry-homogeneous",
    +    "title": "R vs SAS MMRM",
    +    "section": "Compound symmetry (homogeneous)",
    +    "text": "Compound symmetry (homogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=CS;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + cs(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corCompSymm(form = ~AVISIT | USUBJID),\n  na.action = na.omit\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#spatial-exponential",
    +    "href": "Comp/r-sas_mmrm.html#spatial-exponential",
    +    "title": "R vs SAS MMRM",
    +    "section": "Spatial exponential",
    +    "text": "Spatial exponential\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM / subject=USUBJID type=sp(exp)(visitn) rcorr;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + sp_exp(VISITN | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~ ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corExp(form = ~AVISIT | USUBJID),\n  weights = varIdent(form = ~1|AVISIT),\n  na.action = na.omit\n)\n\n\n\nglmmTMB\n# NOTE: requires use of coordinates\nglmmTMB(\n  FEV1 ~ ARMCD * AVISIT + exp(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#toeplitz-heterogeneous",
    +    "href": "Comp/r-sas_mmrm.html#toeplitz-heterogeneous",
    +    "title": "R vs SAS MMRM",
    +    "section": "Toeplitz (heterogeneous)",
    +    "text": "Toeplitz (heterogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=TOEPH;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + toeph(AVISIT | USUBJID),\n  data = fev_data\n)\n\n\n\nglmmTMB\n glmmTMB(\n  FEV1 ~ ARMCD * AVISIT + toep(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#toeplitz-homogeneous",
    +    "href": "Comp/r-sas_mmrm.html#toeplitz-homogeneous",
    +    "title": "R vs SAS MMRM",
    +    "section": "Toeplitz (homogeneous)",
    +    "text": "Toeplitz (homogeneous)\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = AVISIT|ARMCD / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=TOEP;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + toep(AVISIT | USUBJID),\n  data = fev_data\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#unstructured",
    +    "href": "Comp/r-sas_mmrm.html#unstructured",
    +    "title": "R vs SAS MMRM",
    +    "section": "Unstructured",
    +    "text": "Unstructured\n\nPROC GLIMMIX\nPROC GLIMMIX DATA = fev_data;\nCLASS AVISIT(ref = 'VIS1') ARMCD(ref = 'PBO') USUBJID;\nMODEL FEV1 = ARMCD|AVISIT / ddfm=satterthwaite solution chisq;\nRANDOM AVISIT / subject=USUBJID type=un;\n\n\n\nmmrm\nmmrm(\n  formula = FEV1 ~ ARMCD * AVISIT + us(AVISIT | USUBJID),\n  data = fev_data\n)\n\n\n\ngls\ngls(\n  formula = FEV1 ~  ARMCD * AVISIT,\n  data = fev_data,\n  correlation = corSymm(form = ~AVISIT | USUBJID),\n  weights = varIdent(form = ~1|AVISIT),\n  na.action = na.omit\n)\n\n\n\nlmer\nlmer(\n  FEV1 ~ ARMCD * AVISIT + (0 + AVISIT | USUBJID),\n  data = fev_data,\n  control = lmerControl(check.nobs.vs.nRE = \"ignore\"),\n  na.action = na.omit\n)\n\n\n\nglmmTMB\nglmmTMB(\n  FEV1 ~ ARMCD * AVISIT + us(0 + AVISIT | USUBJID),\n  dispformula = ~ 0,\n  data = fev_data\n)"
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#convergence-times",
    +    "href": "Comp/r-sas_mmrm.html#convergence-times",
    +    "title": "R vs SAS MMRM",
    +    "section": "Convergence Times",
    +    "text": "Convergence Times\n\nFEV Data\nThe mmrm, PROC GLIMMIX, gls, lmer, and glmmTMB functions are applied to the FEV dataset 10 times. The convergence times are recorded for each replicate and are reported in the table below.\n\n\n\nComparison of convergence times: milliseconds\n\n\nImplementation\nMedian\nFirst Quartile\nThird Quartile\n\n\n\n\nmmrm\n56.15\n55.76\n56.30\n\n\nPROC GLIMMIX\n100.00\n100.00\n100.00\n\n\nlmer\n247.02\n245.25\n257.46\n\n\ngls\n687.63\n683.50\n692.45\n\n\nglmmTMB\n715.90\n708.70\n721.57\n\n\n\n\n\nIt is clear from these results that mmrm converges significantly faster than other R functions. Though not demonstrated here, this is generally true regardless of the sample size and covariance structure used. mmrm is faster than PROC GLIMMIX.\n\n\nBCVA Data\nThe MMRM implementations are now applied to the BCVA dataset 10 times. The convergence times are presented below.\n\n\n\nComparison of convergence times: seconds\n\n\nImplementation\nMedian\nFirst Quartile\nThird Quartile\n\n\n\n\nmmrm\n3.36\n3.32\n3.46\n\n\nglmmTMB\n18.65\n18.14\n18.87\n\n\nPROC GLIMMIX\n36.25\n36.17\n36.29\n\n\ngls\n164.36\n158.61\n165.93\n\n\nlmer\n165.26\n157.46\n166.42\n\n\n\n\n\nWe again find that mmrm produces the fastest convergence times on average."
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#marginal-treatment-effect-estimates-comparison",
    +    "href": "Comp/r-sas_mmrm.html#marginal-treatment-effect-estimates-comparison",
    +    "title": "R vs SAS MMRM",
    +    "section": "Marginal Treatment Effect Estimates Comparison",
    +    "text": "Marginal Treatment Effect Estimates Comparison\nWe next estimate the marginal mean treatment effects for each visit in the FEV and BCVA datasets using the MMRM fitting procedures. All R implementations’ estimates are reported relative to PROC GLIMMIX’s estimates. Convergence status is also reported.\n\nFEV Data\n\n\n\n\n\n\n\n\n\nThe R procedures’ estimates are very similar to those output by PROC GLIMMIX, though mmrm and gls generate the estimates that are closest to those produced when using SAS. All methods converge using their default optimization arguments.\n\n\nBCVA Data\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nmmrm, gls and lmer produce estimates that are virtually identical to PROC GLIMMIX’s, while glmmTMB does not. This is likely explained by glmmTMB’s failure to converge. Note too that lmer fails to converge."
    +  },
    +  {
    +    "objectID": "Comp/r-sas_mmrm.html#impact-of-missing-data-on-convergence-rates",
    +    "href": "Comp/r-sas_mmrm.html#impact-of-missing-data-on-convergence-rates",
    +    "title": "R vs SAS MMRM",
    +    "section": "Impact of Missing Data on Convergence Rates",
    +    "text": "Impact of Missing Data on Convergence Rates\nThe results of the previous benchmark suggest that the amount of patients missing from later time points affect certain implementations’ capacity to converge. We investigate this further by simulating data using a data-generating process similar to that of the BCVA datasets, though with various rates of patient dropout.\nTen datasets of 200 patients are generated each of the following levels of missingness: none, mild, moderate, and high. In all scenarios, observations are missing at random. The number patients observed at each visit is obtained for one replicated dataset at each level of missingness is presented in the table below.\n\n\n\nNumber of patients per visit\n\n\n\nnone\nmild\nmoderate\nhigh\n\n\n\n\nVIS01\n200\n196.7\n197.6\n188.1\n\n\nVIS02\n200\n195.4\n194.4\n182.4\n\n\nVIS03\n200\n195.1\n190.7\n175.2\n\n\nVIS04\n200\n194.1\n188.4\n162.8\n\n\nVIS05\n200\n191.6\n182.5\n142.7\n\n\nVIS06\n200\n188.2\n177.3\n125.4\n\n\nVIS07\n200\n184.6\n168.0\n105.9\n\n\nVIS08\n200\n178.5\n155.4\n82.6\n\n\nVIS09\n200\n175.3\n139.9\n58.1\n\n\nVIS10\n200\n164.1\n124.0\n39.5\n\n\n\n\n\nThe convergence rates of all implementations for stratified by missingness level is presented in the plot below.\n\n\n\n\n\n\n\n\n\nmmrm, gls, and PROC GLIMMIX are resilient to missingness, only exhibiting some convergence problems in the scenarios with the most missingness. These implementations converged in all the other scenarios’ replicates. glmmTMB, on the other hand, has convergence issues in the no-, mild-, and high-missingness datasets, with the worst convergence rate occurring in the datasets with the most dropout. Finally, lmer is unreliable in all scenarios, suggesting that it’s convergence issues stem from something other than the missing observations.\nNote that the default optimization schemes are used for each method; these schemes can be modified to potentially improve convergence rates.\nA more comprehensive simulation study using data-generating processes similar to the one used here is outlined in the simulations/missing-data-benchmarks subdirectory. In addition to assessing the effect of missing data on software convergence rates, we also evaluate these methods’ fit times and empirical bias, variance, 95% coverage rates, type I error rates and type II error rates. mmrm is found to be the most most robust software for fitting MMRMs in scenarios where a large proportion of patients are missing from the last time points. Additionally, mmrm has the fastest average fit times regardless of the amount of missingness. All implementations considered produce similar empirical biases, variances, 95% coverage rates, type I error rates and type II error rates."
    +  },
    +  {
    +    "objectID": "Comp/r-sas_linear-regression.html",
    +    "href": "Comp/r-sas_linear-regression.html",
    +    "title": "R vs SAS Linear Regression",
    +    "section": "",
    +    "text": "Summary of R vs SAS Comparison for Linear Regression\nTo date the lm function in R and proc reg in sas have been found to 100% agree.\nSee R and SAS for more detail."
    +  },
    +  {
    +    "objectID": "Comp/r-sas_kruskalwallis.html",
    +    "href": "Comp/r-sas_kruskalwallis.html",
    +    "title": "Kruskal Wallis R v SAS",
    +    "section": "",
    +    "text": "From the individual R and SAS pages, performing the Kruskal-Wallis test in R using:\n\nkruskal.test(Sepal_Width~Species, data=iris_sub)\n\nand in SAS using:\n\nproc npar1way data=iris_sub wilcoxon;\nclass Species;\nvar Sepal_Width;\nexact;\nrun;\n\nproduced the same results for the test statistic and asymptotic p-value.\nThere is a difference between languages in that SAS provides the EXACT option to easily output the exact p-value, where R does not seem to have an equivalent. A Monte Carlo permutation test may offer an alternative to the exact test on R. The coin package could help in implementing this."
    +  },
    +  {
    +    "objectID": "Comp/r-sas_kruskalwallis.html#kruskal-wallis-r-and-sas",
    +    "href": "Comp/r-sas_kruskalwallis.html#kruskal-wallis-r-and-sas",
    +    "title": "Kruskal Wallis R v SAS",
    +    "section": "",
    +    "text": "From the individual R and SAS pages, performing the Kruskal-Wallis test in R using:\n\nkruskal.test(Sepal_Width~Species, data=iris_sub)\n\nand in SAS using:\n\nproc npar1way data=iris_sub wilcoxon;\nclass Species;\nvar Sepal_Width;\nexact;\nrun;\n\nproduced the same results for the test statistic and asymptotic p-value.\nThere is a difference between languages in that SAS provides the EXACT option to easily output the exact p-value, where R does not seem to have an equivalent. A Monte Carlo permutation test may offer an alternative to the exact test on R. The coin package could help in implementing this."
       }
     ]
    \ No newline at end of file
    diff --git a/site_libs/bootstrap/bootstrap.min.css b/site_libs/bootstrap/bootstrap.min.css
    index 3121dd516..909f846e5 100644
    --- a/site_libs/bootstrap/bootstrap.min.css
    +++ b/site_libs/bootstrap/bootstrap.min.css
    @@ -2,7 +2,7 @@
      * Bootstrap  v5.3.1 (https://getbootstrap.com/)
      * Copyright 2011-2023 The Bootstrap Authors
      * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
    - */@import"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2780e3;--bs-indigo: #6610f2;--bs-purple: #613d7c;--bs-pink: #e83e8c;--bs-red: #ff0039;--bs-orange: #f0ad4e;--bs-yellow: #ff7518;--bs-green: #3fb618;--bs-teal: #20c997;--bs-cyan: #9954bb;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #343a40;--bs-primary: #2780e3;--bs-secondary: #343a40;--bs-success: #3fb618;--bs-info: #9954bb;--bs-warning: #ff7518;--bs-danger: #ff0039;--bs-light: #f8f9fa;--bs-dark: #343a40;--bs-default-rgb: 52, 58, 64;--bs-primary-rgb: 39, 128, 227;--bs-secondary-rgb: 52, 58, 64;--bs-success-rgb: 63, 182, 24;--bs-info-rgb: 153, 84, 187;--bs-warning-rgb: 255, 117, 24;--bs-danger-rgb: 255, 0, 57;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 52, 58, 64;--bs-primary-text-emphasis: #10335b;--bs-secondary-text-emphasis: #15171a;--bs-success-text-emphasis: #19490a;--bs-info-text-emphasis: #3d224b;--bs-warning-text-emphasis: #662f0a;--bs-danger-text-emphasis: #660017;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #d4e6f9;--bs-secondary-bg-subtle: #d6d8d9;--bs-success-bg-subtle: #d9f0d1;--bs-info-bg-subtle: #ebddf1;--bs-warning-bg-subtle: #ffe3d1;--bs-danger-bg-subtle: #ffccd7;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #a9ccf4;--bs-secondary-border-subtle: #aeb0b3;--bs-success-border-subtle: #b2e2a3;--bs-info-border-subtle: #d6bbe4;--bs-warning-border-subtle: #ffc8a3;--bs-danger-border-subtle: #ff99b0;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #343a40;--bs-body-color-rgb: 52, 58, 64;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(52, 58, 64, 0.75);--bs-secondary-color-rgb: 52, 58, 64;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(52, 58, 64, 0.5);--bs-tertiary-color-rgb: 52, 58, 64;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #2761e3;--bs-link-color-rgb: 39, 97, 227;--bs-link-decoration: underline;--bs-link-hover-color: #1f4eb6;--bs-link-hover-color-rgb: 31, 78, 182;--bs-code-color: #7d12ba;--bs-highlight-bg: #ffe3d1;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(39, 128, 227, 0.25);--bs-form-valid-color: #3fb618;--bs-form-valid-border-color: #3fb618;--bs-form-invalid-color: #ff0039;--bs-form-invalid-border-color: #ff0039}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #7db3ee;--bs-secondary-text-emphasis: #85898c;--bs-success-text-emphasis: #8cd374;--bs-info-text-emphasis: #c298d6;--bs-warning-text-emphasis: #ffac74;--bs-danger-text-emphasis: #ff6688;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #081a2d;--bs-secondary-bg-subtle: #0a0c0d;--bs-success-bg-subtle: #0d2405;--bs-info-bg-subtle: #1f1125;--bs-warning-bg-subtle: #331705;--bs-danger-bg-subtle: #33000b;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #174d88;--bs-secondary-border-subtle: #1f2326;--bs-success-border-subtle: #266d0e;--bs-info-border-subtle: #5c3270;--bs-warning-border-subtle: #99460e;--bs-danger-border-subtle: #990022;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #7db3ee;--bs-link-hover-color: #97c2f1;--bs-link-color-rgb: 125, 179, 238;--bs-link-hover-color-rgb: 151, 194, 241;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #8cd374;--bs-form-valid-border-color: #8cd374;--bs-form-invalid-color: #ff6688;--bs-form-invalid-border-color: #ff6688}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6)}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#343a40}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(52,58,64,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(52,58,64,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #343a40;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #343a40;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #343a40;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #343a40;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #b2bac1}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #d4e6f9;--bs-table-border-color: #bfcfe0;--bs-table-striped-bg: #c9dbed;--bs-table-striped-color: #000;--bs-table-active-bg: #bfcfe0;--bs-table-active-color: #000;--bs-table-hover-bg: #c4d5e6;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #d6d8d9;--bs-table-border-color: #c1c2c3;--bs-table-striped-bg: #cbcdce;--bs-table-striped-color: #000;--bs-table-active-bg: #c1c2c3;--bs-table-active-color: #000;--bs-table-hover-bg: #c6c8c9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d9f0d1;--bs-table-border-color: #c3d8bc;--bs-table-striped-bg: #cee4c7;--bs-table-striped-color: #000;--bs-table-active-bg: #c3d8bc;--bs-table-active-color: #000;--bs-table-hover-bg: #c9dec1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #ebddf1;--bs-table-border-color: #d4c7d9;--bs-table-striped-bg: #dfd2e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4c7d9;--bs-table-active-color: #000;--bs-table-hover-bg: #d9ccdf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #ffe3d1;--bs-table-border-color: #e6ccbc;--bs-table-striped-bg: #f2d8c7;--bs-table-striped-color: #000;--bs-table-active-bg: #e6ccbc;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd2c1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #ffccd7;--bs-table-border-color: #e6b8c2;--bs-table-striped-bg: #f2c2cc;--bs-table-striped-color: #000;--bs-table-active-bg: #e6b8c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbdc7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #343a40;--bs-table-border-color: #484e53;--bs-table-striped-bg: #3e444a;--bs-table-striped-color: #fff;--bs-table-active-bg: #484e53;--bs-table-active-color: #fff;--bs-table-hover-bg: #43494e;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(52,58,64,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#343a40;background-color:#fff;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(52,58,64,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#343a40;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#343a40;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important}.form-control-color::-webkit-color-swatch{border:0 !important}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #343a40}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2780e3;border-color:#2780e3}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2780e3;border-color:#2780e3;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393c0f1'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bed9f7}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bed9f7}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(52,58,64,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(52,58,64,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1)}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#3fb618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#3fb618}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3fb618;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3fb618}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3fb618}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3fb618}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3fb618}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#ff0039}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff0039;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ff0039}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ff0039}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ff0039}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff0039}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #343a40;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #216dc1;--bs-btn-hover-border-color: #1f66b6;--bs-btn-focus-shadow-rgb: 71, 147, 231;--bs-btn-active-color: #fff;--bs-btn-active-bg: #1f66b6;--bs-btn-active-border-color: #1d60aa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2780e3;--bs-btn-disabled-border-color: #2780e3}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #369b14;--bs-btn-hover-border-color: #329213;--bs-btn-focus-shadow-rgb: 92, 193, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #329213;--bs-btn-active-border-color: #2f8912;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3fb618;--bs-btn-disabled-border-color: #3fb618}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #82479f;--bs-btn-hover-border-color: #7a4396;--bs-btn-focus-shadow-rgb: 168, 110, 197;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7a4396;--bs-btn-active-border-color: #733f8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #9954bb;--bs-btn-disabled-border-color: #9954bb}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d96314;--bs-btn-hover-border-color: #cc5e13;--bs-btn-focus-shadow-rgb: 255, 138, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc5e13;--bs-btn-active-border-color: #bf5812;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff7518;--bs-btn-disabled-border-color: #ff7518}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d90030;--bs-btn-hover-border-color: #cc002e;--bs-btn-focus-shadow-rgb: 255, 38, 87;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc002e;--bs-btn-active-border-color: #bf002b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff0039;--bs-btn-disabled-border-color: #ff0039}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #52585d;--bs-btn-hover-border-color: #484e53;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #5d6166;--bs-btn-active-border-color: #484e53;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-outline-default{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2780e3;--bs-btn-hover-border-color: #2780e3;--bs-btn-focus-shadow-rgb: 39, 128, 227;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2780e3;--bs-btn-active-border-color: #2780e3;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2780e3;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2780e3;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3fb618;--bs-btn-hover-border-color: #3fb618;--bs-btn-focus-shadow-rgb: 63, 182, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3fb618;--bs-btn-active-border-color: #3fb618;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3fb618;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3fb618;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #9954bb;--bs-btn-hover-border-color: #9954bb;--bs-btn-focus-shadow-rgb: 153, 84, 187;--bs-btn-active-color: #fff;--bs-btn-active-bg: #9954bb;--bs-btn-active-border-color: #9954bb;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #9954bb;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #9954bb;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff7518;--bs-btn-hover-border-color: #ff7518;--bs-btn-focus-shadow-rgb: 255, 117, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff7518;--bs-btn-active-border-color: #ff7518;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff7518;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff7518;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff0039;--bs-btn-hover-border-color: #ff0039;--bs-btn-focus-shadow-rgb: 255, 0, 57;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff0039;--bs-btn-active-border-color: #ff0039;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff0039;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff0039;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #2761e3;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #1f4eb6;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #1f4eb6;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 71, 121, 231;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #343a40;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #343a40;--bs-dropdown-link-hover-color: #343a40;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: rgba(52, 58, 64, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #2761e3;--bs-nav-link-hover-color: #1f4eb6;--bs-nav-link-disabled-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #dee2e6;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width))}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2780e3}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion{--bs-accordion-color: #343a40;--bs-accordion-bg: #fff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #343a40;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23343a40'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2310335b'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #93c0f1;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #10335b;--bs-accordion-active-bg: #d4e6f9}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(52, 58, 64, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #2761e3;--bs-pagination-bg: #fff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: #dee2e6;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #1f4eb6;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: #dee2e6;--bs-pagination-focus-color: #1f4eb6;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #2780e3;--bs-pagination-active-border-color: #2780e3;--bs-pagination-disabled-color: rgba(52, 58, 64, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: #dee2e6;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 0 solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress,.progress-stacked{--bs-progress-height: 0.5rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2780e3;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #343a40;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(52, 58, 64, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #343a40;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(52, 58, 64, 0.75);--bs-list-group-disabled-bg: #fff;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2780e3;--bs-list-group-active-border-color: #2780e3;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(52, 58, 64, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #343a40;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #343a40;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(31, 102, 182, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(31, 102, 182, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(50, 146, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(50, 146, 19, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(122, 67, 150, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(122, 67, 150, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(204, 94, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 94, 19, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(204, 0, 46, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 0, 46, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}:root{--bslib-page-sidebar-title-bg: #f8f9fa;--bslib-page-sidebar-title-color: #000}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#545555}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#1f4eb6}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#595959}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#595959;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(33,81,191,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#8c8c8c}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#595959}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(33,81,191,.8)}div.sidebar-item-container.disabled{color:rgba(89,89,89,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#2151bf}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#fff}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#f8f9fa;color:#545555;border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#1f4eb6}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:64px}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#545555;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#595959;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#545555;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#545555;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#343a40;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#343a40;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#343a40;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#343a40;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#343a40;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#4b95e8}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#343a40}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#e5effc}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#343a40}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#343a40}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#545555}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#595959}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#343a40;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(52,58,64,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#5397e9 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#343a40 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#3aa716 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#fa6400 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#f8f9fa !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#343a40 !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #dae0e5;border-bottom:solid 1px #dae0e5}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#e0e5e9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#545555}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#343a40}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#343a40}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px #bcbfc0;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#343a40}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#343a40;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#2761e3}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#2761e3}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#2761e3}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#2761e3}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#2761e3}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#343a40;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#343a40}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre-wrap}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*!
    + */@import"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2780e3;--bs-indigo: #6610f2;--bs-purple: #613d7c;--bs-pink: #e83e8c;--bs-red: #ff0039;--bs-orange: #f0ad4e;--bs-yellow: #ff7518;--bs-green: #3fb618;--bs-teal: #20c997;--bs-cyan: #9954bb;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #343a40;--bs-primary: #2780e3;--bs-secondary: #343a40;--bs-success: #3fb618;--bs-info: #9954bb;--bs-warning: #ff7518;--bs-danger: #ff0039;--bs-light: #f8f9fa;--bs-dark: #343a40;--bs-default-rgb: 52, 58, 64;--bs-primary-rgb: 39, 128, 227;--bs-secondary-rgb: 52, 58, 64;--bs-success-rgb: 63, 182, 24;--bs-info-rgb: 153, 84, 187;--bs-warning-rgb: 255, 117, 24;--bs-danger-rgb: 255, 0, 57;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 52, 58, 64;--bs-primary-text-emphasis: #10335b;--bs-secondary-text-emphasis: #15171a;--bs-success-text-emphasis: #19490a;--bs-info-text-emphasis: #3d224b;--bs-warning-text-emphasis: #662f0a;--bs-danger-text-emphasis: #660017;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #d4e6f9;--bs-secondary-bg-subtle: #d6d8d9;--bs-success-bg-subtle: #d9f0d1;--bs-info-bg-subtle: #ebddf1;--bs-warning-bg-subtle: #ffe3d1;--bs-danger-bg-subtle: #ffccd7;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #a9ccf4;--bs-secondary-border-subtle: #aeb0b3;--bs-success-border-subtle: #b2e2a3;--bs-info-border-subtle: #d6bbe4;--bs-warning-border-subtle: #ffc8a3;--bs-danger-border-subtle: #ff99b0;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #343a40;--bs-body-color-rgb: 52, 58, 64;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(52, 58, 64, 0.75);--bs-secondary-color-rgb: 52, 58, 64;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(52, 58, 64, 0.5);--bs-tertiary-color-rgb: 52, 58, 64;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #2761e3;--bs-link-color-rgb: 39, 97, 227;--bs-link-decoration: underline;--bs-link-hover-color: #1f4eb6;--bs-link-hover-color-rgb: 31, 78, 182;--bs-code-color: #7d12ba;--bs-highlight-bg: #ffe3d1;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(39, 128, 227, 0.25);--bs-form-valid-color: #3fb618;--bs-form-valid-border-color: #3fb618;--bs-form-invalid-color: #ff0039;--bs-form-invalid-border-color: #ff0039}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #7db3ee;--bs-secondary-text-emphasis: #85898c;--bs-success-text-emphasis: #8cd374;--bs-info-text-emphasis: #c298d6;--bs-warning-text-emphasis: #ffac74;--bs-danger-text-emphasis: #ff6688;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #081a2d;--bs-secondary-bg-subtle: #0a0c0d;--bs-success-bg-subtle: #0d2405;--bs-info-bg-subtle: #1f1125;--bs-warning-bg-subtle: #331705;--bs-danger-bg-subtle: #33000b;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #174d88;--bs-secondary-border-subtle: #1f2326;--bs-success-border-subtle: #266d0e;--bs-info-border-subtle: #5c3270;--bs-warning-border-subtle: #99460e;--bs-danger-border-subtle: #990022;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #7db3ee;--bs-link-hover-color: #97c2f1;--bs-link-color-rgb: 125, 179, 238;--bs-link-hover-color-rgb: 151, 194, 241;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #8cd374;--bs-form-valid-border-color: #8cd374;--bs-form-invalid-color: #ff6688;--bs-form-invalid-border-color: #ff6688}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6)}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#343a40}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(52,58,64,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(52,58,64,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #343a40;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #343a40;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #343a40;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #343a40;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #b2bac1}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #d4e6f9;--bs-table-border-color: #bfcfe0;--bs-table-striped-bg: #c9dbed;--bs-table-striped-color: #000;--bs-table-active-bg: #bfcfe0;--bs-table-active-color: #000;--bs-table-hover-bg: #c4d5e6;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #d6d8d9;--bs-table-border-color: #c1c2c3;--bs-table-striped-bg: #cbcdce;--bs-table-striped-color: #000;--bs-table-active-bg: #c1c2c3;--bs-table-active-color: #000;--bs-table-hover-bg: #c6c8c9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d9f0d1;--bs-table-border-color: #c3d8bc;--bs-table-striped-bg: #cee4c7;--bs-table-striped-color: #000;--bs-table-active-bg: #c3d8bc;--bs-table-active-color: #000;--bs-table-hover-bg: #c9dec1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #ebddf1;--bs-table-border-color: #d4c7d9;--bs-table-striped-bg: #dfd2e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4c7d9;--bs-table-active-color: #000;--bs-table-hover-bg: #d9ccdf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #ffe3d1;--bs-table-border-color: #e6ccbc;--bs-table-striped-bg: #f2d8c7;--bs-table-striped-color: #000;--bs-table-active-bg: #e6ccbc;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd2c1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #ffccd7;--bs-table-border-color: #e6b8c2;--bs-table-striped-bg: #f2c2cc;--bs-table-striped-color: #000;--bs-table-active-bg: #e6b8c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbdc7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #343a40;--bs-table-border-color: #484e53;--bs-table-striped-bg: #3e444a;--bs-table-striped-color: #fff;--bs-table-active-bg: #484e53;--bs-table-active-color: #fff;--bs-table-hover-bg: #43494e;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(52,58,64,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#343a40;background-color:#fff;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(52,58,64,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#343a40;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#343a40;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important}.form-control-color::-webkit-color-swatch{border:0 !important}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #343a40}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2780e3;border-color:#2780e3}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2780e3;border-color:#2780e3;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393c0f1'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bed9f7}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bed9f7}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(52,58,64,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(52,58,64,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1)}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#3fb618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#3fb618}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3fb618;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3fb618}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3fb618}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3fb618}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3fb618}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#ff0039}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff0039;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ff0039}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ff0039}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ff0039}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff0039}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #343a40;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #216dc1;--bs-btn-hover-border-color: #1f66b6;--bs-btn-focus-shadow-rgb: 71, 147, 231;--bs-btn-active-color: #fff;--bs-btn-active-bg: #1f66b6;--bs-btn-active-border-color: #1d60aa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2780e3;--bs-btn-disabled-border-color: #2780e3}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #369b14;--bs-btn-hover-border-color: #329213;--bs-btn-focus-shadow-rgb: 92, 193, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #329213;--bs-btn-active-border-color: #2f8912;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3fb618;--bs-btn-disabled-border-color: #3fb618}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #82479f;--bs-btn-hover-border-color: #7a4396;--bs-btn-focus-shadow-rgb: 168, 110, 197;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7a4396;--bs-btn-active-border-color: #733f8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #9954bb;--bs-btn-disabled-border-color: #9954bb}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d96314;--bs-btn-hover-border-color: #cc5e13;--bs-btn-focus-shadow-rgb: 255, 138, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc5e13;--bs-btn-active-border-color: #bf5812;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff7518;--bs-btn-disabled-border-color: #ff7518}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d90030;--bs-btn-hover-border-color: #cc002e;--bs-btn-focus-shadow-rgb: 255, 38, 87;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc002e;--bs-btn-active-border-color: #bf002b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff0039;--bs-btn-disabled-border-color: #ff0039}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #52585d;--bs-btn-hover-border-color: #484e53;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #5d6166;--bs-btn-active-border-color: #484e53;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-outline-default{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2780e3;--bs-btn-hover-border-color: #2780e3;--bs-btn-focus-shadow-rgb: 39, 128, 227;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2780e3;--bs-btn-active-border-color: #2780e3;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2780e3;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2780e3;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3fb618;--bs-btn-hover-border-color: #3fb618;--bs-btn-focus-shadow-rgb: 63, 182, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3fb618;--bs-btn-active-border-color: #3fb618;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3fb618;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3fb618;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #9954bb;--bs-btn-hover-border-color: #9954bb;--bs-btn-focus-shadow-rgb: 153, 84, 187;--bs-btn-active-color: #fff;--bs-btn-active-bg: #9954bb;--bs-btn-active-border-color: #9954bb;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #9954bb;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #9954bb;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff7518;--bs-btn-hover-border-color: #ff7518;--bs-btn-focus-shadow-rgb: 255, 117, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff7518;--bs-btn-active-border-color: #ff7518;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff7518;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff7518;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff0039;--bs-btn-hover-border-color: #ff0039;--bs-btn-focus-shadow-rgb: 255, 0, 57;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff0039;--bs-btn-active-border-color: #ff0039;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff0039;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff0039;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #2761e3;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #1f4eb6;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #1f4eb6;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 71, 121, 231;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #343a40;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #343a40;--bs-dropdown-link-hover-color: #343a40;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: rgba(52, 58, 64, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #2761e3;--bs-nav-link-hover-color: #1f4eb6;--bs-nav-link-disabled-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #dee2e6;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width))}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2780e3}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion{--bs-accordion-color: #343a40;--bs-accordion-bg: #fff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #343a40;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23343a40'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2310335b'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #93c0f1;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #10335b;--bs-accordion-active-bg: #d4e6f9}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(52, 58, 64, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #2761e3;--bs-pagination-bg: #fff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: #dee2e6;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #1f4eb6;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: #dee2e6;--bs-pagination-focus-color: #1f4eb6;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #2780e3;--bs-pagination-active-border-color: #2780e3;--bs-pagination-disabled-color: rgba(52, 58, 64, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: #dee2e6;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 0 solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress,.progress-stacked{--bs-progress-height: 0.5rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2780e3;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #343a40;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(52, 58, 64, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #343a40;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(52, 58, 64, 0.75);--bs-list-group-disabled-bg: #fff;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2780e3;--bs-list-group-active-border-color: #2780e3;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(52, 58, 64, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #343a40;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #343a40;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(31, 102, 182, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(31, 102, 182, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(50, 146, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(50, 146, 19, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(122, 67, 150, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(122, 67, 150, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(204, 94, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 94, 19, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(204, 0, 46, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 0, 46, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}:root{--bslib-page-sidebar-title-bg: #f8f9fa;--bslib-page-sidebar-title-color: #000}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#545555}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#1f4eb6}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#595959}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#595959;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(33,81,191,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#8c8c8c}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#595959}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(33,81,191,.8)}div.sidebar-item-container.disabled{color:rgba(89,89,89,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#2151bf}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#fff}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#f8f9fa;color:#545555;border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#1f4eb6}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:64px}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#545555;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#595959;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#545555;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#545555;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#343a40;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#343a40;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#343a40;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#343a40;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#343a40;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#4b95e8}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#343a40}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#e5effc}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#343a40}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#343a40}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#545555}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#595959}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#343a40;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(52,58,64,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#5397e9 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#343a40 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#3aa716 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#fa6400 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#f8f9fa !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#343a40 !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #dae0e5;border-bottom:solid 1px #dae0e5}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#e0e5e9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#545555}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#343a40}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#343a40}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px #bcbfc0;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#343a40}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#343a40;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#2761e3}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#2761e3}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#2761e3}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#2761e3}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#2761e3}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#343a40;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#343a40}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre-wrap}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*!
     *
     * ansi colors from IPython notebook's
     *
    diff --git a/templates/template.html b/templates/template.html
    index 27367faf7..1793cad35 100644
    --- a/templates/template.html
    +++ b/templates/template.html
    @@ -308,14 +308,14 @@ 

    Reference

    ─ Session info ───────────────────────────────────────────────────────────────
      setting  value
      version  R version 4.4.0 (2024-04-24)
    - os       Ubuntu 22.04.5 LTS
    + os       Ubuntu 24.04.1 LTS
      system   x86_64, linux-gnu
      ui       X11
      language (EN)
      collate  C.UTF-8
      ctype    C.UTF-8
      tz       UTC
    - date     2024-10-10
    + date     2024-10-15
      pandoc   3.2 @ /opt/quarto/bin/tools/ (via rmarkdown)
     
     ─ Packages ───────────────────────────────────────────────────────────────────
    @@ -344,7 +344,7 @@ 

    Reference

    P xfun 0.48 2024-10-03 [?] RSPM (R 4.4.0) P yaml 2.3.10 2024-07-26 [?] RSPM (R 4.4.0) - [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu + [1] /home/runner/work/CAMIS/CAMIS/renv/library/linux-ubuntu-noble/R-4.4/x86_64-pc-linux-gnu [2] /opt/R/4.4.0/lib/R/library P ── Loaded and on-disk path mismatch.