1 Giới thiệu

Thiếu sót dữ liệu (missing value) là một vấn đề khó chịu khi làm nghiên cứu y học lâm sàng. Trong một số trường hợp lý tưởng, nếu dữ liệu bị mất mát có ý nghĩa khách quan (thí dụ các đại lượng sinh học), xảy ra một cách ngẫu nhiên và với tỉ lệ không quá cao, chúng ta có thể sử dụng một mô hình hồi quy để bổ túc các trường hợp thiếu sót của một biến dựa vào quan hệ giữa biến này và những biến còn lại trong dữ liệu.

Nhiều công cụ khá mạnh trong R cho phép bổ túc dữ liệu, thí dụ như mice, caret, recipes. Bạn cũng có thể tự mình bổ túc thủ công cho từng biến bằng cách sử dụng một thuật toán Machine learning tùy chọn nào đó, thí dụ KNN, random forest, …

Mặt khác, mô hình hồi quy tuyến tính thường được áp dụng khi phân tích dữ liệu như một công cụ suy diễn thống kê trong các nghiên cứu mang tính diễn dịch. Những mô hình này thường không chấp nhận dữ liệu thiếu sót, do đó việc bổ túc dữ liệu - nếu có - phải được thực hiện TRƯỚC KHI suy diễn thống kê.

2 Một mô hình lạ với brms

Như Nhi đã trình bày, có một package rất mạnh hiện nay trong phái “Hồi quy Bayes”, đó là “brms”" của Paul Bürkner. brms không chỉ là một giao thức giúp cho việc code mô hình bằng ngôn ngữ STAN nhẹ nhàng, đơn giản hơn, nhưng trong 2 năm qua nó đã được phát triển cao hơn rất nhiều và cho phép làm những việc tương đối “kì lạ”.

Một trong những tính năng kì lạ này sẽ được thử nghiệm trong bài thực hành hôm nay, đó là xây dựng một mô hình hồi quy tuyến tính có khả năng:

  1. Ước lượng đồng thời 2 kết quả Y1, Y2 (Multivariate regression - hồi quy đa biến : lưu ý: phân biệt với thuật ngữ Multiple regression - hồi quy bội của Pearson)

  2. Cả 2 biến kết quả này đều bị thiếu sót dữ liệu rải rác một cách ngẫu nhiên, với tỉ lệ 10%. Mô hình có khả năng xử lý đồng thời 2 công việc: bổ túc dữ liệu cho Y1, Y2

  3. Trong mô hình có vài hiệp biến số đều bị ảnh hưởng bởi sự thiếu sót ngẫu nhiên dữ liệu với tỉ lệ khác nhau. Mô hình cũng xử lý nốt việc bổ túc dữ liệu cho các biến này

  4. Nội dung của quy trình bổ túc dữ liệu được báo cáo tường minh và hòa hợp với quy trình suy diễn thống kê theo mục đích chính.

Và nhất là:

  1. Tất cả những điều trên đều được làm bằng phương pháp Bayes (chuỗi MCMC).

3 Một thí dụ minh họa đơn giản

Trước hết, ta sẽ thử một bài toán đơn giản, đó là ước lượng chỉ số BMI theo tuổi và Cholesterol level từ bộ dữ liệu NHANES trong package “mice”

library(tidyverse)

data("nhanes", package = "mice")
head(nhanes)%>%knitr::kable()
age bmi hyp chl
1 NA NA NA
2 22.7 1 187
1 NA 1 187
3 NA NA NA
1 20.4 1 113
3 NA NA 184
bar_missing <- function(x){
  library(dplyr)
  library(reshape2)
  library(ggplot2)
  x %>%
    is.na %>%
    melt %>%
    ggplot(data = .,
           aes(x = Var2)) +
    geom_bar(aes(y=(..count..),fill=value),alpha=0.7,color="black")+scale_fill_manual(values=c("gold","red3"),name = "",
                                                                        labels = c("Available","Missing"))+
    theme_minimal()+
    theme(axis.text.x = element_text(angle=45, vjust=0.5)) +
    labs(x = "Variables in Dataset",
         y = "Observations")+coord_flip()
}


matrix_missing <- function(x){
  library(dplyr)
  library(reshape2)
  library(ggplot2)
  x %>%
    is.na %>%
    melt %>%
    ggplot(data = .,
           aes(x = Var1,
               y = Var2)) +
    geom_tile(aes(fill = value),alpha=0.6) +
    scale_fill_manual(values=c("gold","red3"),name = "",
                      labels = c("Available","Missing")) +
    theme_minimal()+
    theme(axis.text.x = element_text(angle=45, vjust=0.5)) +
    labs(y = "Variables in Dataset",
         x = "Total observations")+coord_flip()
}

nhanes%>%bar_missing()

nhanes%>%matrix_missing

Như ta thấy, dữ liệu bị thiếu sót một cách hệ thống và với tỉ lệ khá cao.

Mặt khác, ta có thể thấy bmi có phân phối không bình thường…

nhanes$bmi=as.numeric(nhanes$bmi)

ggplot(nhanes,aes(x=bmi))+
  geom_density(fill="red",alpha=0.5)+
  theme_bw()
## Warning: Removed 9 rows containing non-finite values (stat_density).

ggplot(nhanes,aes(x=chl))+
  geom_density(fill="blue",alpha=0.5)+
  theme_bw()
## Warning: Removed 10 rows containing non-finite values (stat_density).

Với bài toán này, phương pháp giả định mà Nhi muốn làm, đó là: Xây dựng một mô hình hồi quy tuyến tính Bayes ước lượng biến kết quả bmi theo phân bố skew_normal. Mô hình này có khả năng tự bổ túc dữ liệu trống cho BMI dựa vào Age và Chl. Mặt khác, chl cũng bị thiếu sót dữ liệu, do đó đồng thời mô hình cũng tự bổ túc dữ liệu cho chl dựa vào Age là biến duy nhất có đủ dữ liệu.

brms sử dụng một thành phần phụ (additional term) là mi( ) để đưa yếu tố “dữ liệu thiếu sót” vào cả biến kết quả (bmi) và predictors (chl), tiếp theo, mô hình được mở rộng thành một mô hình tập hợp cho phép ước lượng cả predictor (chl) dựa vào 1 predictor khác là age.

Vì lý do minh họa, Nhi chỉ chạy 1 chuỗi MCMC ngắn

library(brms)

bform <- bf(bmi | mi() ~ age * mi(chl),family="skew_normal") +
  bf(chl | mi() ~ age) + set_rescor(FALSE)

mod<- brm(bform,data = nhanes,
          refresh = 0,
          cores = 4,
          iter = 2500, 
          warmup = 500, 
          chains = 1)
## 
## Gradient evaluation took 0 seconds
## 1000 transitions using 10 leapfrog steps per transition would take 0 seconds.
## Adjust your expectations accordingly!
## 
## 
## 
##  Elapsed Time: 3.072 seconds (Warm-up)
##                4.623 seconds (Sampling)
##                7.695 seconds (Total)

Khi xuất kết quả, chúng ta sẽ có những thông tin như sau:

Do mô hình này thực chất có 2 outcome: bmi là outcome chính, chl là outcome phụ, bmi được ước lượng dựa vào age và chl, còn chl được ước lượng dựa vào age. Sau khi bổ túc cho cả 2, suy diễn thống kê được thực hiện

summary(mod)
##  Family: MV(skew_normal, gaussian) 
##   Links: mu = identity; sigma = identity; alpha = identity
##          mu = identity; sigma = identity 
## Formula: bmi | mi() ~ age * mi(chl) 
##          chl | mi() ~ age 
##    Data: nhanes (Number of observations: 25) 
## Samples: 1 chains, each with iter = 2500; warmup = 500; thin = 1;
##          total post-warmup samples = 2000
## 
## Population-Level Effects: 
##               Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
## bmi_Intercept    13.63      7.76    -2.65    29.19        670 1.00
## chl_Intercept   140.62     24.89    93.16   191.17        981 1.00
## bmi_age           0.77      4.96    -8.69    11.15        591 1.00
## chl_age          29.65     13.27     3.35    55.61        953 1.00
## bmi_michl         0.10      0.04     0.03     0.19        749 1.00
## bmi_michl:age    -0.02      0.02    -0.07     0.02        604 1.00
## 
## Family Specific Parameters: 
##           Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
## sigma_bmi     3.20      0.80     2.10     5.15        471 1.00
## sigma_chl    39.77      7.46    28.23    56.83        636 1.00
## alpha_bmi    -2.92      2.97    -8.60     3.01        481 1.00
## 
## Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample 
## is a crude measure of effective sample size, and Rhat is the potential 
## scale reduction factor on split chains (at convergence, Rhat = 1).

Do đây là 1 mô hình Bayes, ta có thể khảo sát các chuỗi MCMC và phân bố hậu nghiệm:

theme_set(theme_bw())

plot(mod)

Từ mô hình, ta có thể suy diễn thống kê trực quan bằng marginal effect plots. Các biểu đồ này dựa vào dữ liệu đã được bổ túc trong quá trình dựng mô hình.

marginal_effects(mod, "age:chl")

Cần lưu ý với các bạn một điểm, đó là chúng ta đang làm việc trên một dữ liệu có cỡ mẫu rất thấp (chỉ có 25 trường hợp). Việc bổ túc dữ liệu trống sử dụng những phương pháp truyền thống là rất khó khăn khi có quá ít dữ liệu như thế này.

4 Một thí dụ khác phức tạp hơn

Bây giờ, chúng ta sẽ tạo ra một bài toán khác với độ khó cao hơn nhiều:

Đây là một nghiên cứu của Nierenberg DW et al. năm 1989 nhằm khảo sát quan hệ giữa nồng độ 2 chất: retinol và beta-carotenetrong máu với một số yếu tố khác.

dat=read.csv("https://www.openml.org/data/get_csv/52623/plasma_retinol.csv")%>%as_tibble()

dat%>%head()%>%knitr::kable()
AGE SEX SMOKSTAT QUETELET VITUSE CALORIES FAT FIBER ALCOHOL CHOLESTEROL BETADIET RETDIET BETAPLASMA RETPLASMA
64 Female Former 21.48380 Yes_fairly_often 1298.8 57.0 6.3 0.0 170.3 1945 890 200 915
76 Female Never 23.87631 Yes_fairly_often 1032.5 50.1 15.8 0.0 75.8 2653 451 124 727
38 Female Former 20.01080 Yes_not_often 2372.3 83.6 19.1 14.1 257.9 6321 660 328 721
40 Female Former 25.14062 No 2449.5 97.5 26.5 0.5 332.6 1061 864 153 615
72 Female Never 20.98504 Yes_fairly_often 1952.1 82.6 16.2 0.0 170.8 2863 1209 92 799
40 Female Former 27.52136 No 1366.9 56.0 9.6 1.3 154.6 1729 1439 148 654

Đây là một mạng lưới tương quan giữa các biến định lượng trong dữ liệu, các mối liên kết liên tục tương ứng với p_value<0.05 của 1 phân tích tương quan Pearson , ngược lại những đoạn đứt khúc có p_value > 0.05 (không có tương quan).

cormat=dat%>%
  dplyr::select(-c(SEX,SMOKSTAT,VITUSE))%>%
  as.matrix()%>%
  scale()

m=as.matrix(cor(cormat,
                method="pearson",
                use="pairwise.complete.obs"))

cor.mtest <- function(mat, ...) {
  mat <- as.matrix(mat)
  n <- ncol(mat)
  p.mat<- matrix(NA, n, n)
  diag(p.mat) <- 0
  for (i in 1:(n - 1)) {
    for (j in (i + 1):n) {
      tmp <- cor.test(mat[, i], mat[, j], ...)
      p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
    }
  }
  colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
  p.mat
}

# matrix of the p-value of the correlation
p.mat <- cor.mtest(cormat)

library(igraph)

diag(p.mat)<-0

library(ggraph)

cg1=data.frame(row=rownames(p.mat)[row(p.mat)[upper.tri(p.mat)]], 
               col=colnames(p.mat)[col(p.mat)[upper.tri(p.mat)]], 
               corr=p.mat[upper.tri(p.mat)])

cg2=data.frame(row=rownames(m)[row(m)[upper.tri(m)]], 
               col=colnames(m)[col(m)[upper.tri(m)]], 
               corr=m[upper.tri(m)])

names(cg1)=c("from","to","pval")
names(cg2)=c("from","to","corr")

cg2$pval=cg1$pval
cg2=cg2%>%mutate(pVal=cg1$pval,Sig=if_else(cg1$pval<0.05,1,0))


theme_bare <- function(base_size=8,base_family="sans"){theme_bw(base_size = base_size, base_family = base_family)+
    theme(
      axis.line = element_blank(), 
      axis.text.x = element_blank(), 
      axis.text.y = element_blank(),
      axis.ticks = element_blank(), 
      axis.title.x = element_blank(), 
      axis.title.y = element_blank(), 
      legend.position = "bottom", 
      panel.background = element_rect(fill = NA), 
      panel.border = element_blank(), 
      panel.grid.major = element_blank(), 
      panel.grid.minor = element_blank(), 
      plot.margin = unit(c(0,0,0,0), "lines")
    )
}

gdf=filter(cg2,pval<0.05)

graph<-graph_from_data_frame(cg2)

ggraph(graph,circular=F,layout="kk")+
  geom_edge_fan(aes(linetype=factor(Sig),col=factor(Sig)),
                width=1,
                show.legend = F,
                alpha=0.5)+
  geom_node_label(aes(label = name))+
  coord_fixed()+
  theme_bare()+
  scale_edge_color_manual(values=c("red","pink"))

