library(viridis)
Loading required package: viridisLite
library("scatterplot3d") # load
package 㤼㸱scatterplot3d㤼㸲 was built under R version 4.1.3
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages ------------------------ tidyverse 1.3.1 --
√ ggplot2 3.3.5     √ purrr   0.3.4
√ tibble  3.1.6     √ dplyr   1.0.7
√ tidyr   1.2.0     √ stringr 1.4.0
√ readr   2.1.2     √ forcats 0.5.1
-- Conflicts --------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(betareg)
package 㤼㸱betareg㤼㸲 was built under R version 4.1.3
library(lme4)
Loading required package: Matrix

Attaching package: 㤼㸱Matrix㤼㸲

The following objects are masked from 㤼㸱package:tidyr㤼㸲:

    expand, pack, unpack
library(pheatmap)
library(ggthemes)
library(VGAM)
package 㤼㸱VGAM㤼㸲 was built under R version 4.1.3Loading required package: stats4
Loading required package: splines

Attaching package: 㤼㸱VGAM㤼㸲

The following object is masked from 㤼㸱package:tidyr㤼㸲:

    fill
meta_colors = list(
    "new_class" = c(
        "M" = "#9E0142",
        "T + M" = "#F46D43",
        "T + B" = "#FEE08B",
        "T + F" = "#E6F598",
        "F" = "#ABDDA4",
        "E + F + M" = "#66C2A5"
    )

)
pca_RA <- readRDS("d_pca_category_all_2021-08-29.rds")

dt = readRDS('C:\\Users\\Juan\\Documents\\single_cell\\mat_baseline_disease_duration_per_sample.rds')

dt

dt = 
  dt %>% 
  mutate_at(vars(-("disease_duration")), function(x){ return(x*10^-2)}) %>%
  mutate(sample = rownames(dt))

dt

dt = 
dt %>% rename(B_Cell = `B cell`,
              T_cell = `T cell`)

dt$NK = ifelse(dt$NK == 0, 0.000000000001,dt$NK)
dt$B_Cell = ifelse(dt$B_Cell == 0, 0.000000000001,dt$B_Cell)

classes=
  pca_RA %>%
  dplyr::select(donor,new_class)
pl = function(a,b,c){
  out =
   b %>%
  ggplot() +
  geom_point(aes_string(x = 'disease_duration', y =a)) +
    ggtitle(c)
             
  return(out)
}

for (i in c('B_Cell','Endothelial','Fibroblast','Myeloid','NK','T_cell')){
 
print(pl(i,dt,i))
}

Using Dirichlet

This model is when response is summed to 1

Dirichlet regression is a type of regression model used to analyze proportions or compositional data. It is based on the Dirichlet distribution, which is a multivariate distribution that is defined on the simplex, a geometric space that represents a set of proportions that sum to one.

The assumptions of Dirichlet regression include:


# load the DirichletReg package
library(DirichletReg)


# fit a Dirichlet regression model 

dt %>% dplyr::select_if(is.numeric) %>%  cor() %>% pheatmap()


#fit <- vglm(cbind(Endothelial,Fibroblast,Myeloid) ~ disease_duration, dirichlet, data = dt)
fit <- vglm(cbind(B_Cell,Endothelial,T_cell,Fibroblast,Myeloid,NK) ~ disease_duration, dirichlet, data = dt)

# view the summary of the model
summary(fit)

Call:
vglm(formula = cbind(B_Cell, Endothelial, T_cell, Fibroblast, 
    Myeloid, NK) ~ disease_duration, family = dirichlet, data = dt)

Coefficients: 
                    Estimate Std. Error z value Pr(>|z|)    
(Intercept):1      -0.192067   0.129393  -1.484   0.1377    
(Intercept):2      -0.318306   0.129811  -2.452   0.0142 *  
(Intercept):3       0.956403   0.117143   8.164 3.23e-16 ***
(Intercept):4       0.067811   0.125759   0.539   0.5897    
(Intercept):5       0.540631   0.120654   4.481 7.44e-06 ***
(Intercept):6      -0.697911   0.133574  -5.225 1.74e-07 ***
disease_duration:1 -0.053033   0.012830  -4.134 3.57e-05 ***
disease_duration:2  0.004496   0.012291   0.366   0.7145    
disease_duration:3 -0.028983   0.011819  -2.452   0.0142 *  
disease_duration:4  0.003285   0.011996   0.274   0.7842    
disease_duration:5  0.002699   0.011623   0.232   0.8164    
disease_duration:6 -0.009885   0.012776  -0.774   0.4391    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Number of linear predictors:  6 

Names of linear predictors: loglink(shape1), loglink(shape2), 
loglink(shape3), loglink(shape4), loglink(shape5), 
loglink(shape6)

Log-likelihood: 2770.584 on 408 degrees of freedom

Number of Fisher scoring iterations: 16 

No Hauck-Donner effect found in any of the estimates
plot(fit)


#residuals(fit)
output = residuals(fit) %>% as.data.frame()

colnames(output) = c('B cell','Endothelial','T cell','Fibroblast','Myeloid','NK')

output
saveRDS(output,'dirichlet_weighted_proportions_celltypes.rds')

PCA

library(devtools)
install_github("vqv/ggbiplot")
library(viridis)
pc <- prcomp(output %>% t(),
             center = TRUE,
            scale. = TRUE)
pc$rotation
                 PC1          PC2           PC3          PC4
BRI-401  0.047319790  0.214761842 -0.0258437632  0.041014003
BRI-403 -0.021509785  0.033877409 -0.2774825180  0.026670839
BRI-405  0.129000813  0.043043325 -0.1622670760 -0.125198187
BRI-407 -0.182009441  0.064150724  0.0112082475 -0.006192900
BRI-409 -0.142453812 -0.074816170 -0.0684155899 -0.164539210
BRI-411  0.123168330  0.083208280  0.1613180751 -0.055026762
BRI-413  0.127647508 -0.131071242 -0.0537234790  0.088786356
BRI-415 -0.091057172 -0.184675538 -0.0746998539  0.074045176
BRI-417 -0.146930942 -0.086738555 -0.1060815391  0.107964891
BRI-419 -0.002203264  0.075724256 -0.2547307103  0.079053548
BRI-421  0.050469582  0.055100408 -0.0424400178  0.296029348
BRI-425  0.164888654  0.036382305 -0.0690862700  0.116586772
BRI-427  0.147156593 -0.058113841 -0.0433283122  0.132056961
BRI-429  0.004529575  0.151596739  0.2164909498  0.065220590
BRI-431 -0.094547092  0.021276152 -0.2432437204  0.027765672
BRI-436 -0.184214422 -0.048609480 -0.0214816693 -0.015874104
BRI-440 -0.128338146  0.109679046  0.0557123665  0.161179913
BRI-458 -0.169703027 -0.026252676 -0.1085981509  0.041190672
BRI-460  0.145237092 -0.066132166 -0.1130893883 -0.123075737
BRI-462  0.113347722  0.031263333 -0.2189448426  0.083025429
BRI-475  0.033727123  0.136835689 -0.0354665515  0.219429039
BRI-479  0.158886931  0.120237611 -0.0084391972 -0.063622736
BRI-481  0.086483044 -0.071339885 -0.1088954090  0.233398454
BRI-483 -0.169687992  0.082639657  0.0208392031 -0.062077951
BRI-485 -0.165863075  0.059975652 -0.1074318369 -0.030531116
BRI-503  0.003067853 -0.171607768  0.1245054185  0.166953164
BRI-505 -0.153097735 -0.125101567  0.0147018416 -0.077932428
BRI-507 -0.125408356  0.041642216  0.0747719516 -0.206383792
BRI-509  0.070869844 -0.108409675  0.2348428410 -0.015773732
BRI-511  0.137873241 -0.113634875 -0.0934558444 -0.103449575
BRI-515  0.018381612 -0.232971224  0.0099027090 -0.051319013
BRI-525  0.150882525  0.027414175 -0.1221017889 -0.135749752
BRI-527 -0.174926361 -0.051021414 -0.0002547576 -0.097742014
BRI-534  0.067960248 -0.180353354 -0.0327198663 -0.131133711
BRI-536 -0.146707125  0.018267105  0.1083371979 -0.135254780
BRI-538 -0.151012298 -0.072303984  0.0299668577  0.163409361
BRI-540  0.027900643  0.086151451 -0.2638873318  0.007953579
BRI-542 -0.152206383  0.082327542  0.0313956653 -0.077541539
BRI-544 -0.086054441 -0.105488177 -0.1203407374 -0.149592092
BRI-546 -0.098634268 -0.149193677  0.1604567071 -0.045576463
BRI-548 -0.148293425  0.073659804  0.1173701224 -0.092097381
BRI-550  0.149622105  0.055922205  0.1450956715 -0.016029560
BRI-552 -0.128477130  0.041177051 -0.0224603260  0.227324313
BRI-554  0.151317464  0.069495250  0.0226847513 -0.157368896
BRI-556 -0.139789573  0.061229451 -0.1098640150  0.100513201
BRI-558 -0.110829290 -0.187010882  0.0121190002  0.033275942
BRI-560 -0.151003037  0.023552506 -0.0623014840  0.176858944
BRI-562  0.024162401  0.231866368  0.0166484298  0.009382544
BRI-564 -0.016094379  0.154666897  0.1925335896  0.003211901
BRI-566  0.008547559 -0.196367879  0.1454542808  0.077155681
BRI-570  0.095247687  0.170104002  0.0684420705  0.130907565
BRI-581 -0.106696941 -0.121490893  0.1637843982  0.104810516
BRI-583  0.068834087 -0.177282060  0.0451067032  0.138724382
BRI-585 -0.169192664  0.079627110 -0.0131212788 -0.075323259
BRI-589  0.133837829  0.135486285  0.1153656242 -0.038898871
BRI-601  0.156177731 -0.001291337 -0.1129758359  0.127713813
BRI-603 -0.158815454  0.002282460 -0.1027432528  0.127740622
BRI-605  0.053911028 -0.178279152 -0.1248956219 -0.112774593
BRI-607  0.056028864 -0.173111317  0.0008595188  0.186382222
BRI-611 -0.096483269  0.193288663  0.0144261553  0.087064067
BRI-613 -0.157365495 -0.023640298 -0.0347349284 -0.166156416
BRI-615  0.014091284 -0.221267831  0.0815561110  0.062972454
BRI-617 -0.106812274  0.077386710 -0.0108566870  0.237425621
BRI-619  0.018847547 -0.210932000  0.1152242650  0.067662215
BRI-621  0.132913781  0.124998665  0.1013578098  0.007139935
BRI-623 -0.120693475  0.171027076  0.0082961652 -0.009392798
BRI-625  0.064361649  0.161852016  0.1869050030 -0.039867979
BRI-627  0.134490262 -0.020448177 -0.1916829435 -0.080011949
BRI-631 -0.043499593  0.056692425 -0.1943997373 -0.215172460
BRI-635  0.161809042 -0.101741358  0.0491071894 -0.041030188
                  PC5           PC6
BRI-401  0.1753304862 -0.0855729703
BRI-403  0.1494348329  0.3036689071
BRI-405 -0.1224381614 -0.5292822347
BRI-407 -0.0296407010 -0.6465161903
BRI-409 -0.0752958123  0.0419101336
BRI-411 -0.2004714825  0.1362005320
BRI-413 -0.2060944133 -0.0285580185
BRI-415 -0.1217934954 -0.0636354326
BRI-417  0.0834406623  0.0188033002
BRI-419 -0.1672833117  0.0738378169
BRI-421 -0.0003165037 -0.1443436012
BRI-425 -0.1013632418  0.0497667435
BRI-427  0.2169686017 -0.0051626961
BRI-429  0.0502378502  0.0013534281
BRI-431 -0.1284758271  0.0221238323
BRI-436  0.0416748286 -0.0530889786
BRI-440 -0.1119422811  0.0277897814
BRI-458 -0.1031857130 -0.0350711692
BRI-460  0.1129348214 -0.0736831560
BRI-462  0.0315428254 -0.0084969370
BRI-475  0.2219053209  0.0703721270
BRI-479 -0.0076935759 -0.0621258121
BRI-481  0.1035842191  0.0016414659
BRI-483 -0.1056121620  0.0473433178
BRI-485  0.0943949840 -0.0934788632
BRI-503 -0.0916926778 -0.0472815357
BRI-505  0.0504856130  0.0411842481
BRI-507 -0.1289750974  0.0693659967
BRI-509  0.0597455895 -0.0529767480
BRI-511 -0.1081740033  0.0176302330
BRI-515 -0.0123012901  0.0417641741
BRI-525 -0.0140508245 -0.0284262212
BRI-527  0.0528867659  0.0035995580
BRI-534 -0.1921949871  0.0007912852
BRI-536  0.1616019566  0.0379674969
BRI-538 -0.0221002189  0.0009083345
BRI-540 -0.1142020660 -0.0085901562
BRI-542 -0.2309000590  0.0381339598
BRI-544  0.2611555816 -0.0224281532
BRI-546  0.0717739555  0.0128510787
BRI-548 -0.1263529902 -0.0160817268
BRI-550  0.1559140896 -0.0003519611
BRI-552 -0.0145924376 -0.0069923667
BRI-554  0.0974728127  0.0249908478
BRI-556 -0.2212925726  0.1588843280
BRI-558  0.0895600555 -0.0633766860
BRI-560 -0.0417886222 -0.0295880258
BRI-562 -0.0908428949  0.0351637889
BRI-564 -0.2123390893  0.0662184972
BRI-566  0.0590005011 -0.0216340835
BRI-570 -0.0637854986  0.0191822188
BRI-581 -0.0340049792  0.0769561670
BRI-583 -0.1791492116  0.0506458658
BRI-585  0.1035057891  0.0458114970
BRI-589  0.0465421709  0.0582868021
BRI-601  0.0675949085  0.0124175355
BRI-603  0.0728415317 -0.0136092338
BRI-605 -0.1278764495  0.0021657355
BRI-607 -0.1166760337  0.0120644360
BRI-611  0.0212247929 -0.0311682048
BRI-613  0.0751304252  0.0566372417
BRI-615  0.0566031272 -0.0556827191
BRI-617  0.0901689992 -0.0618329680
BRI-619  0.0266163119 -0.0194719832
BRI-621 -0.1899643116  0.0334733038
BRI-623  0.1543780107  0.0754309542
BRI-625  0.0031119661 -0.1459716293
BRI-627  0.0213482603 -0.0179788381
BRI-631  0.0230352224  0.0764677154
BRI-635  0.1179220348  0.0397635271
summary(pc)
Importance of components:
                          PC1    PC2    PC3    PC4     PC5
Standard deviation     5.2768 4.2129 3.4015 3.1224 1.75714
Proportion of Variance 0.3978 0.2535 0.1653 0.1393 0.04411
Cumulative Proportion  0.3978 0.6513 0.8166 0.9559 1.00000
                             PC6
Standard deviation     1.377e-15
Proportion of Variance 0.000e+00
Cumulative Proportion  1.000e+00
pca = pc$rotation %>% as.data.frame()

pca$donor = rownames(pca)
pca = 
  pca %>% 
    left_join(classes)
Joining, by = "donor"
adj_plot = 
pca %>%
  ggplot() +
    geom_point(aes(x = -PC1, y =-PC2, fill = new_class),size = 4, shape = 21, stroke = 0.2)+
scale_fill_manual(values = meta_colors$new_class, name = "") + 
theme_clean(base_size = 18) + ggtitle('Dirichlet')

scatterplot3d(pca$PC1,pca$PC3,pca$PC2, angle =60)

adj_plot

First 2 PCs are totalling 65% of variance

pc <- prcomp(output ,
             center = TRUE,
            scale. = TRUE)

library(ggbiplot)
Loading required package: plyr
--------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
--------------------------------------------------------------

Attaching package: 㤼㸱plyr㤼㸲

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    arrange, count, desc, failwith, id, mutate, rename,
    summarise, summarize

The following object is masked from 㤼㸱package:purrr㤼㸲:

    compact

Loading required package: scales

Attaching package: 㤼㸱scales㤼㸲

The following object is masked from 㤼㸱package:viridis㤼㸲:

    viridis_pal

The following object is masked from 㤼㸱package:purrr㤼㸲:

    discard

The following object is masked from 㤼㸱package:readr㤼㸲:

    col_factor

Loading required package: grid
g <- ggbiplot(pc,
              obs.scale = 1,
              var.scale = 1,
              ellipse = TRUE,
              circle = TRUE,
              ellipse.prob = 0.68)
g <- g + scale_color_discrete(name = '')
g <- g + theme(legend.direction = 'horizontal',
               legend.position = 'top')


print(g)



pc <- prcomp(output %>% t(),
             center = TRUE,
            scale. = TRUE)

library(ggbiplot)
g <- ggbiplot(pc,
              obs.scale = 1,
              var.scale = 1,
              ellipse = TRUE,
              circle = TRUE,
              ellipse.prob = 0.68)
g <- g + scale_color_discrete(name = '')
g <- g + theme(legend.direction = 'horizontal',
               legend.position = 'top')


print(g)