Từ mạng lưới này, Nhi đặt ra một giả thuyết cần kiểm chứng, đó là RetPlasma chịu ảnh hưởng của Alcohol và Cholesterol, còn BetaPlasla chỉ chịu ảnh hưởng bởi Alcohol.

2 biến này sẽ được xét như hiệp biến số trong mô hình.

Ta kiểm tra tiếp các biến phân nhóm:

library(ggridges)

levels(dat$SMOKSTAT)<-c("SCU","SFO","NO")

sum_df=dat%>%group_by(SMOKSTAT)%>%
  summarise_at("BETAPLASMA",median)

dat%>%ggplot(aes(x=BETAPLASMA,
                 y=SMOKSTAT,
                 fill=SMOKSTAT,
                 col=SMOKSTAT))+
  geom_density_ridges(alpha=0.6,size=1,scale=1)+
  geom_point(alpha=0.3)+
  geom_point(data=sum_df,aes(x=BETAPLASMA),
             shape=23,size=3,fill="white",stroke=1.2)+
  geom_line(data=sum_df,aes(x=BETAPLASMA,y=SMOKSTAT),group=1)+
  geom_rug(alpha=0.5)+
  coord_flip()+
  scale_color_manual(values=c("#021ce5","#350091","#d8021e"))+
  scale_fill_manual(values=c("#1677ff","#a616ff","#ff1654"))+
  theme_bw()

sum_df=dat%>%group_by(SMOKSTAT)%>%
  summarise_at("RETPLASMA",median)

dat%>%ggplot(aes(x=RETPLASMA,
                 y=SMOKSTAT,
                 fill=SMOKSTAT,
                 col=SMOKSTAT))+
  geom_density_ridges(alpha=0.6,size=1,scale=1)+
  geom_point(alpha=0.3)+
  geom_point(data=sum_df,aes(x=RETPLASMA),
             shape=23,size=3,fill="white",stroke=1.2)+
  geom_line(data=sum_df,aes(x=RETPLASMA,y=SMOKSTAT),group=1)+
  geom_rug(alpha=0.5)+
  coord_flip()+
  scale_color_manual(values=c("#021ce5","#350091","#d8021e"))+
  scale_fill_manual(values=c("#1677ff","#a616ff","#ff1654"))+
  theme_bw()

levels(dat$VITUSE)<-c("NO","YOF","YNO")

sum_df=dat%>%group_by(VITUSE)%>%
  summarise_at("BETAPLASMA",median)

dat%>%ggplot(aes(x=BETAPLASMA,
                 y=VITUSE,
                 fill=VITUSE,
                 col=VITUSE))+
  geom_density_ridges(alpha=0.6,size=1,scale=1)+
  geom_point(alpha=0.3)+
  geom_point(data=sum_df,aes(x=BETAPLASMA),
             shape=23,size=3,fill="white",stroke=1.2)+
  geom_line(data=sum_df,aes(x=BETAPLASMA,y=VITUSE),group=1)+
  geom_rug(alpha=0.5)+
  coord_flip()+
  scale_color_manual(values=c("#021ce5","#350091","#d8021e"))+
  scale_fill_manual(values=c("#1677ff","#a616ff","#ff1654"))+
  theme_bw()

sum_df=dat%>%group_by(VITUSE)%>%
  summarise_at("RETPLASMA",median)

dat%>%ggplot(aes(x=RETPLASMA,
                 y=VITUSE,
                 fill=VITUSE,
                 col=VITUSE))+
  geom_density_ridges(alpha=0.6,size=1,scale=1)+
  geom_point(alpha=0.3)+
  geom_point(data=sum_df,aes(x=RETPLASMA),
             shape=23,size=3,fill="white",stroke=1.2)+
  geom_line(data=sum_df,aes(x=RETPLASMA,y=VITUSE),group=1)+
  geom_rug(alpha=0.5)+
  coord_flip()+
  scale_color_manual(values=c("#021ce5","#350091","#d8021e"))+
  scale_fill_manual(values=c("#1677ff","#a616ff","#ff1654"))+
  theme_bw()

sum_df=dat%>%group_by(SEX)%>%
  summarise_at("BETAPLASMA",median)

dat%>%ggplot(aes(x=BETAPLASMA,
                 y=SEX,
                 fill=SEX,
                 col=SEX))+
  geom_density_ridges(alpha=0.6,size=1,scale=1)+
  geom_point(alpha=0.3)+
  geom_point(data=sum_df,aes(x=BETAPLASMA),
             shape=23,size=3,fill="white",stroke=1.2)+
  geom_line(data=sum_df,aes(x=BETAPLASMA,y=SEX),group=1)+
  geom_rug(alpha=0.5)+
  coord_flip()+
  scale_color_manual(values=c("#021ce5","#d8021e"))+
  scale_fill_manual(values=c("#1677ff","#ff1654"))+
  theme_bw()
## Picking joint bandwidth of 35.3

sum_df=dat%>%group_by(SEX)%>%
  summarise_at("RETPLASMA",median)

dat%>%ggplot(aes(x=BETAPLASMA,
                 y=SEX,
                 fill=SEX,
                 col=SEX))+
  geom_density_ridges(alpha=0.6,size=1,scale=1)+
  geom_point(alpha=0.3)+
  geom_point(data=sum_df,aes(x=RETPLASMA),
             shape=23,size=3,fill="white",stroke=1.2)+
  geom_line(data=sum_df,aes(x=RETPLASMA,y=SEX),group=1)+
  geom_rug(alpha=0.5)+
  coord_flip()+
  scale_color_manual(values=c("#021ce5","#d8021e"))+
  scale_fill_manual(values=c("#1677ff","#ff1654"))+
  theme_bw()
## Picking joint bandwidth of 35.3

Kết quả cho thấy có vẻ như yếu tố Sử dụng Vitamin (Vituse) và Thói quen hút thuốc gây ra hiệu ứng yếu đối với nồng độ Beta carotene và Retinol plasma. Trong khi đó Giới tính có hiệu ứng mạnh hơn.

Tiếp theo, ta mô phỏng một bài toán giả định như sau:

Mục tiêu của chúng ta là khảo sát đồng thời cả 2 biến: Retinol Plasma và BetaPlasma, tùy theo Tuổi, Giới tính, Thói quen hút thuốc và Việc sử dụng Vitamin. Bốn biến này có đầy đủ dữ liệu với giả định là các thông tin này rất dễ thu thập.

Trong khi đó, những biến có bản chất là kết quả xét nghiệm, thí dụ Cholesterol, Alcohol, và bản thân RetPlasma hay BetaPlasma có nguy cơ thiếu sót dữ liệu cao hơn, việc thiếu sót là ngẫu nhiên và với tỉ lệ từ 10-20%…

Nhi viết 1 hàm để mô phỏng sự thiếu sót dữ liệu này:

rand.NA <- function(vect,na.prob=0.1){
  na.freq=round(na.prob*length(vect))
  vect[sample(seq(vect),na.freq)] <- NA
  return(vect)
}

misdf=dat%>%mutate(
  ALCOHOL=rand.NA(dat$ALCOHOL,0.2),
  CHOLESTEROL=rand.NA(dat$CHOLESTEROL,0.15),
  BETAPLASMA=rand.NA(dat$BETAPLASMA,0.1),
  RETPLASMA=rand.NA(dat$RETPLASMA,0.15)
)

misdf%>%bar_missing()

misdf%>%matrix_missing

Sau khi đục dữ liệu thủng lỗ chỗ một cách ngẫu nhiên, chúng ta sẽ xây dựng mô hình với nội dung như sau:

  1. Đây là một mô hình hồi quy đa biến, ước lượng đồng thời 2 biến kết quả là Betaplasma và RetPlasma.

  2. Mô hình được tích hợp khả năng tự động bổ túc dữ liệu cho 2 biến kết quả khi thiếu sót

  3. Sau khi được bổ túc, 2 biến kết quả được giả định phụ thuộc vào Tuổi, Giới tính, thói quen hút thuốc, dùng vitamin, và 2 hiệp biến khác là Alcohol và Cholesterol.

  4. Bản thân 2 biến Alcohol và Cholesterol cũng bị thiếu dữ liệu, và ta muốn mô hình tự bổ túc cho chúng dựa vào Tuổi, Giới tính.

  5. Tất cả biến số trong mô hình được giả định có phân phối Gaussian

bform<-bf(cbind(BETAPLASMA,RETPLASMA)|mi()~
            AGE+SEX+SMOKSTAT+VITUSE+
            mi(ALCOHOL)+
            mi(CHOLESTEROL))+
  bf(ALCOHOL|mi()~AGE+SEX)+
  bf(CHOLESTEROL|mi()~AGE+SEX)

Ta sẽ compile mô hình vào STAN và kích hoạt sampler để bắt đầu tạo các chuỗi MCMC

fit_imp <- brm(bform, data = misdf,
          refresh = 0,
          cores = 4,
          iter = 2500, 
          warmup = 500, 
          chains = 1)
## 
## Gradient evaluation took 0 seconds
## 1000 transitions using 10 leapfrog steps per transition would take 0 seconds.
## Adjust your expectations accordingly!
## 
## 
## 
##  Elapsed Time: 11.742 seconds (Warm-up)
##                4.367 seconds (Sampling)
##                16.109 seconds (Total)
library(broom)