Original PCA results (Fan’s)

options(repr.plot.width = 4.5, repr.plot.height = 5)

p1 = 
ggplot(pca_RA, aes(PC1, -PC2, fill = new_class)) +
geom_point(size = 4, shape = 21, stroke = 0.2) +
scale_fill_manual(values = meta_colors$new_class, name = "") + 
theme_clean(base_size = 18) + ggtitle('Fan Original')
p1

GLM for adjusting values

Re loading the data

dt = readRDS('C:\\Users\\Juan\\Documents\\single_cell\\mat_baseline_disease_duration_per_sample.rds')

dt

dt = 
  dt %>% 
  mutate(sample = rownames(dt))

dt

dt = 
dt %>% dplyr::rename(B_Cell = `B cell`,
              T_cell = `T cell`)

dt$NK = ifelse(dt$NK == 0, 0.000000000001,dt$NK)
dt$B_Cell = ifelse(dt$B_Cell == 0, 0.000000000001,dt$B_Cell)

classes=
  pca_RA %>%
  dplyr::select(donor,new_class)

Will be using multiple models

bcell_mod <- glm(B_Cell ~ disease_duration, data = dt)
#summary(bcell_mod)
bcell_res = residuals(bcell_mod)

tcell_mod  = glm(T_cell ~ disease_duration, data = dt)
#summary(tcell_mod)
tcell_res= residuals(tcell_mod)

myeloid_mod = glm(Myeloid ~ disease_duration, data = dt)
#summary(myeloid_mod)
myeloid_res = residuals(myeloid_mod)

nk_mod = glm(NK ~ disease_duration, data = dt)
#summary(nk_mod)
nk_res = residuals(nk_mod)

endo_mod = glm(Endothelial ~ disease_duration, data = dt)
#summary(endo_mod)
endo_res = residuals(endo_mod)

fibro_mod =  glm(Fibroblast ~ disease_duration, data = dt)
#summary(fibro_mod)
fibro_res = residuals(fibro_mod)


out2 = 
  data.frame(B_cell = bcell_res,
             T_cell = tcell_res,
             Myeloid = myeloid_res,
             NK = nk_res,
             Endothelial = endo_res,
             Fibroblast = fibro_res)
rownames(out2) = rownames(dt)
out2

saveRDS(out2,'glm_weighted_proportions_celltypes.rds')

pc <- prcomp(out2 %>% t(),
             center = TRUE,
            scale. = TRUE)
pc$rotation
                 PC1           PC2          PC3          PC4
BRI-401  0.054708430 -1.985618e-01  0.025985706  0.038470976
BRI-403  0.064217150 -1.829499e-01 -0.105070402  0.047926145
BRI-405  0.166522874 -6.667545e-02  0.027786642 -0.026590088
BRI-407 -0.166409900 -5.229813e-02  0.069872411  0.031092271
BRI-409 -0.084737825  3.284590e-02 -0.280518411 -0.074957510
BRI-411  0.080094487  3.690621e-02  0.132747704 -0.312375568
BRI-413  0.120340651  1.379298e-01  0.048135831  0.116638013
BRI-415 -0.130164268  9.924757e-02 -0.160658645  0.020199539
BRI-417 -0.160533464  6.471904e-03 -0.125084852  0.075500571
BRI-419  0.063327206 -1.891202e-01 -0.082537867  0.022314720
BRI-421  0.054232950 -1.281458e-01  0.176312656  0.199495874
BRI-425  0.166229115  1.155651e-03  0.078681828  0.099179618
BRI-427  0.152616910  7.755465e-02  0.054461574  0.106658259
BRI-429 -0.110900030 -7.702716e-02  0.194996638 -0.142125647
BRI-431  0.002352233 -1.633256e-01 -0.207056847  0.036274597
BRI-436 -0.171246064  4.304860e-02 -0.043591960  0.019664036
BRI-440 -0.152610204 -5.968329e-02  0.129603218  0.052255512
BRI-458 -0.106870079 -1.243433e-01 -0.125255119  0.147375566
BRI-460  0.158800577  9.119940e-02 -0.002921029  0.034898514
BRI-462  0.145363007 -1.063844e-01 -0.002934364  0.106265635
BRI-475  0.048218824 -1.865225e-01  0.077665274  0.072334050
BRI-479  0.152644502 -6.799097e-02  0.072493006 -0.129474897
BRI-481  0.146124461  6.284015e-02  0.065127762  0.175517721
BRI-483 -0.161945971 -6.650698e-02  0.012238661 -0.100228065
BRI-485 -0.061779179 -1.807236e-01 -0.120009408  0.021457603
BRI-503 -0.109605961  1.424685e-01  0.120901255  0.065965467
BRI-505 -0.155367968  7.708958e-02 -0.102629418 -0.000300078
BRI-507 -0.121558443  5.612786e-06  0.009966081 -0.292574782
BRI-509 -0.049903742  1.666759e-01  0.165054406 -0.080258084
BRI-511  0.146002976  1.164921e-01 -0.028416433  0.029747886
BRI-515 -0.003032161  1.855195e-01 -0.152933231 -0.015314438
BRI-525  0.174145917  1.702987e-02  0.041817670 -0.034298838
BRI-527 -0.155959258  5.944797e-02 -0.124222993 -0.017346167
BRI-534  0.101342405  1.663717e-01 -0.070084085 -0.014720276
BRI-536 -0.161012662  5.124347e-02  0.067879828 -0.089167093
BRI-538 -0.169171085  3.928473e-02  0.065947229  0.043884759
BRI-540  0.082232317 -1.799309e-01 -0.072984838  0.030375241
BRI-542 -0.159230176 -5.462201e-02  0.020887074 -0.138683039
BRI-544 -0.008851274  1.964247e-02 -0.326104421 -0.056522686
BRI-546 -0.153498084  8.620183e-02  0.093550282  0.006421865
BRI-548 -0.163976711  2.124267e-03  0.087077421 -0.106318078
BRI-550  0.132551280  1.175527e-01  0.040817678 -0.134972698
BRI-552 -0.086562016 -1.397325e-01  0.106593650  0.183786933
BRI-554  0.119956331 -2.016323e-02  0.049532237 -0.287027087
BRI-556  0.003303338 -1.950169e-01  0.005026714  0.149603018
BRI-558 -0.138439535  1.159649e-01 -0.046417760  0.059760716
BRI-560 -0.147999475 -8.208063e-02  0.088342017  0.107111661
BRI-562  0.030712868 -2.020650e-01  0.066561315 -0.028698519
BRI-564 -0.126995211 -3.474024e-02  0.183146946 -0.150137973
BRI-566 -0.105230456  1.461104e-01  0.122337276  0.069689190
BRI-570  0.061020611 -1.811802e-01  0.114766122  0.048626985
BRI-581 -0.157597128  7.551658e-02  0.092037913  0.013046237
BRI-583  0.004316435  1.951264e-01  0.093651386  0.099834805
BRI-585 -0.148799227 -1.117498e-01  0.002681060  0.036244734
BRI-589  0.108026616 -6.150577e-02  0.108720397 -0.265695769
BRI-601  0.164086519  2.687655e-02  0.049622659  0.128449513
BRI-603 -0.147271725 -1.073652e-01 -0.013151159  0.086766611
BRI-605  0.068389090  1.090963e-01 -0.251608938 -0.040579378
BRI-607  0.053252040  1.705867e-01  0.097998262  0.163940705
BRI-611 -0.037866284 -1.968996e-01  0.084225948  0.049532599
BRI-613 -0.087619529  2.264175e-02 -0.277245261 -0.088010454
BRI-615 -0.052346153  1.852523e-01  0.090021602  0.103296968
BRI-617 -0.122334559 -1.183427e-01  0.128249642  0.096784309
BRI-619 -0.078225758  1.659268e-01  0.118616915  0.093355975
BRI-621  0.144866659 -3.055699e-02  0.048495665 -0.215940717
BRI-623 -0.028635432 -2.038359e-01  0.060351919  0.018282657
BRI-625 -0.002961110 -7.110292e-02  0.165515481 -0.319090294
BRI-627  0.173054836  2.284208e-03 -0.060282340  0.042073016
BRI-631  0.044218519 -1.269846e-01 -0.236235644 -0.106422382
BRI-635  0.135580787  1.250941e-01  0.048233331  0.079763221
                  PC5          PC6
BRI-401 -0.0395395355 -0.056871071
BRI-403 -0.0001086917 -0.789408790
BRI-405 -0.0975755604 -0.431893938
BRI-407 -0.1111481183  0.050235699
BRI-409 -0.0408320759  0.023983261
BRI-411 -0.1248299916  0.001983086
BRI-413 -0.1110308799  0.032957216
BRI-415 -0.0615797019 -0.053186962
BRI-417  0.0067802281 -0.058592444
BRI-419  0.0567978007  0.067656146
BRI-421  0.1707619201 -0.003932114
BRI-425 -0.0667823385  0.016881163
BRI-427  0.2613957487 -0.057241121
BRI-429  0.1280705614  0.012658627
BRI-431 -0.0900859646  0.084988382
BRI-436 -0.0866486818 -0.071055772
BRI-440 -0.1473512020  0.026234923
BRI-458 -0.1810070650  0.044054912
BRI-460 -0.0127520520 -0.013704441
BRI-462 -0.0522092766  0.057678673
BRI-475  0.3932053708 -0.008401660
BRI-479  0.0662709098  0.043948450
BRI-481  0.0708892809  0.006068541
BRI-483  0.0170235702 -0.022982812
BRI-485  0.1587177953  0.074027872
BRI-503  0.0206034957 -0.052436414
BRI-505  0.0312575536 -0.034833814
BRI-507 -0.0623558781 -0.060588134
BRI-509  0.1541872729 -0.117490102
BRI-511 -0.0524725675 -0.012504863
BRI-515  0.1762654591 -0.108296841
BRI-525 -0.0830410816  0.011701016
BRI-527 -0.0861382840 -0.033157783
BRI-534 -0.0845216789  0.021555279
BRI-536  0.2534754670  0.009401268
BRI-538  0.0410979871 -0.076277633
BRI-540 -0.0402860293  0.048774078
BRI-542 -0.0614325043 -0.017453753
BRI-544  0.1482884348  0.021943567
BRI-546  0.0554113369 -0.079282958
BRI-548 -0.1014624112 -0.065219873
BRI-550 -0.0442323525 -0.055570174
BRI-552  0.1712856435 -0.029273661
BRI-554  0.0926369273  0.020208932
BRI-556  0.1139315958  0.051195634
BRI-558  0.3509124505 -0.001239951
BRI-560 -0.1495835471 -0.064363099
BRI-562 -0.1117085081  0.034525354
BRI-564 -0.2140068262 -0.037030467
BRI-566  0.0238947351 -0.073663853
BRI-570 -0.1464810581  0.043945653
BRI-581  0.0552471882 -0.064768414
BRI-583 -0.0422983571 -0.113529377
BRI-585 -0.1015877649  0.088406862
BRI-589  0.0657656975 -0.029694459
BRI-601 -0.0437061025 -0.036861466
BRI-603 -0.0131225769 -0.014345542
BRI-605  0.0061510715 -0.037719194
BRI-607 -0.0661769811 -0.012393866
BRI-611 -0.0563576346  0.012274412
BRI-613  0.0512339246  0.006250210
BRI-615 -0.0196000931  0.006619475
BRI-617 -0.0325209698 -0.134816640
BRI-619 -0.0969814103 -0.045914142
BRI-621 -0.0596496423  0.004587664
BRI-623  0.0803919500  0.038962852
BRI-625  0.1864612892 -0.009366699
BRI-627 -0.0274503618  0.007377534
BRI-631  0.0048646841 -0.116221367
BRI-635 -0.0340597050  0.039199756
summary(pc)
Importance of components:
                         PC1   PC2    PC3    PC4     PC5
Standard deviation     5.650 4.748 3.0067 2.4791 0.59585
Proportion of Variance 0.456 0.322 0.1291 0.0878 0.00507
Cumulative Proportion  0.456 0.778 0.9071 0.9949 1.00000
                             PC6
Standard deviation     1.112e-15
Proportion of Variance 0.000e+00
Cumulative Proportion  1.000e+00
pca = pc$rotation %>% as.data.frame()

pca$donor = rownames(pca)
pca = 
  pca %>% 
    left_join(classes)
Joining, by = "donor"
p2 =
pca %>%
  ggplot() +
    geom_point(aes(x = - PC1, y =PC2, fill = new_class),size = 4, shape = 21, stroke = 0.2)+
scale_fill_manual(values = meta_colors$new_class, name = "") + 
theme_clean(base_size = 18) + ggtitle('GLM')

p2

First 2 PCs are sum of 77.8%

Adding covariates to the models above

We are adding covariates because the events of proportion

bcell_mod <- glm(B_Cell ~ disease_duration + NK + Myeloid + Endothelial + T_cell  + Fibroblast, data = dt)
#summary(bcell_mod)
bcell_res = residuals(bcell_mod)

tcell_mod  = glm(T_cell ~ disease_duration +  NK + Myeloid + Endothelial + B_Cell + Fibroblast, data = dt)
#summary(tcell_mod)
tcell_res= residuals(tcell_mod)

myeloid_mod = glm(Myeloid ~ disease_duration + Endothelial + B_Cell + Fibroblast + NK + T_cell, data = dt)
#summary(myeloid_mod)
myeloid_res = residuals(myeloid_mod)

nk_mod = glm(NK ~ disease_duration + Endothelial + B_Cell + Fibroblast + Myeloid + T_cell, data = dt)
#summary(nk_mod)
nk_res = residuals(nk_mod)

endo_mod = glm(Endothelial ~ disease_duration + B_Cell + Fibroblast + Myeloid + T_cell + NK, data = dt)
#summary(endo_mod)
endo_res = residuals(endo_mod)

fibro_mod =  glm(Fibroblast ~ disease_duration + Myeloid + T_cell + NK + B_Cell + Endothelial, data = dt)
#summary(fibro_mod)
fibro_res = residuals(fibro_mod)


out3 = 
  data.frame(B_cell = bcell_res,
             T_cell = tcell_res,
             Myeloid = myeloid_res,
             NK = nk_res,
             Endothelial = endo_res,
             Fibroblast = fibro_res)
rownames(out2) = rownames(dt)
out3
pc <- prcomp(out3 %>% t(),
             center = TRUE,
            scale. = TRUE)
pc$rotation
                 PC1          PC2          PC3          PC4