tidyMCMC(fit_imp, conf.int = TRUE, conf.method = "HPDinterval")
##                             term      estimate    std.error     conf.low
## 1         b_BETAPLASMA_Intercept  79.016888899  55.13732004  -16.6660200
## 2          b_RETPLASMA_Intercept 451.120800236  61.22665679  328.1567528
## 3            b_ALCOHOL_Intercept   2.149736100   3.01187090   -4.4089218
## 4        b_CHOLESTEROL_Intercept 316.918975622  28.46751869  257.8818976
## 5               b_BETAPLASMA_AGE   1.003183155   0.81449656   -0.6151619
## 6           b_BETAPLASMA_SEXMale -41.423716613  36.33381417 -106.8401850
## 7       b_BETAPLASMA_SMOKSTATSFO  49.193496427  34.63643383  -12.3064568
## 8        b_BETAPLASMA_SMOKSTATNO  49.910395616  34.43778556  -15.6181678
## 9         b_BETAPLASMA_VITUSEYOF  97.063059465  25.97963504   45.2403353
## 10        b_BETAPLASMA_VITUSEYNO  44.518578287  29.98813239  -16.3048466
## 11               b_RETPLASMA_AGE   2.409039573   0.90486566    0.6751639
## 12           b_RETPLASMA_SEXMale  97.550330514  39.60889989   22.4018413
## 13       b_RETPLASMA_SMOKSTATSFO  71.814940302  39.43802806   -8.1450367
## 14        b_RETPLASMA_SMOKSTATNO -13.993726501  39.52584527  -85.6353973
## 15         b_RETPLASMA_VITUSEYOF  11.828477493  30.39140368  -51.3154672
## 16         b_RETPLASMA_VITUSEYNO  27.871068854  32.18994191  -37.2845901
## 17                 b_ALCOHOL_AGE  -0.004971318   0.05919921   -0.1205300
## 18             b_ALCOHOL_SEXMale   9.513511038   2.58894426    4.7403138
## 19             b_CHOLESTEROL_AGE  -1.736427499   0.56036157   -2.7752570
## 20         b_CHOLESTEROL_SEXMale 117.278666112  23.37579088   73.3958236
## 21      bsp_BETAPLASMA_miALCOHOL   0.789707516   0.94111168   -1.0787492
## 22  bsp_BETAPLASMA_miCHOLESTEROL  -0.120218190   0.08851138   -0.2919132
## 23       bsp_RETPLASMA_miALCOHOL  -0.686172770   1.07301031   -2.8343945
## 24   bsp_RETPLASMA_miCHOLESTEROL  -0.064821032   0.11556331   -0.2977793
## 25              sigma_BETAPLASMA 183.564232955   8.03059489  169.6895770
## 26               sigma_RETPLASMA 199.937193684   8.74130420  184.0037584
## 27                 sigma_ALCOHOL  13.015742293   0.59364731   11.9207855
## 28             sigma_CHOLESTEROL 129.827570846   5.45968190  119.1326584
## 29             Ymi_BETAPLASMA[3] 191.559209648 186.62222871 -171.1059502
## 30            Ymi_BETAPLASMA[18] 242.519182422 186.78942109  -96.5189094
## 31            Ymi_BETAPLASMA[32] 166.820524264 189.20019517 -216.8028114
## 32            Ymi_BETAPLASMA[63] 246.431133928 187.91628907  -84.0522234
## 33            Ymi_BETAPLASMA[71] 218.143359699 185.99437634 -167.8644835
## 34           Ymi_BETAPLASMA[103]  97.226641329 187.90163452 -263.6250828
## 35           Ymi_BETAPLASMA[125] 185.533628937 184.13872581 -178.3740269
## 36           Ymi_BETAPLASMA[131] 170.366333495 184.38454121 -173.7981140
## 37           Ymi_BETAPLASMA[143] 240.032656293 187.83641743  -87.5351421
## 38           Ymi_BETAPLASMA[162] 202.621382950 188.76368752 -160.7348267
## 39           Ymi_BETAPLASMA[167] 150.273853686 189.60742598 -195.7177981
## 40           Ymi_BETAPLASMA[173] 259.612911213 184.90819145 -110.0001629
## 41           Ymi_BETAPLASMA[174] 157.745893619 187.88664549 -206.9632049
## 42           Ymi_BETAPLASMA[197] 150.460810139 184.52496610 -187.4337056
## 43           Ymi_BETAPLASMA[200] 273.581987721 174.71440071  -64.7474952
## 44           Ymi_BETAPLASMA[201] 206.545462988 184.16526565 -143.5195807
## 45           Ymi_BETAPLASMA[205] 232.192634947 187.44847046 -102.2225511
## 46           Ymi_BETAPLASMA[214] 249.592550518 183.55020063  -82.4444147
## 47           Ymi_BETAPLASMA[222] 187.433090031 184.05268251 -151.1355901
## 48           Ymi_BETAPLASMA[239]  79.264768836 192.26340892 -291.8387739
## 49           Ymi_BETAPLASMA[240] 191.337505684 180.80685316 -180.4920694
## 50           Ymi_BETAPLASMA[245] 144.589274330 190.08670656 -222.9293208
## 51           Ymi_BETAPLASMA[252] 160.307227773 183.94014155 -224.2542885
## 52           Ymi_BETAPLASMA[253] 140.119474309 179.32037024 -193.7951139
## 53           Ymi_BETAPLASMA[256] 192.013332914 189.14623175 -172.9111793
## 54           Ymi_BETAPLASMA[259] 167.077600550 185.86905028 -210.0387191
## 55           Ymi_BETAPLASMA[273] 160.710997393 190.79234211 -244.4477581
## 56           Ymi_BETAPLASMA[294] 156.424091733 189.73956261 -236.4425225
## 57           Ymi_BETAPLASMA[301] 171.040893009 185.29194895 -179.6296037
## 58           Ymi_BETAPLASMA[305] 177.120452306 189.62092715 -220.7517715
## 59           Ymi_BETAPLASMA[310] 192.464196644 192.66795276 -189.2781270
## 60           Ymi_BETAPLASMA[312] 249.846622855 188.60537191 -107.0648768
## 61              Ymi_RETPLASMA[4] 599.385144865 202.08891037  227.9157845
## 62             Ymi_RETPLASMA[26] 558.096730333 206.93716821  180.6019387
## 63             Ymi_RETPLASMA[50] 548.775744240 200.06766422  179.2322871
## 64             Ymi_RETPLASMA[51] 542.328601608 201.06355884  180.1408656
## 65             Ymi_RETPLASMA[56] 505.126312848 201.22438934  133.2903807
## 66             Ymi_RETPLASMA[59] 540.484680927 203.47395964  109.4107147
## 67             Ymi_RETPLASMA[60] 521.447934402 200.13464452  113.5331239
## 68             Ymi_RETPLASMA[64] 774.449297173 199.88590351  428.1167336
## 69             Ymi_RETPLASMA[69] 693.615030806 207.08368725  271.0272327
## 70             Ymi_RETPLASMA[70] 572.834786191 199.78360981  157.6065559
## 71             Ymi_RETPLASMA[84] 468.423056332 208.52840617   77.4632141
## 72             Ymi_RETPLASMA[86] 624.401832711 200.44263020  227.4749514
## 73             Ymi_RETPLASMA[87] 596.065362909 203.29337395  196.3132857
## 74             Ymi_RETPLASMA[93] 626.264913171 196.19707655  237.8601305
## 75             Ymi_RETPLASMA[95] 606.512650881 201.46733032  238.8172455
## 76             Ymi_RETPLASMA[99] 630.455649536 198.73890393  246.3159593
## 77            Ymi_RETPLASMA[102] 793.743949199 206.61815713  398.2755575
## 78            Ymi_RETPLASMA[106] 748.760996348 200.68945459  371.0926866
## 79            Ymi_RETPLASMA[117] 568.078322978 204.27084241  158.1680108
## 80            Ymi_RETPLASMA[127] 603.342454502 207.66791322  207.4208994
## 81            Ymi_RETPLASMA[128] 492.588614185 205.62824608  111.5528489
## 82            Ymi_RETPLASMA[144] 483.317643600 213.70642659   48.3474217
## 83            Ymi_RETPLASMA[145] 705.950206148 201.51029781  267.3470386
## 84            Ymi_RETPLASMA[146] 524.443009788 204.42986754  109.9963225
## 85            Ymi_RETPLASMA[148] 636.886237564 191.97875800  271.4931632
## 86            Ymi_RETPLASMA[152] 525.468778081 220.97139496   81.5733187
## 87            Ymi_RETPLASMA[158] 582.060722136 206.14652410  196.6436403
## 88            Ymi_RETPLASMA[161] 617.397447166 205.37943442  227.9414142
## 89            Ymi_RETPLASMA[170] 574.367161335 203.30273480  174.9379006
## 90            Ymi_RETPLASMA[195] 575.696866343 203.01874810  176.2873676
## 91            Ymi_RETPLASMA[203] 551.690545002 207.33044788  151.7422436
## 92            Ymi_RETPLASMA[210] 529.016486101 204.84186566   94.3351272
## 93            Ymi_RETPLASMA[212] 591.518722206 205.97104097  142.5396227
## 94            Ymi_RETPLASMA[225] 534.456506802 198.95952370  164.9013864
## 95            Ymi_RETPLASMA[228] 505.466311554 204.16895940   91.4360087
## 96            Ymi_RETPLASMA[244] 588.910536854 204.07219114  192.3497818
## 97            Ymi_RETPLASMA[246] 707.492857820 196.75634033  335.2527421
## 98            Ymi_RETPLASMA[251] 581.198584883 200.90154441  191.1043250
## 99            Ymi_RETPLASMA[264] 565.805006641 202.36838669  162.7731622
## 100           Ymi_RETPLASMA[271] 564.084329211 201.69765969  162.0765169
## 101           Ymi_RETPLASMA[272] 542.214950489 194.54482639  165.0406033
## 102           Ymi_RETPLASMA[287] 609.539444031 195.98634705  243.9134049
## 103           Ymi_RETPLASMA[293] 576.039180267 203.03196254  214.5936498
## 104           Ymi_RETPLASMA[299] 610.894736180 202.77940257  215.8681756
## 105           Ymi_RETPLASMA[300] 526.539237173 209.30598077  134.9215179
## 106           Ymi_RETPLASMA[301] 621.380923473 204.55104874  230.3945573
## 107           Ymi_RETPLASMA[311] 609.706438796 201.29256450  207.6616813
## 108              Ymi_ALCOHOL[11]   0.761142381  12.93767188  -26.0231734
## 109              Ymi_ALCOHOL[20]   8.331218669  13.63266295  -18.3918970
## 110              Ymi_ALCOHOL[25]   0.804564767  12.96543151  -24.2981893
## 111              Ymi_ALCOHOL[28]   3.292490955  13.48258056  -23.1460671
## 112              Ymi_ALCOHOL[31]   1.161201685  12.52731218  -22.7182636
## 113              Ymi_ALCOHOL[37]   2.194063670  13.10982459  -24.7350374
## 114              Ymi_ALCOHOL[39]  12.188788134  12.97952686  -12.9194398
## 115              Ymi_ALCOHOL[42]   1.197761358  12.43085167  -21.4587950
## 116              Ymi_ALCOHOL[46]   0.884921029  13.19198785  -24.2422807
## 117              Ymi_ALCOHOL[47]   1.961986601  13.38263649  -26.1067411
## 118              Ymi_ALCOHOL[51]   2.619734835  13.21120165  -22.7444608
## 119              Ymi_ALCOHOL[69]   1.397247749  12.88272614  -22.8450527
## 120              Ymi_ALCOHOL[70]   1.605470494  13.78627902  -27.2240639
## 121              Ymi_ALCOHOL[71]   1.575580803  12.92485193  -24.3063448
## 122              Ymi_ALCOHOL[75]  11.905749382  13.66905841  -16.2253167
## 123              Ymi_ALCOHOL[76]   1.904619005  13.51260239  -23.8557311
## 124              Ymi_ALCOHOL[77]   1.491930819  12.73041729  -24.8776681
## 125              Ymi_ALCOHOL[79]   2.702568747  13.37303956  -24.0202212
## 126              Ymi_ALCOHOL[80]  10.128044808  13.47361579  -17.1159896
## 127              Ymi_ALCOHOL[83]  10.591706174  13.52174156  -16.3091568
## 128              Ymi_ALCOHOL[93]   1.368389724  13.28787251  -25.1424126
## 129              Ymi_ALCOHOL[94]  11.835738348  12.72896304  -12.7870946
## 130              Ymi_ALCOHOL[95]   1.328633426  13.39188228  -23.2610997
## 131              Ymi_ALCOHOL[98]   2.042241460  13.04475257  -23.9857133
## 132              Ymi_ALCOHOL[99]   2.036654932  12.60380083  -22.2021595
## 133             Ymi_ALCOHOL[105]  12.122021224  13.26157003  -14.6820140
## 134             Ymi_ALCOHOL[109]   2.401143607  12.88264079  -22.6660374
## 135             Ymi_ALCOHOL[112]   1.121860494  12.79891445  -23.9863399
## 136             Ymi_ALCOHOL[118]   2.692110743  12.87533806  -22.9008467
## 137             Ymi_ALCOHOL[119]   2.024578482  12.96520402  -24.4966610
## 138             Ymi_ALCOHOL[123]  10.810136106  13.40244320  -14.4140997
## 139             Ymi_ALCOHOL[126]   2.760647993  12.48231685  -22.2604664
## 140             Ymi_ALCOHOL[128]   1.109921458  13.48999618  -24.8980217
## 141             Ymi_ALCOHOL[133]  11.785380425  13.67757372  -13.5024722
## 142             Ymi_ALCOHOL[145]  11.277910319  13.14885173  -15.1763635
## 143             Ymi_ALCOHOL[159]   2.099247626  12.86070565  -22.0571740
## 144             Ymi_ALCOHOL[163]   4.128702983  13.19846230  -19.7484874
## 145             Ymi_ALCOHOL[171]   2.167465618  13.12046604  -26.2129079
## 146             Ymi_ALCOHOL[181]   2.237653998  12.66526743  -21.2554407
## 147             Ymi_ALCOHOL[185]   1.786770951  13.32175105  -24.0864295
## 148             Ymi_ALCOHOL[200]   2.405946211  12.94125218  -22.1980983
## 149             Ymi_ALCOHOL[211]   1.102179098  13.05029870  -24.4566156
## 150             Ymi_ALCOHOL[212]   1.981050475  13.09792921  -24.1457329
## 151             Ymi_ALCOHOL[218]   1.977443870  13.03894361  -20.8570045
## 152             Ymi_ALCOHOL[220]   2.550282115  13.50306258  -23.4859067
## 153             Ymi_ALCOHOL[238]   1.844502689  12.93506921  -22.4589087
## 154             Ymi_ALCOHOL[239]   2.080389159  12.98314192  -22.2502614
## 155             Ymi_ALCOHOL[240]   2.436886791  13.34505064  -23.6693126
## 156             Ymi_ALCOHOL[242]   1.795782923  12.19273810  -24.0320237
## 157             Ymi_ALCOHOL[244]   1.892781802  12.86359810  -25.0723209
## 158             Ymi_ALCOHOL[247]   1.889298230  12.92782879  -21.8914839
## 159             Ymi_ALCOHOL[249]   1.688510506  13.24963712  -23.3109710
## 160             Ymi_ALCOHOL[250]   2.048358174  12.98199288  -22.9019741
## 161             Ymi_ALCOHOL[254]   2.502910091  12.76360306  -25.8394465
## 162             Ymi_ALCOHOL[255]   3.095028379  12.94311698  -21.2973520
## 163             Ymi_ALCOHOL[265]   1.060850392  13.15027711  -24.8348702
## 164             Ymi_ALCOHOL[268]   2.344293715  12.88605932  -22.5937875
## 165             Ymi_ALCOHOL[270]   2.787898618  12.97146975  -22.9337621
## 166             Ymi_ALCOHOL[275]   2.370353238  13.16057627  -25.3938650
## 167             Ymi_ALCOHOL[299]   2.268810906  13.05533339  -20.9616212
## 168             Ymi_ALCOHOL[308]   0.885570948  13.41882546  -25.2546685
## 169             Ymi_ALCOHOL[309]   1.017466185  13.49421029  -24.1680851
## 170             Ymi_ALCOHOL[315]   1.074581102  13.21214995  -23.3784816
## 171           Ymi_CHOLESTEROL[8] 221.355829776 127.01635373   -7.9027349
## 172          Ymi_CHOLESTEROL[20] 303.527170358 137.64180961   39.6653533
## 173          Ymi_CHOLESTEROL[24] 220.318018128 127.78807833  -31.1299003
## 174          Ymi_CHOLESTEROL[30] 305.818301017 127.84033625   59.0340984
## 175          Ymi_CHOLESTEROL[33] 184.641307523 128.53479223  -63.3524576
## 176          Ymi_CHOLESTEROL[50] 230.429831349 127.55070247  -17.8789812
## 177          Ymi_CHOLESTEROL[53] 205.822502384 130.06448206  -32.7862889
## 178          Ymi_CHOLESTEROL[55] 250.711895773 129.21000815   22.5226729
## 179          Ymi_CHOLESTEROL[65] 183.770925028 130.05850771  -60.0834576
## 180          Ymi_CHOLESTEROL[79] 262.236599174 126.04722997   21.8345532
## 181          Ymi_CHOLESTEROL[92] 223.338582274 128.21175638  -24.6011526
## 182          Ymi_CHOLESTEROL[93] 185.958679628 129.79709653  -68.6874871
## 183          Ymi_CHOLESTEROL[98] 253.892807632 125.98914375   11.5201631
## 184         Ymi_CHOLESTEROL[105] 309.336350880 133.75418988   39.0832655
## 185         Ymi_CHOLESTEROL[108] 245.318997376 125.38549395   -7.0153580
## 186         Ymi_CHOLESTEROL[115] 250.816214448 127.27312961    0.7687204
## 187         Ymi_CHOLESTEROL[129] 232.344685971 131.38671539    1.6408090
## 188         Ymi_CHOLESTEROL[133] 298.269149248 133.93881269   17.7128877
## 189         Ymi_CHOLESTEROL[136] 191.789340457 128.97305825  -66.5200145
## 190         Ymi_CHOLESTEROL[137] 233.407610937 127.13154256   -9.9111703
## 191         Ymi_CHOLESTEROL[141] 241.551632460 130.98223816   -4.0916436
## 192         Ymi_CHOLESTEROL[143] 254.389849524 129.48803028   -9.6887263
## 193         Ymi_CHOLESTEROL[146] 242.007624609 129.90972930   12.5124583
## 194         Ymi_CHOLESTEROL[153] 187.479574271 126.20306394  -59.9920290
## 195         Ymi_CHOLESTEROL[159] 256.894763733 133.31829836  -19.5734718
## 196         Ymi_CHOLESTEROL[180] 269.712826355 129.65030638   10.2971002
## 197         Ymi_CHOLESTEROL[185] 242.154948756 122.81154291   -9.5307431
## 198         Ymi_CHOLESTEROL[190] 262.718989807 131.33170198    5.1953476
## 199         Ymi_CHOLESTEROL[193] 237.423000380 126.37252315   -6.3986803
## 200         Ymi_CHOLESTEROL[207] 263.034933971 132.00723380   -8.7541860
## 201         Ymi_CHOLESTEROL[210] 253.496902822 131.59420006    6.8809496
## 202         Ymi_CHOLESTEROL[239] 258.616263227 132.19592207   17.1655926
## 203         Ymi_CHOLESTEROL[241] 258.244024280 126.97118065  -24.0019082
## 204         Ymi_CHOLESTEROL[244] 227.383375035 126.28984990  -16.2542868
## 205         Ymi_CHOLESTEROL[247] 249.840663799 126.57724066    5.7891836
## 206         Ymi_CHOLESTEROL[253] 252.375391622 134.26453042   -1.2181130
## 207         Ymi_CHOLESTEROL[263] 148.341627215 131.72399018 -114.1782250
## 208         Ymi_CHOLESTEROL[267] 259.445077421 135.75427316  -10.0504168
## 209         Ymi_CHOLESTEROL[268] 189.928144439 128.88703906  -60.7852817
## 210         Ymi_CHOLESTEROL[274] 194.555688435 135.50735164  -60.3254198
## 211         Ymi_CHOLESTEROL[277] 226.396945384 130.01896065  -34.5748377
## 212         Ymi_CHOLESTEROL[279] 257.398856110 128.26780060    2.7461877
## 213         Ymi_CHOLESTEROL[291] 235.128416800 128.93017286    1.0874723
## 214         Ymi_CHOLESTEROL[300] 243.362128380 129.79598677    1.8442335
## 215         Ymi_CHOLESTEROL[307] 199.876880263 131.19495593  -40.4516218
## 216         Ymi_CHOLESTEROL[312] 246.117005704 127.43674834    2.1076160
## 217         Ymi_CHOLESTEROL[314] 264.332774258 127.78996612   34.5301926
##         conf.high
## 1    201.53306061
## 2    565.90028736
## 3      7.39855297
## 4    369.85104149
## 5      2.54317869
## 6     37.93802576
## 7    123.12550716
## 8    116.92585388
## 9    146.46666145
## 10   100.36721262
## 11     4.17593314
## 12   174.26033434
## 13   144.60593360
## 14    64.10869682
## 15    67.79413377
## 16    87.08147394
## 17     0.10793658
## 18    14.74223549
## 19    -0.53225211
## 20   162.58147238
## 21     2.56646142
## 22     0.05900229
## 23     1.32845150
## 24     0.14254264
## 25   200.19486272
## 26   217.30165067
## 27    14.17468118
## 28   140.15784846
## 29   562.29393239
## 30   621.59973556
## 31   515.85073166
## 32   630.35843025
## 33   552.89853525
## 34   467.20966604
## 35   541.33068637
## 36   545.60007167
## 37   656.09960275
## 38   572.74506328
## 39   544.48823355
## 40   628.71525202
## 41   514.78699622
## 42   523.90642664
## 43   612.90164721
## 44   549.82519676
## 45   638.50804317
## 46   609.72635355
## 47   562.05601055
## 48   460.23087007
## 49   518.18525322
## 50   517.51647910
## 51   506.68286820
## 52   499.69665452
## 53   563.17452456
## 54   520.64440711
## 55   519.67435723
## 56   502.87393364
## 57   548.24842970
## 58   526.09641830
## 59   556.45406694
## 60   612.79118174
## 61  1011.22477868
## 62   991.37467297
## 63   982.29826567
## 64   965.10877752
## 65   901.71559078
## 66   904.69042725
## 67   893.83888610
## 68  1218.33071162
## 69  1074.63864092
## 70   942.05489548
## 71   871.72642755
## 72  1018.29740508
## 73   970.83183794
## 74  1006.63537181
## 75  1015.89749963
## 76  1025.89396486
## 77  1206.89859675
## 78  1140.35074100
## 79   972.71440686
## 80  1032.94449260
## 81   899.61287715
## 82   892.98228346
## 83  1053.72493806
## 84   904.10473355
## 85  1015.64335031
## 86   943.08273217
## 87  1000.61155661
## 88  1053.82448762
## 89   951.58093925
## 90   977.93227754
## 91   969.03162458
## 92   917.24668617
## 93   971.29646396
## 94   930.44096251
## 95   906.95697105
## 96   981.17044882
## 97  1090.66571485
## 98   976.96881391
## 99   965.49897819
## 100  949.81767799
## 101  911.71670688
## 102 1023.88743054
## 103  997.97192656
## 104 1010.80742747
## 105  951.93028437
## 106 1042.24995174
## 107  998.75662550
## 108   23.98396635
## 109   35.87426332
## 110   25.80538240
## 111   28.63344657
## 112   25.79372470
## 113   27.25829649
## 114   37.56772237
## 115   26.06789596
## 116   26.83859125
## 117   25.10317889
## 118   27.48345778
## 119   26.53268923
## 120   27.01031008
## 121   25.62821518
## 122   36.96187734
## 123   27.96464657
## 124   24.48448307
## 125   28.65236306
## 126   35.56278131
## 127   35.08662617
## 128   26.95975606
## 129   36.38666163
## 130   29.59059956
## 131   27.57464236
## 132   26.86817211
## 133   36.91715868
## 134   27.16453772
## 135   25.31033704
## 136   26.62473554
## 137   26.88523817
## 138   37.84621100
## 139   27.22060298
## 140   28.14205576
## 141   38.52333987
## 142   36.08207201
## 143   27.15207413
## 144   31.66852425
## 145   25.05338511
## 146   27.77226715
## 147   26.34617453
## 148   27.91928136
## 149   27.14058220
## 150   27.70344036
## 151   30.29476703
## 152   26.99904849
## 153   27.11709287
## 154   27.16074201
## 155   28.53210835
## 156   24.70323908
## 157   26.18844238
## 158   28.41101508
## 159   28.17044270
## 160   26.94218872
## 161   25.16210392
## 162   29.60987022
## 163   25.60257340
## 164   26.99736951
## 165   28.45051084
## 166   26.33207331
## 167   29.75994228
## 168   26.48839487
## 169   28.39639912
## 170   27.07396822
## 171  489.52214375
## 172  574.35215318
## 173  460.77781536
## 174  568.09569858
## 175  432.64767993
## 176  472.30782188
## 177  482.44464810
## 178  513.98301934
## 179  447.70044460
## 180  526.32871130
## 181  470.86566972
## 182  424.05269871
## 183  509.06173138
## 184  564.25974136
## 185  474.53338698
## 186  493.98078715
## 187  492.97132748
## 188  536.47310008
## 189  442.75789419
## 190  479.67179486
## 191  487.71530818
## 192  491.08885025
## 193  514.04464849
## 194  427.59703301
## 195  496.46501602
## 196  513.88395847
## 197  479.69551430
## 198  513.49088706
## 199  485.22178990
## 200  503.01483837
## 201  515.91528471
## 202  524.64137506
## 203  477.08290204
## 204  469.45152294
## 205  486.78281977
## 206  523.06608648
## 207  396.03936489
## 208  535.98117415
## 209  438.60517225
## 210  461.34916196
## 211  481.15594092
## 212  505.31839154
## 213  493.72905564
## 214  512.24221183
## 215  474.11191027
## 216  499.46913933
## 217  525.55722393
plot(fit_imp)