BRI-401  0.100315672  0.190003509  0.011390953  0.054378699
BRI-403  0.176632569  0.059187531 -0.074119012 -0.024222978
BRI-405  0.059716831 -0.006163183  0.228708602  0.226957137
BRI-407  0.029898039 -0.168913114  0.125547387 -0.164749628
BRI-409  0.102673176  0.073745400  0.069845769 -0.064195609
BRI-411  0.086563791 -0.136201877  0.106835051 -0.174974370
BRI-413  0.031998728 -0.212276051  0.073288643  0.063446017
BRI-415  0.091162689 -0.138880622 -0.042599465  0.124880119
BRI-417  0.124095677 -0.100018276  0.187674355  0.003856950
BRI-419  0.138663438  0.125428147  0.014328226 -0.020378129
BRI-421  0.139984918 -0.134081317 -0.063406340 -0.101498029
BRI-425  0.145069711 -0.025345106 -0.040724678  0.183171660
BRI-427  0.006850087 -0.168500095 -0.168507988 -0.148705081
BRI-429  0.163127463  0.062229473 -0.099603880 -0.131865378
BRI-431  0.170390349  0.102259753  0.035050498 -0.045274299
BRI-436  0.125258154  0.046873951  0.211095391  0.130942597
BRI-440  0.079425650 -0.011592752  0.292879473  0.065370481
BRI-458  0.156727962  0.061886009  0.086467164  0.077693259
BRI-460 -0.042829099 -0.153306169 -0.060718362 -0.169267136
BRI-462  0.169071112  0.061659394 -0.105720664  0.073009618
BRI-475  0.110401864  0.126927740 -0.080417874  0.031126588
BRI-479  0.120781757 -0.113563485 -0.131719914 -0.005580155
BRI-481  0.061190960 -0.127552717 -0.185108690  0.183636990
BRI-483  0.182525847 -0.015192628  0.112196916  0.031809230
BRI-485  0.184830002  0.051332650  0.005819705 -0.073968222
BRI-503  0.068565387 -0.181544023  0.068767503 -0.145832599
BRI-505  0.096224087 -0.171237674  0.129590200 -0.053444196
BRI-507  0.164217523  0.013900137 -0.025413384  0.192029915
BRI-509  0.099090222 -0.156938027 -0.028096496  0.180163761
BRI-511 -0.018283024 -0.200347317  0.095303706 -0.086791989
BRI-515  0.096485562 -0.185334987  0.037307494 -0.009465852
BRI-525  0.092050397 -0.049869106 -0.113591850  0.080777051
BRI-527  0.162163599 -0.073200750 -0.003021094  0.056164721
BRI-534  0.026519443 -0.137641281 -0.229112606  0.124273607
BRI-536  0.093543172 -0.149127190 -0.050569860 -0.181881417
BRI-538  0.115352456 -0.123735164 -0.153302217  0.014644812
BRI-540  0.099025067  0.172038289 -0.075854382 -0.064959162
BRI-542  0.148055042  0.104956004  0.043643967 -0.008274883
BRI-544  0.146384026 -0.012970972  0.005562054 -0.172031802
BRI-546  0.118814375 -0.131595180  0.152335728  0.091627005
BRI-548  0.138011595  0.132718249 -0.056276923  0.067929880
BRI-550 -0.055241274 -0.196452670 -0.028435108  0.137633486
BRI-552  0.088573574  0.130963819  0.097259555  0.097639599
BRI-554 -0.041877745  0.077782679 -0.294075205  0.061121893
BRI-556  0.175796359  0.024780179 -0.078508108  0.034417989
BRI-558  0.150016668 -0.098242163 -0.043473620  0.039191818
BRI-560  0.119901824 -0.009039005  0.161577495 -0.003651277
BRI-562  0.126660717  0.124965836 -0.134081419 -0.116482116
BRI-564  0.155137284  0.042420693 -0.152595920  0.010841246
BRI-566  0.030054446 -0.114682388  0.105765450 -0.223521270
BRI-570  0.163482400 -0.004772540  0.007408869  0.052612089
BRI-581  0.113818603 -0.049662792 -0.185580450  0.124052395
BRI-583  0.144881463 -0.135659615 -0.014555834 -0.096784217
BRI-585  0.184998740 -0.039635946  0.061344221 -0.072019883
BRI-589  0.057597684 -0.102302689 -0.084348541  0.225238972
BRI-601 -0.034424494 -0.075168010 -0.197913596 -0.151452619
BRI-603  0.181966286 -0.031437426 -0.005180798 -0.120975742
BRI-605  0.058805769 -0.138378014 -0.054843217 -0.244798977
BRI-607  0.017757281 -0.175994612  0.019153227  0.210838619
BRI-611  0.150949235  0.092452759  0.151184344  0.004681230
BRI-613  0.150564035  0.062653185  0.117254807 -0.161987824
BRI-615  0.026127782 -0.191789436  0.065548747  0.061899736
BRI-617  0.135367929 -0.063009674  0.048986852  0.204856557
BRI-619 -0.005071853 -0.206801058  0.002567900 -0.074496380
BRI-621  0.100920764  0.033681520 -0.236310020 -0.107821833
BRI-623  0.148441330  0.122310459 -0.092155782 -0.022149826
BRI-625  0.180178860 -0.043221240 -0.101115136  0.043758003
BRI-627 -0.048628187 -0.143475395 -0.213209175  0.116146652
BRI-631  0.147823673  0.078036490 -0.070665204 -0.184039578
BRI-635 -0.074882002 -0.200313282  0.001104897  0.074736396
                 PC5          PC6
BRI-401 -0.007432558  0.078609870
BRI-403  0.091811776 -0.108294632
BRI-405  0.057658575  0.324291811
BRI-407 -0.090259913  0.097513509
BRI-409 -0.274885854 -0.036966660
BRI-411 -0.116377570  0.030505967
BRI-413 -0.018863309 -0.060558985
BRI-415 -0.192728253  0.031546005
BRI-417  0.100359361  0.001809946
BRI-419  0.159571867 -0.003414639
BRI-421  0.048358016 -0.024056259
BRI-425  0.151854721 -0.065483106
BRI-427 -0.023670321 -0.001067239
BRI-429  0.019477812  0.200377590
BRI-431 -0.033533598 -0.041651951
BRI-436 -0.005229022 -0.021638281
BRI-440 -0.009971277 -0.028053880
BRI-458  0.152769431 -0.046594534
BRI-460  0.180878004  0.168750503
BRI-462  0.068264162 -0.066724316
BRI-475  0.203422048  0.048498522
BRI-479  0.168273076 -0.273546736
BRI-481  0.020785726 -0.021467694
BRI-483 -0.005883196  0.054192965
BRI-485  0.043317461 -0.077653819
BRI-503 -0.051869825  0.047781346
BRI-505  0.010554244  0.021837530
BRI-507 -0.020466290 -0.066462083
BRI-509 -0.011188482  0.122162658
BRI-511  0.088720119 -0.002729748
BRI-515  0.095290963 -0.027435955
BRI-525  0.279706962  0.594471342
BRI-527 -0.160018682 -0.011424065
BRI-534  0.003199022 -0.005419793
BRI-536  0.087527996 -0.024859401
BRI-538 -0.134612858 -0.038223375
BRI-540  0.101374658 -0.043219552
BRI-542 -0.163738138  0.075575655
BRI-544 -0.171276234  0.028140618
BRI-546  0.034992823  0.002760399
BRI-548 -0.112071958 -0.158232575
BRI-550  0.027452047 -0.325951512
BRI-552 -0.203189871  0.119505146
BRI-554 -0.007858970  0.008833645
BRI-556 -0.126378735 -0.014870805
BRI-558 -0.163973014  0.013409765
BRI-560  0.230419187 -0.166321582
BRI-562 -0.012221784 -0.125175168
BRI-564 -0.128485699 -0.011192192
BRI-566  0.179092328 -0.105280530
BRI-570  0.197810263  0.022561194
BRI-581 -0.156039459  0.029838770
BRI-583  0.045077543 -0.058709520
BRI-585  0.005754434  0.003760156
BRI-589  0.187488777 -0.071511064
BRI-601  0.210455942 -0.000887168
BRI-603  0.020993027 -0.090148235
BRI-605 -0.078391194  0.098386149
BRI-607  0.070745605 -0.056168746
BRI-611  0.056701139 -0.064457714
BRI-613  0.012158598 -0.034614110
BRI-615 -0.161476036 -0.029324550
BRI-617 -0.117539944 -0.012606262
BRI-619 -0.125279311  0.037779351
BRI-621 -0.119562235  0.019821696
BRI-623  0.080380544 -0.023599498
BRI-625 -0.027092041  0.221898661
BRI-627 -0.025937535  0.009978290
BRI-631 -0.019488944  0.102457543
BRI-635 -0.050668905  0.061214224
summary(pc)
Importance of components:
                          PC1    PC2    PC3    PC4    PC5
Standard deviation     5.1107 4.4437 3.0522 2.7694 2.6738
Proportion of Variance 0.3731 0.2821 0.1331 0.1096 0.1021
Cumulative Proportion  0.3731 0.6552 0.7883 0.8979 1.0000
                             PC6
Standard deviation     5.592e-15
Proportion of Variance 0.000e+00
Cumulative Proportion  1.000e+00
pca = pc$rotation %>% as.data.frame()

pca$donor = rownames(pca)
pca = 
  pca %>% 
    left_join(classes)
Joining, by = "donor"
pca %>%
  ggplot() +
    geom_point(aes(x = PC1, y =PC2, fill = new_class),size = 4, shape = 21, stroke = 0.2)+
scale_fill_manual(values = meta_colors$new_class, name = "") + 
theme_clean(base_size = 18) 

It can be seen that adding the covariates will not make the pca more clearly

All the PCA plots

p1

p2

adj_plot

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeSgic2NhdHRlcnBsb3QzZCIpICMgbG9hZA0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGJldGFyZWcpDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KHBoZWF0bWFwKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoVkdBTSkNCmBgYA0KDQpgYGB7cn0NCm1ldGFfY29sb3JzID0gbGlzdCgNCiAgICAibmV3X2NsYXNzIiA9IGMoDQogICAgICAgICJNIiA9ICIjOUUwMTQyIiwNCiAgICAgICAgIlQgKyBNIiA9ICIjRjQ2RDQzIiwNCiAgICAgICAgIlQgKyBCIiA9ICIjRkVFMDhCIiwNCiAgICAgICAgIlQgKyBGIiA9ICIjRTZGNTk4IiwNCiAgICAgICAgIkYiID0gIiNBQkREQTQiLA0KICAgICAgICAiRSArIEYgKyBNIiA9ICIjNjZDMkE1Ig0KICAgICkNCg0KKQ0KYGBgDQoNCg0KYGBge3J9DQpwY2FfUkEgPC0gcmVhZFJEUygiZF9wY2FfY2F0ZWdvcnlfYWxsXzIwMjEtMDgtMjkucmRzIikNCg0KZHQgPSByZWFkUkRTKCdDOlxcVXNlcnNcXEp1YW5cXERvY3VtZW50c1xcc2luZ2xlX2NlbGxcXG1hdF9iYXNlbGluZV9kaXNlYXNlX2R1cmF0aW9uX3Blcl9zYW1wbGUucmRzJykNCg0KZHQNCg0KZHQgPSANCiAgZHQgJT4lIA0KICBtdXRhdGVfYXQodmFycygtKCJkaXNlYXNlX2R1cmF0aW9uIikpLCBmdW5jdGlvbih4KXsgcmV0dXJuKHgqMTBeLTIpfSkgJT4lDQogIG11dGF0ZShzYW1wbGUgPSByb3duYW1lcyhkdCkpDQoNCmR0DQoNCmR0ID0gDQpkdCAlPiUgcmVuYW1lKEJfQ2VsbCA9IGBCIGNlbGxgLA0KICAgICAgICAgICAgICBUX2NlbGwgPSBgVCBjZWxsYCkNCg0KZHQkTksgPSBpZmVsc2UoZHQkTksgPT0gMCwgMC4wMDAwMDAwMDAwMDEsZHQkTkspDQpkdCRCX0NlbGwgPSBpZmVsc2UoZHQkQl9DZWxsID09IDAsIDAuMDAwMDAwMDAwMDAxLGR0JEJfQ2VsbCkNCg0KY2xhc3Nlcz0NCiAgcGNhX1JBICU+JQ0KICBkcGx5cjo6c2VsZWN0KGRvbm9yLG5ld19jbGFzcykNCmBgYA0KDQoNCmBgYHtyfQ0KcGwgPSBmdW5jdGlvbihhLGIsYyl7DQogIG91dCA9DQogICBiICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fcG9pbnQoYWVzX3N0cmluZyh4ID0gJ2Rpc2Vhc2VfZHVyYXRpb24nLCB5ID1hKSkgKw0KICAgIGdndGl0bGUoYykNCiAgICAgICAgICAgICANCiAgcmV0dXJuKG91dCkNCn0NCg0KZm9yIChpIGluIGMoJ0JfQ2VsbCcsJ0VuZG90aGVsaWFsJywnRmlicm9ibGFzdCcsJ015ZWxvaWQnLCdOSycsJ1RfY2VsbCcpKXsNCiANCnByaW50KHBsKGksZHQsaSkpDQp9DQpgYGANCg0KDQoNCg0KIyMgVXNpbmcgRGlyaWNobGV0DQoNClRoaXMgbW9kZWwgaXMgd2hlbiByZXNwb25zZSBpcyBzdW1tZWQgdG8gMSANCg0KDQpEaXJpY2hsZXQgcmVncmVzc2lvbiBpcyBhIHR5cGUgb2YgcmVncmVzc2lvbiBtb2RlbCB1c2VkIHRvIGFuYWx5emUgcHJvcG9ydGlvbnMgb3IgY29tcG9zaXRpb25hbCBkYXRhLiBJdCBpcyBiYXNlZCBvbiB0aGUgRGlyaWNobGV0IGRpc3RyaWJ1dGlvbiwgd2hpY2ggaXMgYSBtdWx0aXZhcmlhdGUgZGlzdHJpYnV0aW9uIHRoYXQgaXMgZGVmaW5lZCBvbiB0aGUgc2ltcGxleCwgYSBnZW9tZXRyaWMgc3BhY2UgdGhhdCByZXByZXNlbnRzIGEgc2V0IG9mIHByb3BvcnRpb25zIHRoYXQgc3VtIHRvIG9uZS4NCg0KVGhlIGFzc3VtcHRpb25zIG9mIERpcmljaGxldCByZWdyZXNzaW9uIGluY2x1ZGU6DQoNCiAgKiBUaGUgcmVzcG9uc2UgdmFyaWFibGVzIGFyZSBwcm9wb3J0aW9ucyBvciBjb21wb3NpdGlvbmFsIGRhdGEsIGFuZCBlYWNoIG9ic2VydmF0aW9uIGNvbnNpc3RzIG9mIGEgc2V0IG9mIHByb3BvcnRpb25zIHRoYXQgc3VtIHRvIG9uZS4NCiAgKiBUaGUgcmVzcG9uc2UgdmFyaWFibGVzIGZvbGxvdyBhIERpcmljaGxldCBkaXN0cmlidXRpb24sIHdoaWNoIGlzIGEgY29udGludW91cyBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gdGhhdCBpcyBkZWZpbmVkIG9uIHRoZSBzaW1wbGV4Lg0KICAqIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcmVzcG9uc2UgdmFyaWFibGVzIGFuZCB0aGUgcHJlZGljdG9ycyBpcyBtb2RlbGVkIHVzaW5nIGEgbG9nIGxpbmsgZnVuY3Rpb24sIHdoaWNoIG1hcHMgdGhlIHByb3BvcnRpb25zIHRvIHRoZSByZWFsIGxpbmUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbW9kZWwgaXMgYmFzZWQgb24gdGhlIGxvZy1yYXRpbyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgcHJvcG9ydGlvbnMsIHJhdGhlciB0aGFuIHRoZSByYXcgcHJvcG9ydGlvbnMgdGhlbXNlbHZlcy4NClRoZSByZXNpZHVhbHMgb2YgdGhlIG1vZGVsIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCwgYW5kIHRoZSB2YXJpYW5jZSBvZiB0aGUgcmVzaWR1YWxzIGlzIGNvbnN0YW50IGFjcm9zcyB0aGUgcmFuZ2Ugb2YgdGhlIHByZWRpY3RvcnMuDQogICogVGhlIHByZWRpY3RvcnMgYXJlIG5vdCBjb2xsaW5lYXIsIGFuZCB0aGVyZSBpcyBubyBtdWx0aWNvbGxpbmVhcml0eSBhbW9uZyB0aGUgcHJlZGljdG9ycy4NCkl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBEaXJpY2hsZXQgcmVncmVzc2lvbiBjYW4gYmUgc2Vuc2l0aXZlIHRvIHRoZSBjaG9pY2Ugb2YgcHJpb3IgZGlzdHJpYnV0aW9uIGZvciB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbW9kZWwuIERpZmZlcmVudCBjaG9pY2VzIG9mIHByaW9yIGNhbiBsZWFkIHRvIGRpZmZlcmVudCByZXN1bHRzLCBhbmQgaXQgaXMgaW1wb3J0YW50IHRvIGNhcmVmdWxseSBjb25zaWRlciB0aGUgY2hvaWNlIG9mIHByaW9yIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSByb2J1c3QgYW5kIHJlbGlhYmxlLg0KDQoNCmBgYHtyfQ0KDQojIGxvYWQgdGhlIERpcmljaGxldFJlZyBwYWNrYWdlDQpsaWJyYXJ5KERpcmljaGxldFJlZykNCg0KDQojIGZpdCBhIERpcmljaGxldCByZWdyZXNzaW9uIG1vZGVsIA0KDQpkdCAlPiUgZHBseXI6OnNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUgIGNvcigpICU+JSBwaGVhdG1hcCgpDQoNCiNmaXQgPC0gdmdsbShjYmluZChFbmRvdGhlbGlhbCxGaWJyb2JsYXN0LE15ZWxvaWQpIH4gZGlzZWFzZV9kdXJhdGlvbiwgZGlyaWNobGV0LCBkYXRhID0gZHQpDQpmaXQgPC0gdmdsbShjYmluZChCX0NlbGwsRW5kb3RoZWxpYWwsVF9jZWxsLEZpYnJvYmxhc3QsTXllbG9pZCxOSykgfiBkaXNlYXNlX2R1cmF0aW9uLCBkaXJpY2hsZXQsIGRhdGEgPSBkdCkNCg0KIyB2aWV3IHRoZSBzdW1tYXJ5IG9mIHRoZSBtb2RlbA0Kc3VtbWFyeShmaXQpDQoNCnBsb3QoZml0KQ0KDQojcmVzaWR1YWxzKGZpdCkNCm91dHB1dCA9IHJlc2lkdWFscyhmaXQpICU+JSBhcy5kYXRhLmZyYW1lKCkNCg0KY29sbmFtZXMob3V0cHV0KSA9IGMoJ0IgY2VsbCcsJ0VuZG90aGVsaWFsJywnVCBjZWxsJywnRmlicm9ibGFzdCcsJ015ZWxvaWQnLCdOSycpDQoNCm91dHB1dA0Kc2F2ZVJEUyhvdXRwdXQsJ2RpcmljaGxldF93ZWlnaHRlZF9wcm9wb3J0aW9uc19jZWxsdHlwZXMucmRzJykNCmBgYA0KDQojIyBQQ0ENCg0KYGBge3J9DQpsaWJyYXJ5KGRldnRvb2xzKQ0KaW5zdGFsbF9naXRodWIoInZxdi9nZ2JpcGxvdCIpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkodmlyaWRpcykNCnBjIDwtIHByY29tcChvdXRwdXQgJT4lIHQoKSwNCiAgICAgICAgICAgICBjZW50ZXIgPSBUUlVFLA0KICAgICAgICAgICAgc2NhbGUuID0gVFJVRSkNCnBjJHJvdGF0aW9uDQpzdW1tYXJ5KHBjKQ0KDQpwY2EgPSBwYyRyb3RhdGlvbiAlPiUgYXMuZGF0YS5mcmFtZSgpDQoNCnBjYSRkb25vciA9IHJvd25hbWVzKHBjYSkNCnBjYSA9IA0KICBwY2EgJT4lIA0KICAgIGxlZnRfam9pbihjbGFzc2VzKQ0KDQphZGpfcGxvdCA9IA0KcGNhICU+JQ0KICBnZ3Bsb3QoKSArDQogICAgZ2VvbV9wb2ludChhZXMoeCA9IC1QQzEsIHkgPS1QQzIsIGZpbGwgPSBuZXdfY2xhc3MpLHNpemUgPSA0LCBzaGFwZSA9IDIxLCBzdHJva2UgPSAwLjIpKw0Kc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbWV0YV9jb2xvcnMkbmV3X2NsYXNzLCBuYW1lID0gIiIpICsgDQp0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxOCkgKyBnZ3RpdGxlKCdEaXJpY2hsZXQnKQ0KDQpzY2F0dGVycGxvdDNkKHBjYSRQQzEscGNhJFBDMyxwY2EkUEMyLCBhbmdsZSA9NjApDQphZGpfcGxvdA0KDQpgYGANCg0KRmlyc3QgMiBQQ3MgYXJlIHRvdGFsbGluZyA2NSUgb2YgdmFyaWFuY2UNCg0KDQpgYGB7cn0NCnBjIDwtIHByY29tcChvdXRwdXQgLA0KICAgICAgICAgICAgIGNlbnRlciA9IFRSVUUsDQogICAgICAgICAgICBzY2FsZS4gPSBUUlVFKQ0KDQpsaWJyYXJ5KGdnYmlwbG90KQ0KZyA8LSBnZ2JpcGxvdChwYywNCiAgICAgICAgICAgICAgb2JzLnNjYWxlID0gMSwNCiAgICAgICAgICAgICAgdmFyLnNjYWxlID0gMSwNCiAgICAgICAgICAgICAgZWxsaXBzZSA9IFRSVUUsDQogICAgICAgICAgICAgIGNpcmNsZSA9IFRSVUUsDQogICAgICAgICAgICAgIGVsbGlwc2UucHJvYiA9IDAuNjgpDQpnIDwtIGcgKyBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gJycpDQpnIDwtIGcgKyB0aGVtZShsZWdlbmQuZGlyZWN0aW9uID0gJ2hvcml6b250YWwnLA0KICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gJ3RvcCcpDQoNCg0KcHJpbnQoZykNCg0KDQpwYyA8LSBwcmNvbXAob3V0cHV0ICU+JSB0KCksDQogICAgICAgICAgICAgY2VudGVyID0gVFJVRSwNCiAgICAgICAgICAgIHNjYWxlLiA9IFRSVUUpDQoNCmxpYnJhcnkoZ2diaXBsb3QpDQpnIDwtIGdnYmlwbG90KHBjLA0KICAgICAgICAgICAgICBvYnMuc2NhbGUgPSAxLA0KICAgICAgICAgICAgICB2YXIuc2NhbGUgPSAxLA0KICAgICAgICAgICAgICBlbGxpcHNlID0gVFJVRSwNCiAgICAgICAgICAgICAgY2lyY2xlID0gVFJVRSwNCiAgICAgICAgICAgICAgZWxsaXBzZS5wcm9iID0gMC42OCkNCmcgPC0gZyArIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPSAnJykNCmcgPC0gZyArIHRoZW1lKGxlZ2VuZC5kaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCcsDQogICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAndG9wJykNCg0KDQpwcmludChnKQ0KYGBgDQoNCg0KIyMgT3JpZ2luYWwgUENBIHJlc3VsdHMgKEZhbidzKQ0KDQoNCmBgYHtyfQ0Kb3B0aW9ucyhyZXByLnBsb3Qud2lkdGggPSA0LjUsIHJlcHIucGxvdC5oZWlnaHQgPSA1KQ0KDQpwMSA9IA0KZ2dwbG90KHBjYV9SQSwgYWVzKFBDMSwgLVBDMiwgZmlsbCA9IG5ld19jbGFzcykpICsNCmdlb21fcG9pbnQoc2l6ZSA9IDQsIHNoYXBlID0gMjEsIHN0cm9rZSA9IDAuMikgKw0Kc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbWV0YV9jb2xvcnMkbmV3X2NsYXNzLCBuYW1lID0gIiIpICsgDQp0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxOCkgKyBnZ3RpdGxlKCdGYW4gT3JpZ2luYWwnKQ0KcDENCmBgYA0KDQoNCg0KIyMgR0xNIGZvciBhZGp1c3RpbmcgdmFsdWVzDQoNClJlIGxvYWRpbmcgdGhlIGRhdGEgDQoNCmBgYHtyfQ0KZHQgPSByZWFkUkRTKCdDOlxcVXNlcnNcXEp1YW5cXERvY3VtZW50c1xcc2luZ2xlX2NlbGxcXG1hdF9iYXNlbGluZV9kaXNlYXNlX2R1cmF0aW9uX3Blcl9zYW1wbGUucmRzJykNCg0KZHQNCg0KZHQgPSANCiAgZHQgJT4lIA0KICBtdXRhdGUoc2FtcGxlID0gcm93bmFtZXMoZHQpKQ0KDQpkdA0KDQpkdCA9IA0KZHQgJT4lIGRwbHlyOjpyZW5hbWUoQl9DZWxsID0gYEIgY2VsbGAsDQogICAgICAgICAgICAgIFRfY2VsbCA9IGBUIGNlbGxgKQ0KDQpkdCROSyA9IGlmZWxzZShkdCROSyA9PSAwLCAwLjAwMDAwMDAwMDAwMSxkdCROSykNCmR0JEJfQ2VsbCA9IGlmZWxzZShkdCRCX0NlbGwgPT0gMCwgMC4wMDAwMDAwMDAwMDEsZHQkQl9DZWxsKQ0KDQpjbGFzc2VzPQ0KICBwY2FfUkEgJT4lDQogIGRwbHlyOjpzZWxlY3QoZG9ub3IsbmV3X2NsYXNzKQ0KYGBgDQoNCg0KV2lsbCBiZSB1c2luZyBtdWx0aXBsZSBtb2RlbHMNCg0KYGBge3J9DQpiY2VsbF9tb2QgPC0gZ2xtKEJfQ2VsbCB+IGRpc2Vhc2VfZHVyYXRpb24sIGRhdGEgPSBkdCkNCiNzdW1tYXJ5KGJjZWxsX21vZCkNCmJjZWxsX3JlcyA9IHJlc2lkdWFscyhiY2VsbF9tb2QpDQoNCnRjZWxsX21vZCAgPSBnbG0oVF9jZWxsIH4gZGlzZWFzZV9kdXJhdGlvbiwgZGF0YSA9IGR0KQ0KI3N1bW1hcnkodGNlbGxfbW9kKQ0KdGNlbGxfcmVzPSByZXNpZHVhbHModGNlbGxfbW9kKQ0KDQpteWVsb2lkX21vZCA9IGdsbShNeWVsb2lkIH4gZGlzZWFzZV9kdXJhdGlvbiwgZGF0YSA9IGR0KQ0KI3N1bW1hcnkobXllbG9pZF9tb2QpDQpteWVsb2lkX3JlcyA9IHJlc2lkdWFscyhteWVsb2lkX21vZCkNCg0KbmtfbW9kID0gZ2xtKE5LIH4gZGlzZWFzZV9kdXJhdGlvbiwgZGF0YSA9IGR0KQ0KI3N1bW1hcnkobmtfbW9kKQ0KbmtfcmVzID0gcmVzaWR1YWxzKG5rX21vZCkNCg0KZW5kb19tb2QgPSBnbG0oRW5kb3RoZWxpYWwgfiBkaXNlYXNlX2R1cmF0aW9uLCBkYXRhID0gZHQpDQojc3VtbWFyeShlbmRvX21vZCkNCmVuZG9fcmVzID0gcmVzaWR1YWxzKGVuZG9fbW9kKQ0KDQpmaWJyb19tb2QgPSAgZ2xtKEZpYnJvYmxhc3QgfiBkaXNlYXNlX2R1cmF0aW9uLCBkYXRhID0gZHQpDQojc3VtbWFyeShmaWJyb19tb2QpDQpmaWJyb19yZXMgPSByZXNpZHVhbHMoZmlicm9fbW9kKQ0KDQoNCm91dDIgPSANCiAgZGF0YS5mcmFtZShCX2NlbGwgPSBiY2VsbF9yZXMsDQogICAgICAgICAgICAgVF9jZWxsID0gdGNlbGxfcmVzLA0KICAgICAgICAgICAgIE15ZWxvaWQgPSBteWVsb2lkX3JlcywNCiAgICAgICAgICAgICBOSyA9IG5rX3JlcywNCiAgICAgICAgICAgICBFbmRvdGhlbGlhbCA9IGVuZG9fcmVzLA0KICAgICAgICAgICAgIEZpYnJvYmxhc3QgPSBmaWJyb19yZXMpDQpyb3duYW1lcyhvdXQyKSA9IHJvd25hbWVzKGR0KQ0Kb3V0Mg0KDQpzYXZlUkRTKG91dDIsJ2dsbV93ZWlnaHRlZF9wcm9wb3J0aW9uc19jZWxsdHlwZXMucmRzJykNCmBgYA0KDQoNCmBgYHtyfQ0KDQpwYyA8LSBwcmNvbXAob3V0MiAlPiUgdCgpLA0KICAgICAgICAgICAgIGNlbnRlciA9IFRSVUUsDQogICAgICAgICAgICBzY2FsZS4gPSBUUlVFKQ0KcGMkcm90YXRpb24NCnN1bW1hcnkocGMpDQoNCnBjYSA9IHBjJHJvdGF0aW9uICU+JSBhcy5kYXRhLmZyYW1lKCkNCg0KcGNhJGRvbm9yID0gcm93bmFtZXMocGNhKQ0KcGNhID0gDQogIHBjYSAlPiUgDQogICAgbGVmdF9qb2luKGNsYXNzZXMpDQpwMiA9DQpwY2EgJT4lDQogIGdncGxvdCgpICsNCiAgICBnZW9tX3BvaW50KGFlcyh4ID0gLSBQQzEsIHkgPVBDMiwgZmlsbCA9IG5ld19jbGFzcyksc2l6ZSA9IDQsIHNoYXBlID0gMjEsIHN0cm9rZSA9IDAuMikrDQpzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBtZXRhX2NvbG9ycyRuZXdfY2xhc3MsIG5hbWUgPSAiIikgKyANCnRoZW1lX2NsZWFuKGJhc2Vfc2l6ZSA9IDE4KSArIGdndGl0bGUoJ0dMTScpDQoNCnAyDQpgYGANCg0KRmlyc3QgMiBQQ3MgYXJlIHN1bSBvZiA3Ny44JQ0KDQoNCiMjIEFkZGluZyBjb3ZhcmlhdGVzIHRvIHRoZSBtb2RlbHMgYWJvdmUgDQoNCldlIGFyZSBhZGRpbmcgY292YXJpYXRlcyBiZWNhdXNlIHRoZSBldmVudHMgb2YgcHJvcG9ydGlvbiANCg0KYGBge3J9DQpiY2VsbF9tb2QgPC0gZ2xtKEJfQ2VsbCB+IGRpc2Vhc2VfZHVyYXRpb24gKyBOSyArIE15ZWxvaWQgKyBFbmRvdGhlbGlhbCArIFRfY2VsbCAgKyBGaWJyb2JsYXN0LCBkYXRhID0gZHQpDQojc3VtbWFyeShiY2VsbF9tb2QpDQpiY2VsbF9yZXMgPSByZXNpZHVhbHMoYmNlbGxfbW9kKQ0KDQp0Y2VsbF9tb2QgID0gZ2xtKFRfY2VsbCB+IGRpc2Vhc2VfZHVyYXRpb24gKyAgTksgKyBNeWVsb2lkICsgRW5kb3RoZWxpYWwgKyBCX0NlbGwgKyBGaWJyb2JsYXN0LCBkYXRhID0gZHQpDQojc3VtbWFyeSh0Y2VsbF9tb2QpDQp0Y2VsbF9yZXM9IHJlc2lkdWFscyh0Y2VsbF9tb2QpDQoNCm15ZWxvaWRfbW9kID0gZ2xtKE15ZWxvaWQgfiBkaXNlYXNlX2R1cmF0aW9uICsgRW5kb3RoZWxpYWwgKyBCX0NlbGwgKyBGaWJyb2JsYXN0ICsgTksgKyBUX2NlbGwsIGRhdGEgPSBkdCkNCiNzdW1tYXJ5KG15ZWxvaWRfbW9kKQ0KbXllbG9pZF9yZXMgPSByZXNpZHVhbHMobXllbG9pZF9tb2QpDQoNCm5rX21vZCA9IGdsbShOSyB+IGRpc2Vhc2VfZHVyYXRpb24gKyBFbmRvdGhlbGlhbCArIEJfQ2VsbCArIEZpYnJvYmxhc3QgKyBNeWVsb2lkICsgVF9jZWxsLCBkYXRhID0gZHQpDQojc3VtbWFyeShua19tb2QpDQpua19yZXMgPSByZXNpZHVhbHMobmtfbW9kKQ0KDQplbmRvX21vZCA9IGdsbShFbmRvdGhlbGlhbCB+IGRpc2Vhc2VfZHVyYXRpb24gKyBCX0NlbGwgKyBGaWJyb2JsYXN0ICsgTXllbG9pZCArIFRfY2VsbCArIE5LLCBkYXRhID0gZHQpDQojc3VtbWFyeShlbmRvX21vZCkNCmVuZG9fcmVzID0gcmVzaWR1YWxzKGVuZG9fbW9kKQ0KDQpmaWJyb19tb2QgPSAgZ2xtKEZpYnJvYmxhc3QgfiBkaXNlYXNlX2R1cmF0aW9uICsgTXllbG9pZCArIFRfY2VsbCArIE5LICsgQl9DZWxsICsgRW5kb3RoZWxpYWwsIGRhdGEgPSBkdCkNCiNzdW1tYXJ5KGZpYnJvX21vZCkNCmZpYnJvX3JlcyA9IHJlc2lkdWFscyhmaWJyb19tb2QpDQoNCg0Kb3V0MyA9IA0KICBkYXRhLmZyYW1lKEJfY2VsbCA9IGJjZWxsX3JlcywNCiAgICAgICAgICAgICBUX2NlbGwgPSB0Y2VsbF9yZXMsDQogICAgICAgICAgICAgTXllbG9pZCA9IG15ZWxvaWRfcmVzLA0KICAgICAgICAgICAgIE5LID0gbmtfcmVzLA0KICAgICAgICAgICAgIEVuZG90aGVsaWFsID0gZW5kb19yZXMsDQogICAgICAgICAgICAgRmlicm9ibGFzdCA9IGZpYnJvX3JlcykNCnJvd25hbWVzKG91dDIpID0gcm93bmFtZXMoZHQpDQpvdXQzDQpgYGANCg0KDQpgYGB7cn0NCnBjIDwtIHByY29tcChvdXQzICU+JSB0KCksDQogICAgICAgICAgICAgY2VudGVyID0gVFJVRSwNCiAgICAgICAgICAgIHNjYWxlLiA9IFRSVUUpDQpwYyRyb3RhdGlvbg0Kc3VtbWFyeShwYykNCg0KcGNhID0gcGMkcm90YXRpb24gJT4lIGFzLmRhdGEuZnJhbWUoKQ0KDQpwY2EkZG9ub3IgPSByb3duYW1lcyhwY2EpDQpwY2EgPSANCiAgcGNhICU+JSANCiAgICBsZWZ0X2pvaW4oY2xhc3NlcykNCnBjYSAlPiUNCiAgZ2dwbG90KCkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHggPSBQQzEsIHkgPVBDMiwgZmlsbCA9IG5ld19jbGFzcyksc2l6ZSA9IDQsIHNoYXBlID0gMjEsIHN0cm9rZSA9IDAuMikrDQpzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBtZXRhX2NvbG9ycyRuZXdfY2xhc3MsIG5hbWUgPSAiIikgKyANCnRoZW1lX2NsZWFuKGJhc2Vfc2l6ZSA9IDE4KSANCmBgYA0KSXQgY2FuIGJlIHNlZW4gdGhhdCBhZGRpbmcgdGhlIGNvdmFyaWF0ZXMgd2lsbCBub3QgbWFrZSB0aGUgcGNhIG1vcmUgY2xlYXJseQ0KDQoNCg0KDQojIyBBbGwgdGhlIFBDQSBwbG90cw0KDQpgYGB7cn0NCnAxDQpwMg0KYWRqX3Bsb3QNCmBgYA0KDQo=