marginal_effects(fit_imp)

5 Nhận xét

Tính năng tự động bổ túc dữ liệu mà brms cung cấp là một ý tưởng thú vị.

Một số ưu điểm của cách làm này bao gồm:

  1. Chỉ sử dụng một algorithm duy nhất trong toàn bộ quy trình, đó là hồi quy tuyến tính Bayes.

  2. Kết quả cho từng mô hình (chính, phụ) được trình bày tường minh, không phải blackbox. Nghiên cứu sinh có thể giải thích cơ chế của việc bổ túc dữ liệu một cách rõ ràng, chi tiết.

  3. Hòa hợp được quy trình bổ túc dữ liệu và suy diễn Bayes cho hiệu ứng chính đối với biến kết quả.

  4. Hoạt động được trên dữ liệu có cỡ mẫu hạn chế, thậm chí rất hạn chế, vì phương pháp Bayes cho phép điều này

  5. Bổ túc dữ liệu cho biến kết quả, thậm chí nhiều biến kết quả đồng thời trong 1 mô hình duy nhất.

Thực ra không có gì kì lạ, quy trình này có bản chất là một mô hình tập hợp (ensemble) gồm nhiều bộ phận liên kết với nhau theo thứ bậc.

Đầu tiên, brms sẽ tìm cách bổ túc dữ liệu của các predictor trong những mô hình phụ (cũng là hồi quy tuyến tính) dựa vào 1 hay nhiều predictor khác có ĐỦ dữ liệu (đây là nhược điểm của cách làm này, vì nó không linh hoạt bằng các algorithm Machine learning khác như knn hay random forest, predictor dùng để bổ túc dữ liệu bắt buộc phải đầy đủ). Có vẻ như brms chưa cho phép bổ túc dữ liệu của biến định tính/thứ hạng (categorical và ordinal), nó cũng chưa cho phép bổ túc dữ liệu sử dụng những phân phối phức tạp, gaussian là lựa chọn an toàn nhất nếu không sampler có thể bó tay và mô hình không converge được.

Sau khi bổ túc xong các predictor, mô hình chính sẽ bổ túc dữ liệu cho 1 hay nhiều biến kết quả (outcomes), mô hình sau cùng được tạo ra.

Tuy còn nhiều nhược điểm và lỗ hổng về giả định, đây là một cách làm dễ dàng, tiện lợi đáng được thử nghiệm cho những nghiên cứu diễn dịch đơn giản với cỡ mẫu thấp. Mặt khác, ta đang dùng phương pháp Bayes, tất cả các tham số beta trong mô hình đều được xác định dựa vào định lý Bayes như ta đã biết, và ta sẽ có phân phối hậu nghiệm.

Tạm biệt các bạn.

LS0tDQp0aXRsZTogIk3DtCBow6xuaCBCYXllcyB04buxIGLhu5UgdMO6YyBk4buvIGxp4buHdSB0cuG7kW5nIg0KYXV0aG9yOiAiTMOqIE5n4buNYyBLaOG6oyBOaGkiDQpkYXRlOiAiMDkgVGjDoW5nIDYgMjAxOCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJkZWZhdWx0Ig0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIVtdKGJybXNpbXB1dGF0aW9uLnBuZykNCg0KIyBHaeG7m2kgdGhp4buHdSANCg0KVGhp4bq/dSBzw7N0IGThu68gbGnhu4d1IChtaXNzaW5nIHZhbHVlKSBsw6AgbeG7mXQgduG6pW4gxJHhu4Ega2jDsyBjaOG7i3Uga2hpIGzDoG0gbmdoacOqbiBj4bupdSB5IGjhu41jIGzDom0gc8OgbmcuIFRyb25nIG3hu5l0IHPhu5EgdHLGsOG7nW5nIGjhu6NwIGzDvSB0xrDhu59uZywgbuG6v3UgZOG7ryBsaeG7h3UgYuG7iyBt4bqldCBtw6F0IGPDsyDDvSBuZ2jEqWEga2jDoWNoIHF1YW4gKHRow60gZOG7pSBjw6FjIMSR4bqhaSBsxrDhu6NuZyBzaW5oIGjhu41jKSwgeOG6o3kgcmEgbeG7mXQgY8OhY2ggbmfhuqt1IG5oacOqbiB2w6AgduG7m2kgdOG7iSBs4buHIGtow7RuZyBxdcOhIGNhbywgY2jDum5nIHRhIGPDsyB0aOG7gyBz4butIGThu6VuZyBt4buZdCBtw7QgaMOsbmggaOG7k2kgcXV5IMSR4buDIGLhu5UgdMO6YyBjw6FjIHRyxrDhu51uZyBo4bujcCB0aGnhur91IHPDs3QgY+G7p2EgbeG7mXQgYmnhur9uIGThu7FhIHbDoG8gcXVhbiBo4buHIGdp4buvYSBiaeG6v24gbsOgeSB2w6Agbmjhu69uZyBiaeG6v24gY8OybiBs4bqhaSB0cm9uZyBk4buvIGxp4buHdS4NCg0KTmhp4buBdSBjw7RuZyBj4bulICBraMOhIG3huqFuaCB0cm9uZyBSIGNobyBwaMOpcCBi4buVIHTDumMgZOG7ryBsaeG7h3UsIHRow60gZOG7pSBuaMawIG1pY2UsIGNhcmV0LCByZWNpcGVzLiBC4bqhbiBjxaluZyBjw7MgdGjhu4MgdOG7sSBtw6xuaCBi4buVIHTDumMgdGjhu6cgY8O0bmcgY2hvIHThu6tuZyBiaeG6v24gYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIG3hu5l0IHRodeG6rXQgdG/DoW4gTWFjaGluZSBsZWFybmluZyB0w7l5IGNo4buNbiBuw6BvIMSRw7MsIHRow60gZOG7pSBLTk4sIHJhbmRvbSBmb3Jlc3QsIC4uLiANCg0KTeG6t3Qga2jDoWMsIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCB0aMaw4budbmcgxJHGsOG7o2Mgw6FwIGThu6VuZyBraGkgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgbmjGsCBt4buZdCBjw7RuZyBj4bulIHN1eSBkaeG7hW4gdGjhu5FuZyBrw6ogdHJvbmcgY8OhYyBuZ2hpw6puIGPhu6l1IG1hbmcgdMOtbmggZGnhu4VuIGThu4tjaC4gTmjhu69uZyBtw7QgaMOsbmggbsOgeSB0aMaw4budbmcga2jDtG5nIGNo4bqlcCBuaOG6rW4gZOG7ryBsaeG7h3UgdGhp4bq/dSBzw7N0LCBkbyDEkcOzIHZp4buHYyBi4buVIHTDumMgZOG7ryBsaeG7h3UgLSBu4bq/dSBjw7MgLSBwaOG6o2kgxJHGsOG7o2MgdGjhu7FjIGhp4buHbiBUUsav4buaQyBLSEkgc3V5IGRp4buFbiB0aOG7kW5nIGvDqi4gDQoNCiMgTeG7mXQgbcO0IGjDrG5oIGzhuqEgduG7m2kgYnJtcw0KDQpOaMawIE5oaSDEkcOjIHRyw6xuaCBiw6B5LCBjw7MgbeG7mXQgcGFja2FnZSBy4bqldCBt4bqhbmggaGnhu4duIG5heSB0cm9uZyBwaMOhaSAiSOG7k2kgcXV5IEJheWVzIiwgxJHDsyBsw6AgImJybXMiIiBj4bunYSBQYXVsIELDvHJrbmVyLiBicm1zIGtow7RuZyBjaOG7iSBsw6AgbeG7mXQgZ2lhbyB0aOG7qWMgZ2nDunAgY2hvIHZp4buHYyBjb2RlIG3DtCBow6xuaCBi4bqxbmcgbmfDtG4gbmfhu68gU1RBTiBuaOG6uSBuaMOgbmcsIMSRxqFuIGdp4bqjbiBoxqFuLCBuaMawbmcgdHJvbmcgMiBuxINtIHF1YSBuw7MgxJHDoyDEkcaw4bujYyBwaMOhdCB0cmnhu4NuIGNhbyBoxqFuIHLhuqV0IG5oaeG7gXUgdsOgIGNobyBwaMOpcCBsw6BtIG5o4buvbmcgdmnhu4djIHTGsMahbmcgxJHhu5FpICJrw6wgbOG6oSIuIA0KDQpN4buZdCB0cm9uZyBuaOG7r25nIHTDrW5oIG7Eg25nIGvDrCBs4bqhIG7DoHkgc+G6vSDEkcaw4bujYyB0aOG7rSBuZ2hp4buHbSB0cm9uZyBiw6BpIHRo4buxYyBow6BuaCBow7RtIG5heSwgxJHDsyBsw6AgeMOieSBk4buxbmcgbeG7mXQgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGPDsyBraOG6oyBuxINuZzoNCg0KMSkgxq/hu5tjIGzGsOG7o25nIMSR4buTbmcgdGjhu51pIDIga+G6v3QgcXXhuqMgWTEsIFkyIChNdWx0aXZhcmlhdGUgcmVncmVzc2lvbiAtIGjhu5NpIHF1eSDEkWEgYmnhur9uIDogbMawdSDDvTogcGjDom4gYmnhu4d0IHbhu5tpIHRodeG6rXQgbmfhu68gTXVsdGlwbGUgcmVncmVzc2lvbiAtIGjhu5NpIHF1eSBi4buZaSBj4bunYSBQZWFyc29uKQ0KDQoyKSBD4bqjIDIgYmnhur9uIGvhur90IHF14bqjIG7DoHkgxJHhu4F1IGLhu4sgdGhp4bq/dSBzw7N0IGThu68gbGnhu4d1IHLhuqNpIHLDoWMgbeG7mXQgY8OhY2ggbmfhuqt1IG5oacOqbiwgduG7m2kgdOG7iSBs4buHIDEwJS4gTcO0IGjDrG5oIGPDsyBraOG6oyBuxINuZyB44butIGzDvSDEkeG7k25nIHRo4budaSAyIGPDtG5nIHZp4buHYzogYuG7lSB0w7pjIGThu68gbGnhu4d1IGNobyBZMSwgWTINCg0KMykgVHJvbmcgbcO0IGjDrG5oIGPDsyB2w6BpIGhp4buHcCBiaeG6v24gc+G7kSDEkeG7gXUgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSBz4buxIHRoaeG6v3Ugc8OzdCBuZ+G6q3Ugbmhpw6puIGThu68gbGnhu4d1IHbhu5tpIHThu4kgbOG7hyBraMOhYyBuaGF1LiBNw7QgaMOsbmggY8WpbmcgeOG7rSBsw70gbuG7kXQgdmnhu4djIGLhu5UgdMO6YyBk4buvIGxp4buHdSBjaG8gY8OhYyBiaeG6v24gbsOgeQ0KDQo0KSBO4buZaSBkdW5nIGPhu6dhIHF1eSB0csOsbmggYuG7lSB0w7pjIGThu68gbGnhu4d1IMSRxrDhu6NjIGLDoW8gY8OhbyB0xrDhu51uZyBtaW5oIHbDoCBow7JhIGjhu6NwIHbhu5tpIHF1eSB0csOsbmggc3V5IGRp4buFbiB0aOG7kW5nIGvDqiB0aGVvIG3hu6VjIMSRw61jaCBjaMOtbmguDQoNClbDoCBuaOG6pXQgbMOgOg0KDQo1KSBU4bqldCBj4bqjIG5o4buvbmcgxJFp4buBdSB0csOqbiDEkeG7gXUgxJHGsOG7o2MgbMOgbSBi4bqxbmcgcGjGsMahbmcgcGjDoXAgQmF5ZXMgKGNodeG7l2kgTUNNQykuDQoNCiMgTeG7mXQgdGjDrSBk4bulIG1pbmggaOG7jWEgxJHGoW4gZ2nhuqNuDQoNClRyxrDhu5tjIGjhur90LCB0YSBz4bq9IHRo4butIG3hu5l0IGLDoGkgdG/DoW4gxJHGoW4gZ2nhuqNuLCDEkcOzIGzDoCDGsOG7m2MgbMaw4bujbmcgY2jhu4kgc+G7kSBCTUkgdGhlbyB0deG7lWkgdsOgIENob2xlc3Rlcm9sIGxldmVsIHThu6sgYuG7mSBk4buvIGxp4buHdSBOSEFORVMgdHJvbmcgcGFja2FnZSAibWljZSINCg0KYGBge3IsbWVzc2FnZSA9IEZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KZGF0YSgibmhhbmVzIiwgcGFja2FnZSA9ICJtaWNlIikNCmhlYWQobmhhbmVzKSU+JWtuaXRyOjprYWJsZSgpDQoNCmJhcl9taXNzaW5nIDwtIGZ1bmN0aW9uKHgpew0KICBsaWJyYXJ5KGRwbHlyKQ0KICBsaWJyYXJ5KHJlc2hhcGUyKQ0KICBsaWJyYXJ5KGdncGxvdDIpDQogIHggJT4lDQogICAgaXMubmEgJT4lDQogICAgbWVsdCAlPiUNCiAgICBnZ3Bsb3QoZGF0YSA9IC4sDQogICAgICAgICAgIGFlcyh4ID0gVmFyMikpICsNCiAgICBnZW9tX2JhcihhZXMoeT0oLi5jb3VudC4uKSxmaWxsPXZhbHVlKSxhbHBoYT0wLjcsY29sb3I9ImJsYWNrIikrc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdvbGQiLCJyZWQzIiksbmFtZSA9ICIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQXZhaWxhYmxlIiwiTWlzc2luZyIpKSsNCiAgICB0aGVtZV9taW5pbWFsKCkrDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIHZqdXN0PTAuNSkpICsNCiAgICBsYWJzKHggPSAiVmFyaWFibGVzIGluIERhdGFzZXQiLA0KICAgICAgICAgeSA9ICJPYnNlcnZhdGlvbnMiKStjb29yZF9mbGlwKCkNCn0NCg0KDQptYXRyaXhfbWlzc2luZyA8LSBmdW5jdGlvbih4KXsNCiAgbGlicmFyeShkcGx5cikNCiAgbGlicmFyeShyZXNoYXBlMikNCiAgbGlicmFyeShnZ3Bsb3QyKQ0KICB4ICU+JQ0KICAgIGlzLm5hICU+JQ0KICAgIG1lbHQgJT4lDQogICAgZ2dwbG90KGRhdGEgPSAuLA0KICAgICAgICAgICBhZXMoeCA9IFZhcjEsDQogICAgICAgICAgICAgICB5ID0gVmFyMikpICsNCiAgICBnZW9tX3RpbGUoYWVzKGZpbGwgPSB2YWx1ZSksYWxwaGE9MC42KSArDQogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdvbGQiLCJyZWQzIiksbmFtZSA9ICIiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkF2YWlsYWJsZSIsIk1pc3NpbmciKSkgKw0KICAgIHRoZW1lX21pbmltYWwoKSsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgdmp1c3Q9MC41KSkgKw0KICAgIGxhYnMoeSA9ICJWYXJpYWJsZXMgaW4gRGF0YXNldCIsDQogICAgICAgICB4ID0gIlRvdGFsIG9ic2VydmF0aW9ucyIpK2Nvb3JkX2ZsaXAoKQ0KfQ0KDQpuaGFuZXMlPiViYXJfbWlzc2luZygpDQpuaGFuZXMlPiVtYXRyaXhfbWlzc2luZw0KYGBgDQoNCk5oxrAgdGEgdGjhuqV5LCBk4buvIGxp4buHdSBi4buLIHRoaeG6v3Ugc8OzdCBt4buZdCBjw6FjaCBo4buHIHRo4buRbmcgdsOgIHbhu5tpIHThu4kgbOG7hyBraMOhIGNhby4NCg0KTeG6t3Qga2jDoWMsIHRhIGPDsyB0aOG7gyB0aOG6pXkgYm1pIGPDsyBwaMOibiBwaOG7kWkga2jDtG5nIGLDrG5oIHRoxrDhu51uZy4uLg0KDQpgYGB7cn0NCm5oYW5lcyRibWk9YXMubnVtZXJpYyhuaGFuZXMkYm1pKQ0KDQpnZ3Bsb3QobmhhbmVzLGFlcyh4PWJtaSkpKw0KICBnZW9tX2RlbnNpdHkoZmlsbD0icmVkIixhbHBoYT0wLjUpKw0KICB0aGVtZV9idygpDQoNCmdncGxvdChuaGFuZXMsYWVzKHg9Y2hsKSkrDQogIGdlb21fZGVuc2l0eShmaWxsPSJibHVlIixhbHBoYT0wLjUpKw0KICB0aGVtZV9idygpDQpgYGANCg0KVuG7m2kgYsOgaSB0b8OhbiBuw6B5LCBwaMawxqFuZyBwaMOhcCBnaeG6oyDEkeG7i25oIG3DoCBOaGkgbXXhu5FuIGzDoG0sIMSRw7MgbMOgOiBYw6J5IGThu7FuZyBt4buZdCBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggQmF5ZXMgxrDhu5tjIGzGsOG7o25nIGJp4bq/biBr4bq/dCBxdeG6oyBibWkgdGhlbyBwaMOibiBi4buRIHNrZXdfbm9ybWFsLiBNw7QgaMOsbmggbsOgeSBjw7Mga2jhuqMgbsSDbmcgdOG7sSBi4buVIHTDumMgZOG7ryBsaeG7h3UgdHLhu5FuZyBjaG8gQk1JIGThu7FhIHbDoG8gQWdlIHbDoCBDaGwuIE3hurd0IGtow6FjLCBjaGwgY8WpbmcgYuG7iyB0aGnhur91IHPDs3QgZOG7ryBsaeG7h3UsIGRvIMSRw7MgxJHhu5NuZyB0aOG7nWkgbcO0IGjDrG5oIGPFqW5nIHThu7EgYuG7lSB0w7pjIGThu68gbGnhu4d1IGNobyBjaGwgZOG7sWEgdsOgbyBBZ2UgbMOgIGJp4bq/biBkdXkgbmjhuqV0IGPDsyDEkeG7pyBk4buvIGxp4buHdS4NCg0KYnJtcyBz4butIGThu6VuZyBt4buZdCB0aMOgbmggcGjhuqduIHBo4bulIChhZGRpdGlvbmFsIHRlcm0pIGzDoCBtaSggKSDEkeG7gyDEkcawYSB54bq/dSB04buRICJk4buvIGxp4buHdSB0aGnhur91IHPDs3QiIHbDoG8gY+G6oyBiaeG6v24ga+G6v3QgcXXhuqMgKGJtaSkgdsOgIHByZWRpY3RvcnMgKGNobCksIHRp4bq/cCB0aGVvLCBtw7QgaMOsbmggxJHGsOG7o2MgbeG7nyBy4buZbmcgdGjDoG5oIG3hu5l0IG3DtCBow6xuaCB04bqtcCBo4bujcCBjaG8gcGjDqXAgxrDhu5tjIGzGsOG7o25nIGPhuqMgcHJlZGljdG9yIChjaGwpIGThu7FhIHbDoG8gMSBwcmVkaWN0b3Iga2jDoWMgbMOgIGFnZS4NCg0KVsOsIGzDvSBkbyBtaW5oIGjhu41hLCBOaGkgY2jhu4kgY2jhuqF5IDEgY2h14buXaSBNQ01DIG5n4bqvbiANCg0KYGBge3IsbWVzc2FnZSA9IEZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkoYnJtcykNCg0KYmZvcm0gPC0gYmYoYm1pIHwgbWkoKSB+IGFnZSAqIG1pKGNobCksZmFtaWx5PSJza2V3X25vcm1hbCIpICsNCiAgYmYoY2hsIHwgbWkoKSB+IGFnZSkgKyBzZXRfcmVzY29yKEZBTFNFKQ0KDQptb2Q8LSBicm0oYmZvcm0sZGF0YSA9IG5oYW5lcywNCiAgICAgICAgICByZWZyZXNoID0gMCwNCiAgICAgICAgICBjb3JlcyA9IDQsDQogICAgICAgICAgaXRlciA9IDI1MDAsIA0KICAgICAgICAgIHdhcm11cCA9IDUwMCwgDQogICAgICAgICAgY2hhaW5zID0gMSkNCmBgYA0KDQpLaGkgeHXhuqV0IGvhur90IHF14bqjLCBjaMO6bmcgdGEgc+G6vSBjw7Mgbmjhu69uZyB0aMO0bmcgdGluIG5oxrAgc2F1Og0KDQpEbyBtw7QgaMOsbmggbsOgeSB0aOG7sWMgY2jhuqV0IGPDsyAyIG91dGNvbWU6IGJtaSBsw6Agb3V0Y29tZSBjaMOtbmgsIGNobCBsw6Agb3V0Y29tZSBwaOG7pSwgYm1pIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBk4buxYSB2w6BvIGFnZSB2w6AgY2hsLCBjw7JuIGNobCDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgZOG7sWEgdsOgbyBhZ2UuIFNhdSBraGkgYuG7lSB0w7pjIGNobyBj4bqjIDIsIHN1eSBkaeG7hW4gdGjhu5FuZyBrw6ogxJHGsOG7o2MgdGjhu7FjIGhp4buHbg0KDQpgYGB7cixtZXNzYWdlID0gRkFMU0Usd2FybmluZz1GQUxTRX0NCnN1bW1hcnkobW9kKQ0KYGBgDQoNCkRvIMSRw6J5IGzDoCAxIG3DtCBow6xuaCBCYXllcywgdGEgY8OzIHRo4buDIGto4bqjbyBzw6F0IGPDoWMgY2h14buXaSBNQ01DIHbDoCBwaMOibiBi4buRIGjhuq11IG5naGnhu4dtOg0KDQpgYGB7cixtZXNzYWdlID0gRkFMU0Usd2FybmluZz1GQUxTRX0NCg0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQoNCnBsb3QobW9kKQ0KYGBgDQoNClThu6sgbcO0IGjDrG5oLCB0YSBjw7MgdGjhu4Mgc3V5IGRp4buFbiB0aOG7kW5nIGvDqiB0cuG7sWMgcXVhbiBi4bqxbmcgbWFyZ2luYWwgZWZmZWN0IHBsb3RzLiBDw6FjIGJp4buDdSDEkeG7kyBuw6B5IGThu7FhIHbDoG8gZOG7ryBsaeG7h3UgxJHDoyDEkcaw4bujYyBi4buVIHTDumMgdHJvbmcgcXXDoSB0csOsbmggZOG7sW5nIG3DtCBow6xuaC4NCg0KYGBge3IsbWVzc2FnZSA9IEZBTFNFLHdhcm5pbmc9RkFMU0V9DQptYXJnaW5hbF9lZmZlY3RzKG1vZCwgImFnZTpjaGwiKQ0KYGBgDQoNCkPhuqduIGzGsHUgw70gduG7m2kgY8OhYyBi4bqhbiBt4buZdCDEkWnhu4NtLCDEkcOzIGzDoCBjaMO6bmcgdGEgxJFhbmcgbMOgbSB2aeG7h2MgdHLDqm4gbeG7mXQgZOG7ryBsaeG7h3UgY8OzIGPhu6EgbeG6q3UgcuG6pXQgdGjhuqVwIChjaOG7iSBjw7MgMjUgdHLGsOG7nW5nIGjhu6NwKS4gVmnhu4djIGLhu5UgdMO6YyBk4buvIGxp4buHdSB0cuG7kW5nIHPhu60gZOG7pW5nIG5o4buvbmcgcGjGsMahbmcgcGjDoXAgdHJ1eeG7gW4gdGjhu5FuZyBsw6AgcuG6pXQga2jDsyBraMSDbiBraGkgY8OzIHF1w6Egw610IGThu68gbGnhu4d1IG5oxrAgdGjhur8gbsOgeS4gDQoNCiMgTeG7mXQgdGjDrSBk4bulIGtow6FjIHBo4bupYyB04bqhcCBoxqFuDQoNCkLDonkgZ2nhu50sIGNow7puZyB0YSBz4bq9IHThuqFvIHJhIG3hu5l0IGLDoGkgdG/DoW4ga2jDoWMgduG7m2kgxJHhu5kga2jDsyBjYW8gaMahbiBuaGnhu4F1Og0KDQrEkMOieSBsw6AgbeG7mXQgbmdoacOqbiBj4bupdSBj4bunYSBOaWVyZW5iZXJnIERXIGV0IGFsLiBuxINtIDE5ODkgbmjhurFtIGto4bqjbyBzw6F0IHF1YW4gaOG7hyBnaeG7r2EgbuG7k25nIMSR4buZIDIgY2jhuqV0OiByZXRpbm9sIHbDoCBiZXRhLWNhcm90ZW5ldHJvbmcgbcOhdSB24bubaSBt4buZdCBz4buRIHnhur91IHThu5Ega2jDoWMuDQoNCmBgYHtyLG1lc3NhZ2UgPSBGQUxTRSx3YXJuaW5nPUZBTFNFfQ0KZGF0PXJlYWQuY3N2KCJodHRwczovL3d3dy5vcGVubWwub3JnL2RhdGEvZ2V0X2Nzdi81MjYyMy9wbGFzbWFfcmV0aW5vbC5jc3YiKSU+JWFzX3RpYmJsZSgpDQoNCmRhdCU+JWhlYWQoKSU+JWtuaXRyOjprYWJsZSgpDQpgYGANCg0KxJDDonkgbMOgIG3hu5l0IG3huqFuZyBsxrDhu5tpIHTGsMahbmcgcXVhbiBnaeG7r2EgY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB0cm9uZyBk4buvIGxp4buHdSwgY8OhYyBt4buRaSBsacOqbiBr4bq/dCBsacOqbiB04bulYyB0xrDGoW5nIOG7qW5nIHbhu5tpIHBfdmFsdWU8MC4wNSBj4bunYSAxIHBow6JuIHTDrWNoIHTGsMahbmcgcXVhbiBQZWFyc29uICwgbmfGsOG7o2MgbOG6oWkgbmjhu69uZyDEkW/huqFuIMSR4bupdCBraMO6YyBjw7MgcF92YWx1ZSA+IDAuMDUgKGtow7RuZyBjw7MgdMawxqFuZyBxdWFuKS4NCg0KYGBge3IsbWVzc2FnZSA9IEZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCg0KY29ybWF0PWRhdCU+JQ0KICBkcGx5cjo6c2VsZWN0KC1jKFNFWCxTTU9LU1RBVCxWSVRVU0UpKSU+JQ0KICBhcy5tYXRyaXgoKSU+JQ0KICBzY2FsZSgpDQoNCm09YXMubWF0cml4KGNvcihjb3JtYXQsDQogICAgICAgICAgICAgICAgbWV0aG9kPSJwZWFyc29uIiwNCiAgICAgICAgICAgICAgICB1c2U9InBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpKQ0KDQpjb3IubXRlc3QgPC0gZnVuY3Rpb24obWF0LCAuLi4pIHsNCiAgbWF0IDwtIGFzLm1hdHJpeChtYXQpDQogIG4gPC0gbmNvbChtYXQpDQogIHAubWF0PC0gbWF0cml4KE5BLCBuLCBuKQ0KICBkaWFnKHAubWF0KSA8LSAwDQogIGZvciAoaSBpbiAxOihuIC0gMSkpIHsNCiAgICBmb3IgKGogaW4gKGkgKyAxKTpuKSB7DQogICAgICB0bXAgPC0gY29yLnRlc3QobWF0WywgaV0sIG1hdFssIGpdLCAuLi4pDQogICAgICBwLm1hdFtpLCBqXSA8LSBwLm1hdFtqLCBpXSA8LSB0bXAkcC52YWx1ZQ0KICAgIH0NCiAgfQ0KICBjb2xuYW1lcyhwLm1hdCkgPC0gcm93bmFtZXMocC5tYXQpIDwtIGNvbG5hbWVzKG1hdCkNCiAgcC5tYXQNCn0NCg0KIyBtYXRyaXggb2YgdGhlIHAtdmFsdWUgb2YgdGhlIGNvcnJlbGF0aW9uDQpwLm1hdCA8LSBjb3IubXRlc3QoY29ybWF0KQ0KDQpsaWJyYXJ5KGlncmFwaCkNCg0KZGlhZyhwLm1hdCk8LTANCg0KbGlicmFyeShnZ3JhcGgpDQoNCmNnMT1kYXRhLmZyYW1lKHJvdz1yb3duYW1lcyhwLm1hdClbcm93KHAubWF0KVt1cHBlci50cmkocC5tYXQpXV0sIA0KICAgICAgICAgICAgICAgY29sPWNvbG5hbWVzKHAubWF0KVtjb2wocC5tYXQpW3VwcGVyLnRyaShwLm1hdCldXSwgDQogICAgICAgICAgICAgICBjb3JyPXAubWF0W3VwcGVyLnRyaShwLm1hdCldKQ0KDQpjZzI9ZGF0YS5mcmFtZShyb3c9cm93bmFtZXMobSlbcm93KG0pW3VwcGVyLnRyaShtKV1dLCANCiAgICAgICAgICAgICAgIGNvbD1jb2xuYW1lcyhtKVtjb2wobSlbdXBwZXIudHJpKG0pXV0sIA0KICAgICAgICAgICAgICAgY29ycj1tW3VwcGVyLnRyaShtKV0pDQoNCm5hbWVzKGNnMSk9YygiZnJvbSIsInRvIiwicHZhbCIpDQpuYW1lcyhjZzIpPWMoImZyb20iLCJ0byIsImNvcnIiKQ0KDQpjZzIkcHZhbD1jZzEkcHZhbA0KY2cyPWNnMiU+JW11dGF0ZShwVmFsPWNnMSRwdmFsLFNpZz1pZl9lbHNlKGNnMSRwdmFsPDAuMDUsMSwwKSkNCg0KDQp0aGVtZV9iYXJlIDwtIGZ1bmN0aW9uKGJhc2Vfc2l6ZT04LGJhc2VfZmFtaWx5PSJzYW5zIil7dGhlbWVfYncoYmFzZV9zaXplID0gYmFzZV9zaXplLCBiYXNlX2ZhbWlseSA9IGJhc2VfZmFtaWx5KSsNCiAgICB0aGVtZSgNCiAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgDQogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSksIA0KICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMCwwKSwgImxpbmVzIikNCiAgICApDQp9DQoNCmdkZj1maWx0ZXIoY2cyLHB2YWw8MC4wNSkNCg0KZ3JhcGg8LWdyYXBoX2Zyb21fZGF0YV9mcmFtZShjZzIpDQoNCmdncmFwaChncmFwaCxjaXJjdWxhcj1GLGxheW91dD0ia2siKSsNCiAgZ2VvbV9lZGdlX2ZhbihhZXMobGluZXR5cGU9ZmFjdG9yKFNpZyksY29sPWZhY3RvcihTaWcpKSwNCiAgICAgICAgICAgICAgICB3aWR0aD0xLA0KICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRiwNCiAgICAgICAgICAgICAgICBhbHBoYT0wLjUpKw0KICBnZW9tX25vZGVfbGFiZWwoYWVzKGxhYmVsID0gbmFtZSkpKw0KICBjb29yZF9maXhlZCgpKw0KICB0aGVtZV9iYXJlKCkrDQogIHNjYWxlX2VkZ2VfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJyZWQiLCJwaW5rIikpDQpgYGANCg0KVOG7qyBt4bqhbmcgbMaw4bubaSBuw6B5LCBOaGkgxJHhurd0IHJhIG3hu5l0IGdp4bqjIHRodXnhur90IGPhuqduIGtp4buDbSBjaOG7qW5nLCDEkcOzIGzDoCBSZXRQbGFzbWEgY2jhu4t1IOG6o25oIGjGsOG7n25nIGPhu6dhIEFsY29ob2wgdsOgIENob2xlc3Rlcm9sLCBjw7JuICBCZXRhUGxhc2xhIGNo4buJIGNo4buLdSDhuqNuaCBoxrDhu59uZyBi4bufaSBBbGNvaG9sLg0KDQoyIGJp4bq/biBuw6B5IHPhur0gxJHGsOG7o2MgeMOpdCBuaMawIGhp4buHcCBiaeG6v24gc+G7kSB0cm9uZyBtw7QgaMOsbmguDQoNClRhIGtp4buDbSB0cmEgdGnhur9wIGPDoWMgYmnhur9uIHBow6JuIG5ow7NtOg0KDQpgYGB7cixtZXNzYWdlID0gRkFMU0Usd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZ2dyaWRnZXMpDQoNCmxldmVscyhkYXQkU01PS1NUQVQpPC1jKCJTQ1UiLCJTRk8iLCJOTyIpDQoNCnN1bV9kZj1kYXQlPiVncm91cF9ieShTTU9LU1RBVCklPiUNCiAgc3VtbWFyaXNlX2F0KCJCRVRBUExBU01BIixtZWRpYW4pDQoNCmRhdCU+JWdncGxvdChhZXMoeD1CRVRBUExBU01BLA0KICAgICAgICAgICAgICAgICB5PVNNT0tTVEFULA0KICAgICAgICAgICAgICAgICBmaWxsPVNNT0tTVEFULA0KICAgICAgICAgICAgICAgICBjb2w9U01PS1NUQVQpKSsNCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYT0wLjYsc2l6ZT0xLHNjYWxlPTEpKw0KICBnZW9tX3BvaW50KGFscGhhPTAuMykrDQogIGdlb21fcG9pbnQoZGF0YT1zdW1fZGYsYWVzKHg9QkVUQVBMQVNNQSksDQogICAgICAgICAgICAgc2hhcGU9MjMsc2l6ZT0zLGZpbGw9IndoaXRlIixzdHJva2U9MS4yKSsNCiAgZ2VvbV9saW5lKGRhdGE9c3VtX2RmLGFlcyh4PUJFVEFQTEFTTUEseT1TTU9LU1RBVCksZ3JvdXA9MSkrDQogIGdlb21fcnVnKGFscGhhPTAuNSkrDQogIGNvb3JkX2ZsaXAoKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjMDIxY2U1IiwiIzM1MDA5MSIsIiNkODAyMWUiKSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMTY3N2ZmIiwiI2E2MTZmZiIsIiNmZjE2NTQiKSkrDQogIHRoZW1lX2J3KCkNCg0KDQpzdW1fZGY9ZGF0JT4lZ3JvdXBfYnkoU01PS1NUQVQpJT4lDQogIHN1bW1hcmlzZV9hdCgiUkVUUExBU01BIixtZWRpYW4pDQoNCmRhdCU+JWdncGxvdChhZXMoeD1SRVRQTEFTTUEsDQogICAgICAgICAgICAgICAgIHk9U01PS1NUQVQsDQogICAgICAgICAgICAgICAgIGZpbGw9U01PS1NUQVQsDQogICAgICAgICAgICAgICAgIGNvbD1TTU9LU1RBVCkpKw0KICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhPTAuNixzaXplPTEsc2NhbGU9MSkrDQogIGdlb21fcG9pbnQoYWxwaGE9MC4zKSsNCiAgZ2VvbV9wb2ludChkYXRhPXN1bV9kZixhZXMoeD1SRVRQTEFTTUEpLA0KICAgICAgICAgICAgIHNoYXBlPTIzLHNpemU9MyxmaWxsPSJ3aGl0ZSIsc3Ryb2tlPTEuMikrDQogIGdlb21fbGluZShkYXRhPXN1bV9kZixhZXMoeD1SRVRQTEFTTUEseT1TTU9LU1RBVCksZ3JvdXA9MSkrDQogIGdlb21fcnVnKGFscGhhPTAuNSkrDQogIGNvb3JkX2ZsaXAoKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjMDIxY2U1IiwiIzM1MDA5MSIsIiNkODAyMWUiKSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMTY3N2ZmIiwiI2E2MTZmZiIsIiNmZjE2NTQiKSkrDQogIHRoZW1lX2J3KCkNCg0KbGV2ZWxzKGRhdCRWSVRVU0UpPC1jKCJOTyIsIllPRiIsIllOTyIpDQoNCnN1bV9kZj1kYXQlPiVncm91cF9ieShWSVRVU0UpJT4lDQogIHN1bW1hcmlzZV9hdCgiQkVUQVBMQVNNQSIsbWVkaWFuKQ0KDQpkYXQlPiVnZ3Bsb3QoYWVzKHg9QkVUQVBMQVNNQSwNCiAgICAgICAgICAgICAgICAgeT1WSVRVU0UsDQogICAgICAgICAgICAgICAgIGZpbGw9VklUVVNFLA0KICAgICAgICAgICAgICAgICBjb2w9VklUVVNFKSkrDQogIGdlb21fZGVuc2l0eV9yaWRnZXMoYWxwaGE9MC42LHNpemU9MSxzY2FsZT0xKSsNCiAgZ2VvbV9wb2ludChhbHBoYT0wLjMpKw0KICBnZW9tX3BvaW50KGRhdGE9c3VtX2RmLGFlcyh4PUJFVEFQTEFTTUEpLA0KICAgICAgICAgICAgIHNoYXBlPTIzLHNpemU9MyxmaWxsPSJ3aGl0ZSIsc3Ryb2tlPTEuMikrDQogIGdlb21fbGluZShkYXRhPXN1bV9kZixhZXMoeD1CRVRBUExBU01BLHk9VklUVVNFKSxncm91cD0xKSsNCiAgZ2VvbV9ydWcoYWxwaGE9MC41KSsNCiAgY29vcmRfZmxpcCgpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMjFjZTUiLCIjMzUwMDkxIiwiI2Q4MDIxZSIpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMxNjc3ZmYiLCIjYTYxNmZmIiwiI2ZmMTY1NCIpKSsNCiAgdGhlbWVfYncoKQ0KDQpzdW1fZGY9ZGF0JT4lZ3JvdXBfYnkoVklUVVNFKSU+JQ0KICBzdW1tYXJpc2VfYXQoIlJFVFBMQVNNQSIsbWVkaWFuKQ0KDQpkYXQlPiVnZ3Bsb3QoYWVzKHg9UkVUUExBU01BLA0KICAgICAgICAgICAgICAgICB5PVZJVFVTRSwNCiAgICAgICAgICAgICAgICAgZmlsbD1WSVRVU0UsDQogICAgICAgICAgICAgICAgIGNvbD1WSVRVU0UpKSsNCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYT0wLjYsc2l6ZT0xLHNjYWxlPTEpKw0KICBnZW9tX3BvaW50KGFscGhhPTAuMykrDQogIGdlb21fcG9pbnQoZGF0YT1zdW1fZGYsYWVzKHg9UkVUUExBU01BKSwNCiAgICAgICAgICAgICBzaGFwZT0yMyxzaXplPTMsZmlsbD0id2hpdGUiLHN0cm9rZT0xLjIpKw0KICBnZW9tX2xpbmUoZGF0YT1zdW1fZGYsYWVzKHg9UkVUUExBU01BLHk9VklUVVNFKSxncm91cD0xKSsNCiAgZ2VvbV9ydWcoYWxwaGE9MC41KSsNCiAgY29vcmRfZmxpcCgpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMjFjZTUiLCIjMzUwMDkxIiwiI2Q4MDIxZSIpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMxNjc3ZmYiLCIjYTYxNmZmIiwiI2ZmMTY1NCIpKSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtX2RmPWRhdCU+JWdyb3VwX2J5KFNFWCklPiUNCiAgc3VtbWFyaXNlX2F0KCJCRVRBUExBU01BIixtZWRpYW4pDQoNCmRhdCU+JWdncGxvdChhZXMoeD1CRVRBUExBU01BLA0KICAgICAgICAgICAgICAgICB5PVNFWCwNCiAgICAgICAgICAgICAgICAgZmlsbD1TRVgsDQogICAgICAgICAgICAgICAgIGNvbD1TRVgpKSsNCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYT0wLjYsc2l6ZT0xLHNjYWxlPTEpKw0KICBnZW9tX3BvaW50KGFscGhhPTAuMykrDQogIGdlb21fcG9pbnQoZGF0YT1zdW1fZGYsYWVzKHg9QkVUQVBMQVNNQSksDQogICAgICAgICAgICAgc2hhcGU9MjMsc2l6ZT0zLGZpbGw9IndoaXRlIixzdHJva2U9MS4yKSsNCiAgZ2VvbV9saW5lKGRhdGE9c3VtX2RmLGFlcyh4PUJFVEFQTEFTTUEseT1TRVgpLGdyb3VwPTEpKw0KICBnZW9tX3J1ZyhhbHBoYT0wLjUpKw0KICBjb29yZF9mbGlwKCkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzAyMWNlNSIsIiNkODAyMWUiKSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMTY3N2ZmIiwiI2ZmMTY1NCIpKSsNCiAgdGhlbWVfYncoKQ0KDQpzdW1fZGY9ZGF0JT4lZ3JvdXBfYnkoU0VYKSU+JQ0KICBzdW1tYXJpc2VfYXQoIlJFVFBMQVNNQSIsbWVkaWFuKQ0KDQpkYXQlPiVnZ3Bsb3QoYWVzKHg9QkVUQVBMQVNNQSwNCiAgICAgICAgICAgICAgICAgeT1TRVgsDQogICAgICAgICAgICAgICAgIGZpbGw9U0VYLA0KICAgICAgICAgICAgICAgICBjb2w9U0VYKSkrDQogIGdlb21fZGVuc2l0eV9yaWRnZXMoYWxwaGE9MC42LHNpemU9MSxzY2FsZT0xKSsNCiAgZ2VvbV9wb2ludChhbHBoYT0wLjMpKw0KICBnZW9tX3BvaW50KGRhdGE9c3VtX2RmLGFlcyh4PVJFVFBMQVNNQSksDQogICAgICAgICAgICAgc2hhcGU9MjMsc2l6ZT0zLGZpbGw9IndoaXRlIixzdHJva2U9MS4yKSsNCiAgZ2VvbV9saW5lKGRhdGE9c3VtX2RmLGFlcyh4PVJFVFBMQVNNQSx5PVNFWCksZ3JvdXA9MSkrDQogIGdlb21fcnVnKGFscGhhPTAuNSkrDQogIGNvb3JkX2ZsaXAoKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjMDIxY2U1IiwiI2Q4MDIxZSIpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMxNjc3ZmYiLCIjZmYxNjU0IikpKw0KICB0aGVtZV9idygpDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBjw7MgduG6uyBuaMawIHnhur91IHThu5EgU+G7rSBk4bulbmcgVml0YW1pbiAoVml0dXNlKSB2w6AgVGjDs2kgcXVlbiBow7p0IHRodeG7kWMgZ8OieSByYSBoaeG7h3Ug4bupbmcgeeG6v3UgxJHhu5FpIHbhu5tpIG7hu5NuZyDEkeG7mSBCZXRhIGNhcm90ZW5lIHbDoCBSZXRpbm9sIHBsYXNtYS4gVHJvbmcga2hpIMSRw7MgR2nhu5tpIHTDrW5oIGPDsyBoaeG7h3Ug4bupbmcgbeG6oW5oIGjGoW4uDQoNClRp4bq/cCB0aGVvLCB0YSBtw7QgcGjhu49uZyBt4buZdCBiw6BpIHRvw6FuIGdp4bqjIMSR4buLbmggbmjGsCBzYXU6DQoNCk3hu6VjIHRpw6p1IGPhu6dhIGNow7puZyB0YSBsw6Aga2jhuqNvIHPDoXQgxJHhu5NuZyB0aOG7nWkgY+G6oyAyIGJp4bq/bjogUmV0aW5vbCBQbGFzbWEgdsOgIEJldGFQbGFzbWEsIHTDuXkgdGhlbyBUdeG7lWksIEdp4bubaSB0w61uaCwgVGjDs2kgcXVlbiBow7p0IHRodeG7kWMgdsOgIFZp4buHYyBz4butIGThu6VuZyBWaXRhbWluLiBC4buRbiBiaeG6v24gbsOgeSBjw7MgxJHhuqd5IMSR4bunIGThu68gbGnhu4d1IHbhu5tpIGdp4bqjIMSR4buLbmggbMOgIGPDoWMgdGjDtG5nIHRpbiBuw6B5IHLhuqV0IGThu4UgdGh1IHRo4bqtcC4NCg0KVHJvbmcga2hpIMSRw7MsIG5o4buvbmcgYmnhur9uIGPDsyBi4bqjbiBjaOG6pXQgbMOgIGvhur90IHF14bqjIHjDqXQgbmdoaeG7h20sIHRow60gZOG7pSBDaG9sZXN0ZXJvbCwgQWxjb2hvbCwgdsOgIGLhuqNuIHRow6JuIFJldFBsYXNtYSBoYXkgQmV0YVBsYXNtYSBjw7Mgbmd1eSBjxqEgdGhp4bq/dSBzw7N0IGThu68gbGnhu4d1IGNhbyBoxqFuLCB2aeG7h2MgdGhp4bq/dSBzw7N0IGzDoCBuZ+G6q3Ugbmhpw6puIHbDoCB24bubaSB04buJIGzhu4cgdOG7qyAxMC0yMCUuLi4NCg0KTmhpIHZp4bq/dCAxIGjDoG0gxJHhu4MgbcO0IHBo4buPbmcgc+G7sSB0aGnhur91IHPDs3QgZOG7ryBsaeG7h3UgbsOgeToNCg0KYGBge3IsbWVzc2FnZSA9IEZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCnJhbmQuTkEgPC0gZnVuY3Rpb24odmVjdCxuYS5wcm9iPTAuMSl7DQogIG5hLmZyZXE9cm91bmQobmEucHJvYipsZW5ndGgodmVjdCkpDQogIHZlY3Rbc2FtcGxlKHNlcSh2ZWN0KSxuYS5mcmVxKV0gPC0gTkENCiAgcmV0dXJuKHZlY3QpDQp9DQoNCm1pc2RmPWRhdCU+JW11dGF0ZSgNCiAgQUxDT0hPTD1yYW5kLk5BKGRhdCRBTENPSE9MLDAuMiksDQogIENIT0xFU1RFUk9MPXJhbmQuTkEoZGF0JENIT0xFU1RFUk9MLDAuMTUpLA0KICBCRVRBUExBU01BPXJhbmQuTkEoZGF0JEJFVEFQTEFTTUEsMC4xKSwNCiAgUkVUUExBU01BPXJhbmQuTkEoZGF0JFJFVFBMQVNNQSwwLjE1KQ0KKQ0KDQptaXNkZiU+JWJhcl9taXNzaW5nKCkNCm1pc2RmJT4lbWF0cml4X21pc3NpbmcNCmBgYA0KDQpTYXUga2hpIMSR4bulYyBk4buvIGxp4buHdSB0aOG7p25nIGzhu5cgY2jhu5cgbeG7mXQgY8OhY2ggbmfhuqt1IG5oacOqbiwgY2jDum5nIHRhIHPhur0geMOieSBk4buxbmcgbcO0IGjDrG5oIHbhu5tpIG7hu5lpIGR1bmcgbmjGsCBzYXU6DQoNCjEpIMSQw6J5IGzDoCBt4buZdCBtw7QgaMOsbmggaOG7k2kgcXV5IMSRYSBiaeG6v24sIMaw4bubYyBsxrDhu6NuZyDEkeG7k25nIHRo4budaSAyIGJp4bq/biBr4bq/dCBxdeG6oyBsw6AgQmV0YXBsYXNtYSB2w6AgUmV0UGxhc21hLg0KDQoyKSBNw7QgaMOsbmggxJHGsOG7o2MgdMOtY2ggaOG7o3Aga2jhuqMgbsSDbmcgdOG7sSDEkeG7mW5nIGLhu5UgdMO6YyBk4buvIGxp4buHdSBjaG8gMiBiaeG6v24ga+G6v3QgcXXhuqMga2hpIHRoaeG6v3Ugc8OzdA0KDQozKSBTYXUga2hpIMSRxrDhu6NjIGLhu5UgdMO6YywgMiBiaeG6v24ga+G6v3QgcXXhuqMgxJHGsOG7o2MgZ2nhuqMgxJHhu4tuaCBwaOG7pSB0aHXhu5ljIHbDoG8gVHXhu5VpLCBHaeG7m2kgdMOtbmgsIHRow7NpIHF1ZW4gaMO6dCB0aHXhu5FjLCBkw7luZyB2aXRhbWluLCB2w6AgMiBoaeG7h3AgYmnhur9uIGtow6FjIGzDoCBBbGNvaG9sIHbDoCBDaG9sZXN0ZXJvbC4NCg0KNCkgQuG6o24gdGjDom4gMiBiaeG6v24gQWxjb2hvbCB2w6AgQ2hvbGVzdGVyb2wgY8WpbmcgYuG7iyB0aGnhur91IGThu68gbGnhu4d1LCB2w6AgdGEgbXXhu5FuIG3DtCBow6xuaCB04buxIGLhu5UgdMO6YyBjaG8gY2jDum5nIGThu7FhIHbDoG8gVHXhu5VpLCBHaeG7m2kgdMOtbmguDQoNCjUpIFThuqV0IGPhuqMgYmnhur9uIHPhu5EgdHJvbmcgbcO0IGjDrG5oIMSRxrDhu6NjIGdp4bqjIMSR4buLbmggY8OzIHBow6JuIHBo4buRaSBHYXVzc2lhbg0KDQpgYGB7cixtZXNzYWdlID0gRkFMU0Usd2FybmluZz1GQUxTRX0NCmJmb3JtPC1iZihjYmluZChCRVRBUExBU01BLFJFVFBMQVNNQSl8bWkoKX4NCiAgICAgICAgICAgIEFHRStTRVgrU01PS1NUQVQrVklUVVNFKw0KICAgICAgICAgICAgbWkoQUxDT0hPTCkrDQogICAgICAgICAgICBtaShDSE9MRVNURVJPTCkpKw0KICBiZihBTENPSE9MfG1pKCl+QUdFK1NFWCkrDQogIGJmKENIT0xFU1RFUk9MfG1pKCl+QUdFK1NFWCkNCmBgYA0KDQpUYSBz4bq9IGNvbXBpbGUgbcO0IGjDrG5oIHbDoG8gU1RBTiB2w6Aga8OtY2ggaG/huqF0IHNhbXBsZXIgxJHhu4MgYuG6r3QgxJHhuqd1IHThuqFvIGPDoWMgY2h14buXaSBNQ01DDQoNCmBgYHtyLG1lc3NhZ2UgPSBGQUxTRSx3YXJuaW5nPUZBTFNFfQ0KZml0X2ltcCA8LSBicm0oYmZvcm0sIGRhdGEgPSBtaXNkZiwNCiAgICAgICAgICByZWZyZXNoID0gMCwNCiAgICAgICAgICBjb3JlcyA9IDQsDQogICAgICAgICAgaXRlciA9IDI1MDAsIA0KICAgICAgICAgIHdhcm11cCA9IDUwMCwgDQogICAgICAgICAgY2hhaW5zID0gMSkNCmBgYA0KDQpgYGB7cixtZXNzYWdlID0gRkFMU0Usd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoYnJvb20pDQoNCnRpZHlNQ01DKGZpdF9pbXAsIGNvbmYuaW50ID0gVFJVRSwgY29uZi5tZXRob2QgPSAiSFBEaW50ZXJ2YWwiKQ0KYGBgDQoNCmBgYHtyLG1lc3NhZ2UgPSBGQUxTRSx3YXJuaW5nPUZBTFNFfQ0KcGxvdChmaXRfaW1wKQ0KYGBgDQoNCmBgYHtyLG1lc3NhZ2UgPSBGQUxTRSx3YXJuaW5nPUZBTFNFfQ0KbWFyZ2luYWxfZWZmZWN0cyhmaXRfaW1wKQ0KDQpgYGANCg0KDQoNCiMgTmjhuq1uIHjDqXQNCg0KVMOtbmggbsSDbmcgdOG7sSDEkeG7mW5nIGLhu5UgdMO6YyBk4buvIGxp4buHdSBtw6AgYnJtcyBjdW5nIGPhuqVwIGzDoCBt4buZdCDDvSB0xrDhu59uZyB0aMO6IHbhu4suDQoNCk3hu5l0IHPhu5EgxrB1IMSRaeG7g20gY+G7p2EgY8OhY2ggbMOgbSBuw6B5IGJhbyBn4buTbToNCg0KMSkgQ2jhu4kgc+G7rSBk4bulbmcgbeG7mXQgYWxnb3JpdGhtIGR1eSBuaOG6pXQgdHJvbmcgdG/DoG4gYuG7mSBxdXkgdHLDrG5oLCDEkcOzIGzDoCBo4buTaSBxdXkgdHV54bq/biB0w61uaCBCYXllcy4NCg0KMikgS+G6v3QgcXXhuqMgY2hvIHThu6tuZyBtw7QgaMOsbmggKGNow61uaCwgcGjhu6UpIMSRxrDhu6NjIHRyw6xuaCBiw6B5IHTGsOG7nW5nIG1pbmgsIGtow7RuZyBwaOG6o2kgYmxhY2tib3guIE5naGnDqm4gY+G7qXUgc2luaCBjw7MgdGjhu4MgZ2nhuqNpIHRow61jaCBjxqEgY2jhur8gY+G7p2Egdmnhu4djIGLhu5UgdMO6YyBk4buvIGxp4buHdSBt4buZdCBjw6FjaCByw7UgcsOgbmcsIGNoaSB0aeG6v3QuDQoNCjMpIEjDsmEgaOG7o3AgxJHGsOG7o2MgcXV5IHRyw6xuaCBi4buVIHTDumMgZOG7ryBsaeG7h3UgdsOgIHN1eSBkaeG7hW4gQmF5ZXMgY2hvIGhp4buHdSDhu6luZyBjaMOtbmggxJHhu5FpIHbhu5tpIGJp4bq/biBr4bq/dCBxdeG6oy4gDQoNCjQpIEhv4bqhdCDEkeG7mW5nIMSRxrDhu6NjIHRyw6puIGThu68gbGnhu4d1IGPDsyBj4buhIG3huqt1IGjhuqFuIGNo4bq/LCB0aOG6rW0gY2jDrSBy4bqldCBo4bqhbiBjaOG6vywgdsOsIHBoxrDGoW5nIHBow6FwIEJheWVzIGNobyBwaMOpcCDEkWnhu4F1IG7DoHkNCg0KNSkgQuG7lSB0w7pjIGThu68gbGnhu4d1IGNobyBiaeG6v24ga+G6v3QgcXXhuqMsIHRo4bqtbSBjaMOtIG5oaeG7gXUgYmnhur9uIGvhur90IHF14bqjIMSR4buTbmcgdGjhu51pIHRyb25nIDEgbcO0IGjDrG5oIGR1eSBuaOG6pXQuDQoNClRo4buxYyByYSBraMO0bmcgY8OzIGfDrCBrw6wgbOG6oSwgcXV5IHRyw6xuaCBuw6B5IGPDsyBi4bqjbiBjaOG6pXQgbMOgIG3hu5l0IG3DtCBow6xuaCB04bqtcCBo4bujcCAoZW5zZW1ibGUpIGfhu5NtIG5oaeG7gXUgYuG7mSBwaOG6rW4gbGnDqm4ga+G6v3QgduG7m2kgbmhhdSB0aGVvIHRo4bupIGLhuq1jLg0KDQrEkOG6p3UgdGnDqm4sIGJybXMgc+G6vSB0w6xtIGPDoWNoIGLhu5UgdMO6YyBk4buvIGxp4buHdSBj4bunYSBjw6FjIHByZWRpY3RvciB0cm9uZyBuaOG7r25nIG3DtCBow6xuaCBwaOG7pSAoY8WpbmcgbMOgIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oKSBk4buxYSB2w6BvIDEgaGF5IG5oaeG7gXUgcHJlZGljdG9yIGtow6FjIGPDsyDEkOG7piBk4buvIGxp4buHdSAoxJHDonkgbMOgIG5oxrDhu6NjIMSRaeG7g20gY+G7p2EgY8OhY2ggbMOgbSBuw6B5LCB2w6wgbsOzIGtow7RuZyBsaW5oIGhv4bqhdCBi4bqxbmcgY8OhYyBhbGdvcml0aG0gTWFjaGluZSBsZWFybmluZyBraMOhYyBuaMawIGtubiBoYXkgcmFuZG9tIGZvcmVzdCwgcHJlZGljdG9yIGTDuW5nIMSR4buDIGLhu5UgdMO6YyBk4buvIGxp4buHdSBi4bqvdCBideG7mWMgcGjhuqNpIMSR4bqneSDEkeG7pykuIEPDsyB24bq7IG5oxrAgYnJtcyBjaMawYSBjaG8gcGjDqXAgYuG7lSB0w7pjIGThu68gbGnhu4d1IGPhu6dhIGJp4bq/biDEkeG7i25oIHTDrW5oL3Ro4bupIGjhuqFuZyAoY2F0ZWdvcmljYWwgdsOgIG9yZGluYWwpLCBuw7MgY8WpbmcgY2jGsGEgY2hvIHBow6lwIGLhu5UgdMO6YyBk4buvIGxp4buHdSBz4butIGThu6VuZyBuaOG7r25nIHBow6JuIHBo4buRaSBwaOG7qWMgdOG6oXAsIGdhdXNzaWFuIGzDoCBs4buxYSBjaOG7jW4gYW4gdG/DoG4gbmjhuqV0IG7hur91IGtow7RuZyBzYW1wbGVyIGPDsyB0aOG7gyBiw7MgdGF5IHbDoCBtw7QgaMOsbmgga2jDtG5nIGNvbnZlcmdlIMSRxrDhu6NjLg0KDQpTYXUga2hpIGLhu5UgdMO6YyB4b25nIGPDoWMgcHJlZGljdG9yLCBtw7QgaMOsbmggY2jDrW5oIHPhur0gYuG7lSB0w7pjIGThu68gbGnhu4d1IGNobyAxIGhheSBuaGnhu4F1IGJp4bq/biBr4bq/dCBxdeG6oyAob3V0Y29tZXMpLCBtw7QgaMOsbmggc2F1IGPDuW5nIMSRxrDhu6NjIHThuqFvIHJhLg0KDQpUdXkgY8OybiBuaGnhu4F1IG5oxrDhu6NjIMSRaeG7g20gdsOgIGzhu5cgaOG7lW5nIHbhu4EgZ2nhuqMgxJHhu4tuaCwgxJHDonkgbMOgIG3hu5l0IGPDoWNoIGzDoG0gZOG7hSBkw6BuZywgdGnhu4duIGzhu6NpIMSRw6FuZyDEkcaw4bujYyB0aOG7rSBuZ2hp4buHbSBjaG8gbmjhu69uZyBuZ2hpw6puIGPhu6l1IGRp4buFbiBk4buLY2ggxJHGoW4gZ2nhuqNuIHbhu5tpIGPhu6EgbeG6q3UgdGjhuqVwLiBN4bq3dCBraMOhYywgdGEgxJFhbmcgZMO5bmcgcGjGsMahbmcgcGjDoXAgQmF5ZXMsIHThuqV0IGPhuqMgY8OhYyB0aGFtIHPhu5EgYmV0YSB0cm9uZyBtw7QgaMOsbmggxJHhu4F1IMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBk4buxYSB2w6BvIMSR4buLbmggbMO9IEJheWVzIG5oxrAgdGEgxJHDoyBiaeG6v3QsIHbDoCB0YSBz4bq9IGPDsyBwaMOibiBwaOG7kWkgaOG6rXUgbmdoaeG7h20uDQoNClThuqFtIGJp4buHdCBjw6FjIGLhuqFuLg==