J. Taroni 2018

The NARES study was published in the following article:

Grayson PC, Steiling K, Platt M, et al. Defining the Nasal Transcriptome in Granulomatosis with Polyangiitis. Arthritis & Rheumatology, 2015. doi: 10.1002/art.39185.

We processed this data in the greenelab/rheum-data-plier repo.

This dataset (n = 76) contains nasal brushing samples from patients with granulomatosis with polyangiitis (GPA), a form of ANCA-associated vasculitis. Patients with GPA either had active, a prior history of, or no history of nasal disease. A composite comparator group of patients with sarcoidosis, patients with allergic rhinitis and healthy controls is also included.

Here we’ll train a PLIER model and explore:

  • The sparsity of the U matrix
  • How many LVs are recovered? How many pathways?
  • What are the pathways that are represented?

Libraries

library(AnnotationDbi)
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: parallel

Attaching package: ‘BiocGenerics’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, clusterExport, clusterMap, parApply, parCapply, parLapply,
    parLapplyLB, parRapply, parSapply, parSapplyLB

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, append, as.data.frame, cbind, colMeans, colnames, colSums, do.call, duplicated, eval, evalq, Filter, Find,
    get, grep, grepl, intersect, is.unsorted, lapply, lengths, Map, mapply, match, mget, order, paste, pmax, pmax.int, pmin,
    pmin.int, Position, rank, rbind, Reduce, rowMeans, rownames, rowSums, sapply, setdiff, sort, table, tapply, union, unique,
    unsplit, which, which.max, which.min

Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'. To cite Bioconductor, see 'citation("Biobase")', and
    for packages 'citation("pkgname")'.

Loading required package: IRanges
Loading required package: S4Vectors

Attaching package: ‘S4Vectors’

The following object is masked from ‘package:base’:

    expand.grid
library(PLIER)
Loading required package: RColorBrewer
Loading required package: gplots

Attaching package: ‘gplots’

The following object is masked from ‘package:IRanges’:

    space

The following object is masked from ‘package:S4Vectors’:

    space

The following object is masked from ‘package:stats’:

    lowess

Loading required package: pheatmap
Loading required package: glmnet
Loading required package: Matrix

Attaching package: ‘Matrix’

The following object is masked from ‘package:S4Vectors’:

    expand

Loading required package: foreach
Loaded glmnet 2.0-13

Loading required package: knitr
Loading required package: rsvd
Loading required package: qvalue

NARES data

nares.data <- readr::read_tsv(file.path("data", "expression_data", 
                                         "NARES_SCANfast_ComBat.pcl"))
Parsed with column specification:
cols(
  .default = col_double(),
  Gene = col_integer()
)
See spec(...) for full column specifications.
symbol.obj <- org.Hs.eg.db::org.Hs.egSYMBOL
mapped.genes <- AnnotationDbi::mappedkeys(symbol.obj)
symbol.list <- as.list(symbol.obj[mapped.genes])
symbol.df <- as.data.frame(cbind(names(symbol.list), unlist(symbol.list)))
colnames(symbol.df) <- c("EntrezID", "GeneSymbol")
# get gene column name to match to facilitate use with dplyr
colnames(nares.data)[1] <- "EntrezID"
# matching types
symbol.df$EntrezID <- as.integer(as.character(symbol.df$EntrezID))
# inner join
annot.nares.data <- dplyr::inner_join(symbol.df, nares.data, by = "EntrezID")
symbol.file <- 
  file.path("data", "expression_data", 
            "NARES_SCANfast_ComBat_with_GeneSymbol.pcl")
readr::write_delim(annot.nares.data, path = symbol.file, delim = "\t")
# only leave the matrix with gene symbol as rownames
exprs.mat <- dplyr::select(annot.nares.data, -EntrezID)
rownames(exprs.mat) <- exprs.mat$GeneSymbol
exprs.mat <- as.matrix(dplyr::select(exprs.mat, -GeneSymbol))
rm(list = setdiff(ls(), c("exprs.mat")))

Functions and directory set up

Organized this way for convenience w.r.t. removing objects from the environment after gene identifier conversion.

`%>%` <- dplyr::`%>%`
source(file.path("util", "plier_util.R"))
# plot and result directory setup for this notebook
plot.dir <- file.path("plots", "12")
dir.create(plot.dir, recursive = TRUE, showWarnings = FALSE)
results.dir <- file.path("results", "12")
dir.create(results.dir, recursive = TRUE, showWarnings = FALSE)

PLIER model

Training

# train model and save to file
nares.plier <- PLIERNewData(exprs.mat)
Removing 1 pathways with too few genesComputing SVD
Done
[1] 47.1281
[1] "L2 is set to 47.1281023042499"
[1] "L1 is set to 23.5640511521249"
errorY (SVD based:best possible) = 0.116
iter1 errorY= 0.9617, Bdiff= 3358, Bkappa=69.2
iter2 errorY= 0.4158, Bdiff= 0.5971, Bkappa=41.7
iter3 errorY= 0.3548, Bdiff= 0.06627, Bkappa=26.01
iter4 errorY= 0.3462, Bdiff= 0.02215, Bkappa=18.06
iter5 errorY= 0.3439, Bdiff= 0.0142, Bkappa=17.25
iter6 errorY= 0.3424, Bdiff= 0.01032, Bkappa=17.89
iter7 errorY= 0.3407, Bdiff= 0.008008, Bkappa=19.53
iter8 errorY= 0.3388, Bdiff= 0.006558, Bkappa=21.84
iter9 errorY= 0.3368, Bdiff= 0.005559, Bkappa=24.73
iter10 errorY= 0.3349, Bdiff= 0.004753, Bkappa=27.64
iter11 errorY= 0.3333, Bdiff= 0.004037, Bkappa=29.76
iter12 errorY= 0.3319, Bdiff= 0.003411, Bkappa=32.67
iter13 errorY= 0.3309, Bdiff= 0.002883, Bkappa=34.5
iter14 errorY= 0.3301, Bdiff= 0.002455, Bkappa=38.06
iter15 errorY= 0.3295, Bdiff= 0.002122, Bkappa=39.39
iter16 errorY= 0.329, Bdiff= 0.001864, Bkappa=41.45
iter17 errorY= 0.3286, Bdiff= 0.001669, Bkappa=36.21
iter18 errorY= 0.3283, Bdiff= 0.001511, Bkappa=38.81
iter19 errorY= 0.3279, Bdiff= 0.001381, Bkappa=45.1
Updating L3, current fraction= 0, target=0.7
L3 is set to 0.004884 in 10 iterations
iter20 errorY= 0.3261, prior information ratio= 0.03, Bdiff= 0.001376, Bkappa=45.6;pos. col. U=24
iter21 errorY= 0.3251, prior information ratio= 0.04, Bdiff= 0.001292, Bkappa=47.26;pos. col. U=24
iter22 errorY= 0.3245, prior information ratio= 0.04, Bdiff= 0.001206, Bkappa=49.19;pos. col. U=24
iter23 errorY= 0.3239, prior information ratio= 0.04, Bdiff= 0.001109, Bkappa=51.49;pos. col. U=23
iter24 errorY= 0.3234, prior information ratio= 0.05, Bdiff= 0.001001, Bkappa=54.24;pos. col. U=23
iter25 errorY= 0.3229, prior information ratio= 0.05, Bdiff= 0.0008939, Bkappa=57.87;pos. col. U=23
iter26 errorY= 0.3225, prior information ratio= 0.05, Bdiff= 0.0007924, Bkappa=62.17;pos. col. U=23
iter27 errorY= 0.3222, prior information ratio= 0.05, Bdiff= 0.0007015, Bkappa=65.38;pos. col. U=22
iter28 errorY= 0.3219, prior information ratio= 0.05, Bdiff= 0.0006201, Bkappa=69.5;pos. col. U=23
iter29 errorY= 0.3216, prior information ratio= 0.05, Bdiff= 0.0005482, Bkappa=73.66;pos. col. U=23
iter30 errorY= 0.3214, prior information ratio= 0.05, Bdiff= 0.0004862, Bkappa=77.86;pos. col. U=24
iter31 errorY= 0.3212, prior information ratio= 0.04, Bdiff= 0.0004342, Bkappa=82.14;pos. col. U=24
iter32 errorY= 0.321, prior information ratio= 0.04, Bdiff= 0.0003932, Bkappa=86.77;pos. col. U=24
iter33 errorY= 0.3208, prior information ratio= 0.05, Bdiff= 0.0003647, Bkappa=91.5;pos. col. U=25
iter34 errorY= 0.3207, prior information ratio= 0.04, Bdiff= 0.0003424, Bkappa=96.35;pos. col. U=25
iter35 errorY= 0.3205, prior information ratio= 0.04, Bdiff= 0.0003255, Bkappa=102.2;pos. col. U=25
iter36 errorY= 0.3203, prior information ratio= 0.04, Bdiff= 0.000313, Bkappa=108.4;pos. col. U=25
iter37 errorY= 0.3201, prior information ratio= 0.04, Bdiff= 0.0003047, Bkappa=117.6;pos. col. U=25
iter38 errorY= 0.3199, prior information ratio= 0.04, Bdiff= 0.0002974, Bkappa=125.3;pos. col. U=25
iter39 errorY= 0.3198, prior information ratio= 0.04, Bdiff= 0.0002906, Bkappa=133.7;pos. col. U=25
Updating L3, current fraction= 0.7353, target=0.7
L3 is set to 0.00571 in 12 iterations
iter40 errorY= 0.3197, prior information ratio= 0.05, Bdiff= 0.0002853, Bkappa=142.3;pos. col. U=23
iter41 errorY= 0.3196, prior information ratio= 0.05, Bdiff= 0.0002782, Bkappa=150.6;pos. col. U=21
iter42 errorY= 0.3195, prior information ratio= 0.05, Bdiff= 0.0002711, Bkappa=159.2;pos. col. U=21
iter43 errorY= 0.3193, prior information ratio= 0.05, Bdiff= 0.0002642, Bkappa=167.7;pos. col. U=21
iter44 errorY= 0.3192, prior information ratio= 0.05, Bdiff= 0.0002559, Bkappa=174.7;pos. col. U=21
iter45 errorY= 0.3191, prior information ratio= 0.05, Bdiff= 0.000246, Bkappa=182.7;pos. col. U=21
iter46 errorY= 0.3189, prior information ratio= 0.04, Bdiff= 0.000235, Bkappa=190.5;pos. col. U=21
iter47 errorY= 0.3188, prior information ratio= 0.05, Bdiff= 0.0002231, Bkappa=201;pos. col. U=20
iter48 errorY= 0.3187, prior information ratio= 0.05, Bdiff= 0.0002111, Bkappa=207.8;pos. col. U=21
iter49 errorY= 0.3187, prior information ratio= 0.05, Bdiff= 0.0002003, Bkappa=214.1;pos. col. U=21
iter50 errorY= 0.3186, prior information ratio= 0.05, Bdiff= 0.0001911, Bkappa=219.8;pos. col. U=21
iter51 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 0.0001837, Bkappa=225.1;pos. col. U=21
iter52 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 0.0001764, Bkappa=229.6;pos. col. U=21
iter53 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 0.0001699, Bkappa=233.4;pos. col. U=21
iter54 errorY= 0.3185, prior information ratio= 0.04, Bdiff= 0.0001642, Bkappa=235.6;pos. col. U=21
iter55 errorY= 0.3184, prior information ratio= 0.05, Bdiff= 0.0001591, Bkappa=237.4;pos. col. U=20
iter56 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 0.0001543, Bkappa=237.8;pos. col. U=20
iter57 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 0.0001498, Bkappa=237;pos. col. U=20
iter58 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 0.0001454, Bkappa=234.9;pos. col. U=20
iter59 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 0.0001409, Bkappa=231.6;pos. col. U=20
Updating L3, current fraction= 0.5882, target=0.7
L3 is set to 0.004297 in 2 iterations
iter60 errorY= 0.3183, prior information ratio= 0.04, Bdiff= 0.0001358, Bkappa=226.7;pos. col. U=24
iter61 errorY= 0.3182, prior information ratio= 0.04, Bdiff= 0.0001292, Bkappa=220.7;pos. col. U=24
iter62 errorY= 0.3182, prior information ratio= 0.05, Bdiff= 0.0001236, Bkappa=214.4;pos. col. U=24
iter63 errorY= 0.3182, prior information ratio= 0.05, Bdiff= 0.0001184, Bkappa=206.7;pos. col. U=24
iter64 errorY= 0.3182, prior information ratio= 0.05, Bdiff= 0.0001133, Bkappa=198.4;pos. col. U=24
iter65 errorY= 0.3182, prior information ratio= 0.05, Bdiff= 0.0001085, Bkappa=189.7;pos. col. U=24
iter66 errorY= 0.3183, prior information ratio= 0.05, Bdiff= 0.0001041, Bkappa=180.9;pos. col. U=23
iter67 errorY= 0.3183, prior information ratio= 0.05, Bdiff= 9.994e-05, Bkappa=170.9;pos. col. U=23
iter68 errorY= 0.3183, prior information ratio= 0.05, Bdiff= 9.651e-05, Bkappa=160.9;pos. col. U=23
iter69 errorY= 0.3184, prior information ratio= 0.05, Bdiff= 9.415e-05, Bkappa=153.3;pos. col. U=23
iter70 errorY= 0.3184, prior information ratio= 0.05, Bdiff= 9.123e-05, Bkappa=143.7;pos. col. U=23
iter71 errorY= 0.3184, prior information ratio= 0.05, Bdiff= 8.832e-05, Bkappa=134.5;pos. col. U=23
iter72 errorY= 0.3184, prior information ratio= 0.05, Bdiff= 8.572e-05, Bkappa=126.2;pos. col. U=23
iter73 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 8.337e-05, Bkappa=117.6;pos. col. U=23
iter74 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 8.131e-05, Bkappa=109.4;pos. col. U=23
iter75 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.944e-05, Bkappa=101.7;pos. col. U=23
iter76 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.849e-05, Bkappa=94.4;pos. col. U=23
iter77 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.716e-05, Bkappa=87.53;pos. col. U=23
iter78 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.62e-05, Bkappa=80.36;pos. col. U=23
iter79 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.519e-05, Bkappa=74.61;pos. col. U=23
Updating L3, current fraction= 0.6765, target=0.7
L3 not changed
iter80 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.415e-05, Bkappa=70.78;pos. col. U=23
iter81 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.268e-05, Bkappa=66.16;pos. col. U=23
iter82 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.167e-05, Bkappa=61.99;pos. col. U=23
iter83 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.082e-05, Bkappa=56.16;pos. col. U=24
iter84 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 7.022e-05, Bkappa=52.68;pos. col. U=24
iter85 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 6.987e-05, Bkappa=49.57;pos. col. U=24
iter86 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 6.967e-05, Bkappa=46.41;pos. col. U=24
iter87 errorY= 0.3185, prior information ratio= 0.05, Bdiff= 6.956e-05, Bkappa=44.04;pos. col. U=23
iter88 errorY= 0.3184, prior information ratio= 0.06, Bdiff= 7.023e-05, Bkappa=42.75;pos. col. U=23
iter89 errorY= 0.3184, prior information ratio= 0.06, Bdiff= 7.058e-05, Bkappa=44.27;pos. col. U=23
iter90 errorY= 0.3184, prior information ratio= 0.06, Bdiff= 7.069e-05, Bkappa=46.13;pos. col. U=23
iter91 errorY= 0.3184, prior information ratio= 0.06, Bdiff= 7.064e-05, Bkappa=44.97;pos. col. U=23
iter92 errorY= 0.3183, prior information ratio= 0.06, Bdiff= 7.055e-05, Bkappa=41.8;pos. col. U=22
iter93 errorY= 0.3183, prior information ratio= 0.06, Bdiff= 7.017e-05, Bkappa=40.92;pos. col. U=22
iter94 errorY= 0.3183, prior information ratio= 0.06, Bdiff= 6.969e-05, Bkappa=40.26;pos. col. U=22
iter95 errorY= 0.3183, prior information ratio= 0.06, Bdiff= 6.908e-05, Bkappa=39.74;pos. col. U=22
iter96 errorY= 0.3182, prior information ratio= 0.06, Bdiff= 6.844e-05, Bkappa=39.31;pos. col. U=22
iter97 errorY= 0.3182, prior information ratio= 0.06, Bdiff= 6.767e-05, Bkappa=34.23;pos. col. U=22
iter98 errorY= 0.3182, prior information ratio= 0.06, Bdiff= 6.696e-05, Bkappa=34.05;pos. col. U=22
iter99 errorY= 0.3182, prior information ratio= 0.06, Bdiff= 6.637e-05, Bkappa=38.6;pos. col. U=22
Updating L3, current fraction= 0.6471, target=0.7
L3 is set to 0.004031 in 4 iterations
iter100 errorY= 0.3181, prior information ratio= 0.06, Bdiff= 6.529e-05, Bkappa=38.55;pos. col. U=24
iter101 errorY= 0.318, prior information ratio= 0.06, Bdiff= 6.683e-05, Bkappa=38.54;pos. col. U=24
iter102 errorY= 0.318, prior information ratio= 0.06, Bdiff= 6.59e-05, Bkappa=38.54;pos. col. U=25
iter103 errorY= 0.318, prior information ratio= 0.06, Bdiff= 6.518e-05, Bkappa=38.62;pos. col. U=25
iter104 errorY= 0.3179, prior information ratio= 0.05, Bdiff= 6.561e-05, Bkappa=38.73;pos. col. U=25
iter105 errorY= 0.3179, prior information ratio= 0.05, Bdiff= 6.535e-05, Bkappa=38.86;pos. col. U=25
iter106 errorY= 0.3179, prior information ratio= 0.05, Bdiff= 6.505e-05, Bkappa=37.64;pos. col. U=25
iter107 errorY= 0.3179, prior information ratio= 0.05, Bdiff= 6.484e-05, Bkappa=37.68;pos. col. U=25
iter108 errorY= 0.3179, prior information ratio= 0.05, Bdiff= 6.482e-05, Bkappa=34.67;pos. col. U=25
iter109 errorY= 0.3178, prior information ratio= 0.05, Bdiff= 6.51e-05, Bkappa=34.74;pos. col. U=26
iter110 errorY= 0.3178, prior information ratio= 0.05, Bdiff= 6.535e-05, Bkappa=32.4;pos. col. U=26
iter111 errorY= 0.3178, prior information ratio= 0.05, Bdiff= 6.569e-05, Bkappa=32.26;pos. col. U=26
iter112 errorY= 0.3178, prior information ratio= 0.06, Bdiff= 6.596e-05, Bkappa=32.11;pos. col. U=26
iter113 errorY= 0.3178, prior information ratio= 0.05, Bdiff= 6.622e-05, Bkappa=31.97;pos. col. U=26
iter114 errorY= 0.3177, prior information ratio= 0.05, Bdiff= 6.61e-05, Bkappa=31.39;pos. col. U=26
iter115 errorY= 0.3177, prior information ratio= 0.05, Bdiff= 6.636e-05, Bkappa=31.36;pos. col. U=26
iter116 errorY= 0.3177, prior information ratio= 0.06, Bdiff= 6.695e-05, Bkappa=31.33;pos. col. U=25
iter117 errorY= 0.3177, prior information ratio= 0.05, Bdiff= 6.69e-05, Bkappa=31.32;pos. col. U=25
iter118 errorY= 0.3176, prior information ratio= 0.06, Bdiff= 6.685e-05, Bkappa=31.31;pos. col. U=25
iter119 errorY= 0.3176, prior information ratio= 0.06, Bdiff= 6.697e-05, Bkappa=31.48;pos. col. U=23
Updating L3, current fraction= 0.6765, target=0.7
L3 not changed
iter120 errorY= 0.3176, prior information ratio= 0.06, Bdiff= 6.719e-05, Bkappa=33.2;pos. col. U=23
iter121 errorY= 0.3176, prior information ratio= 0.06, Bdiff= 6.723e-05, Bkappa=32.89;pos. col. U=23
iter122 errorY= 0.3176, prior information ratio= 0.06, Bdiff= 6.703e-05, Bkappa=32.98;pos. col. U=23
iter123 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 6.694e-05, Bkappa=31.78;pos. col. U=23
iter124 errorY= 0.3175, prior information ratio= 0.05, Bdiff= 6.672e-05, Bkappa=43.35;pos. col. U=23
iter125 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 6.617e-05, Bkappa=43.33;pos. col. U=24
iter126 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 6.532e-05, Bkappa=43.29;pos. col. U=24
iter127 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 6.432e-05, Bkappa=43.23;pos. col. U=23
iter128 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 6.327e-05, Bkappa=42.23;pos. col. U=23
iter129 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 6.205e-05, Bkappa=42.16;pos. col. U=23
iter130 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 6.084e-05, Bkappa=42.08;pos. col. U=23
iter131 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 5.968e-05, Bkappa=42.83;pos. col. U=23
iter132 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 5.849e-05, Bkappa=42.74;pos. col. U=23
iter133 errorY= 0.3175, prior information ratio= 0.06, Bdiff= 5.728e-05, Bkappa=42.62;pos. col. U=23
iter134 errorY= 0.3174, prior information ratio= 0.05, Bdiff= 6.302e-05, Bkappa=39.48;pos. col. U=23
iter135 errorY= 0.3174, prior information ratio= 0.05, Bdiff= 6.486e-05, Bkappa=39.35;pos. col. U=23
iter136 errorY= 0.3174, prior information ratio= 0.05, Bdiff= 6.52e-05, Bkappa=39.21;pos. col. U=23
iter137 errorY= 0.3174, prior information ratio= 0.05, Bdiff= 6.48e-05, Bkappa=39.06;pos. col. U=23
iter138 errorY= 0.3174, prior information ratio= 0.05, Bdiff= 6.393e-05, Bkappa=38.9;pos. col. U=23
iter139 errorY= 0.3174, prior information ratio= 0.05, Bdiff= 6.293e-05, Bkappa=38.3;pos. col. U=23
Updating L3, current fraction= 0.6765, target=0.7
L3 not changed
iter140 errorY= 0.3175, prior information ratio= 0.05, Bdiff= 6.207e-05, Bkappa=38.24;pos. col. U=23
iter141 errorY= 0.3175, prior information ratio= 0.05, Bdiff= 6.134e-05, Bkappa=38.19;pos. col. U=23
iter142 errorY= 0.3175, prior information ratio= 0.05, Bdiff= 6.265e-05, Bkappa=38.14;pos. col. U=23
iter143 errorY= 0.3175, prior information ratio= 0.05, Bdiff= 6.208e-05, Bkappa=43.24;pos. col. U=23
iter144 errorY= 0.3175, prior information ratio= 0.05, Bdiff= 6.165e-05, Bkappa=43.11;pos. col. U=23
iter145 errorY= 0.3175, prior information ratio= 0.05, Bdiff= 6.125e-05, Bkappa=42.99;pos. col. U=23
iter146 errorY= 0.3176, prior information ratio= 0.05, Bdiff= 6.105e-05, Bkappa=42.41;pos. col. U=23
iter147 errorY= 0.3176, prior information ratio= 0.05, Bdiff= 6.087e-05, Bkappa=42.31;pos. col. U=23
iter148 errorY= 0.3176, prior information ratio= 0.04, Bdiff= 6.139e-05, Bkappa=42.26;pos. col. U=23
iter149 errorY= 0.3176, prior information ratio= 0.04, Bdiff= 6.263e-05, Bkappa=42.3;pos. col. U=23
iter150 errorY= 0.3176, prior information ratio= 0.04, Bdiff= 6.237e-05, Bkappa=42.35;pos. col. U=23
iter151 errorY= 0.3177, prior information ratio= 0.04, Bdiff= 6.224e-05, Bkappa=42.41;pos. col. U=23
iter152 errorY= 0.3177, prior information ratio= 0.04, Bdiff= 6.322e-05, Bkappa=38.18;pos. col. U=23
iter153 errorY= 0.3177, prior information ratio= 0.04, Bdiff= 6.573e-05, Bkappa=38.27;pos. col. U=23
Bdiff is not decreasing
iter154 errorY= 0.3177, prior information ratio= 0.04, Bdiff= 6.611e-05, Bkappa=40.64;pos. col. U=23
Bdiff is not decreasing
iter155 errorY= 0.3177, prior information ratio= 0.04, Bdiff= 6.637e-05, Bkappa=41.07;pos. col. U=23
Bdiff is not decreasing
iter156 errorY= 0.3178, prior information ratio= 0.04, Bdiff= 6.662e-05, Bkappa=41.52;pos. col. U=23
Bdiff is not decreasing
iter157 errorY= 0.3178, prior information ratio= 0.04, Bdiff= 6.675e-05, Bkappa=41.98;pos. col. U=23
Bdiff is not decreasing
iter158 errorY= 0.3178, prior information ratio= 0.04, Bdiff= 6.668e-05, Bkappa=42.44;pos. col. U=23
Bdiff is not decreasing
converged at  iteration 158 Bdiff is not decreasing
There are 15  LVs with AUC>0.70
plier.file <- file.path(results.dir, "NARES_PLIER_model.RDS")
saveRDS(nares.plier, file = plier.file)
# save summary data.frame to results
summary.file <- file.path(results.dir, "NARES_summary.tsv")
readr::write_tsv(nares.plier$summary, path = summary.file)

Number of LVs

nrow(nares.plier$B)
[1] 34

The model learns 34 latent variables. From the trace during training, we know that 15 of them have AUC>0.70.

Examine U and pathway coverage

As noted in the SLE WB PLIER notebook:

U is the prior information coefficient matrix; it tells us how the prior information in the form of pathways/gene sets relates to LVs.

PLIER::plotU(nares.plier, fontsize_row = 7)

To summarize some of these results:

  • A latent variable associated with extracellular matrix formation is captured. LV14 is associated with REACTOME_EXTRACELLULAR_MATRIX_ORGANIZATION, REACTOME_COLLAGEN_FORMATION, and PID_INTEGRIN1_PATHWAY.
  • There’s a neutrophil-associated LV, LV3.
  • Interferon signaling is probably captured by LV25, but two immune cell types, M1 macrophages and CD8 T cells, are also associated with this LV. This is likely due to their production of or activation by IFN and we saw a bit of this overlap with cell types in other models (SLE WB, recount2).
# save U plot to file
pdf(file.path(plot.dir, "NARES_U_plot.pdf"), height = 5, width = 7)
PLIER::plotU(nares.plier, fontsize_row = 8, fontsize_col = 8)
dev.off()
null device 
          1 

What proportion of the pathways input into the PLIER model are significantly associated with at least one LV?

coverage.results <- GetPathwayCoverage(nares.plier)  # FDR < 0.05 by default
coverage.results$pathway
[1] 0.09394904

Less than 10% of the pathways we are interested in are significantly associated with a latent variable.

How sparse is U?

Take into account all pathways

u.sparsity.all <- CalculateUSparsity(nares.plier,
                                     significant.only = FALSE)
ggplot2::ggplot(as.data.frame(u.sparsity.all),
                ggplot2::aes(x = u.sparsity.all)) +
  ggplot2::geom_density(fill = "blue", alpha = 0.5) +
  ggplot2::theme_bw() +
  ggplot2::labs(x = "proportion of positive entries in U",
                title = "All LVs") +
  ggplot2::theme(text = ggplot2::element_text(size = 15))

summary(u.sparsity.all)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
0.000000 0.000000 0.004777 0.005761 0.011943 0.015924 
plot.file <- file.path(plot.dir, "NARES_U_sparsity_all.png")
ggplot2::ggsave(plot.file, plot = ggplot2::last_plot())
Saving 7 x 7 in image

What proportion of entries in the U matrix for each LV are significantly associated with that LV?

u.sparsity.sig <- CalculateUSparsity(nares.plier,
                                     significant.only = TRUE)
ggplot2::ggplot(as.data.frame(u.sparsity.sig),
                ggplot2::aes(x = u.sparsity.sig)) +
  ggplot2::geom_density(fill = "blue", alpha = 0.5) +
  ggplot2::theme_bw() +
  ggplot2::labs(x = "proportion of positive entries in U",
                title = "Pathway-associated LVs")  +
  ggplot2::theme(text = ggplot2::element_text(size = 15))

summary(u.sparsity.sig)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
0.000000 0.000000 0.001592 0.003185 0.004777 0.012739 
plot.file <- file.path(plot.dir, "NARES_U_sparsity_significant.png")
ggplot2::ggsave(plot.file, plot = ggplot2::last_plot())
Saving 7 x 7 in image
LS0tCnRpdGxlOiAiVHJhaW4gYSBQTElFUiBtb2RlbCBvbiB0aGUgTkFSRVMgZGF0YSIKb3V0cHV0OiAgIAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgoqKkouIFRhcm9uaSAyMDE4KioKClRoZSBOQVJFUyBzdHVkeSB3YXMgcHVibGlzaGVkIGluIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZToKCj4gR3JheXNvbiBQQywgU3RlaWxpbmcgSywgUGxhdHQgTSwgZXQgYWwuIFtEZWZpbmluZyB0aGUgTmFzYWwgVHJhbnNjcmlwdG9tZSBpbiBHcmFudWxvbWF0b3NpcyB3aXRoIFBvbHlhbmdpaXRpc10oaHR0cHM6Ly9keC5kb2kub3JnLzEwLjEwMGFydC4zOTE4NSkuIF9BcnRocml0aXMgJiBSaGV1bWF0b2xvZ3lfLCAyMDE1LiBkb2k6IDEwLjEwMDIvYXJ0LjM5MTg1LgoKV2UgcHJvY2Vzc2VkIHRoaXMgZGF0YSBpbiB0aGUgW2BncmVlbmVsYWIvcmhldW0tZGF0YS1wbGllcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ncmVlbmVsYWIvcmhldW0tcGxpZXItZGF0YSkgCnJlcG8uCgpUaGlzIGRhdGFzZXQgKGBuID0gNzZgKSBjb250YWlucyBuYXNhbCBicnVzaGluZyBzYW1wbGVzIGZyb20gcGF0aWVudHMgd2l0aCAKZ3JhbnVsb21hdG9zaXMgd2l0aCBwb2x5YW5naWl0aXMgKEdQQSksIGEgZm9ybSBvZiBBTkNBLWFzc29jaWF0ZWQgdmFzY3VsaXRpcy4gClBhdGllbnRzIHdpdGggR1BBIGVpdGhlciBoYWQgYWN0aXZlLCBhIHByaW9yIGhpc3Rvcnkgb2YsIG9yIG5vIGhpc3Rvcnkgb2YgCm5hc2FsIGRpc2Vhc2UuCkEgY29tcG9zaXRlIGNvbXBhcmF0b3IgZ3JvdXAgb2YgcGF0aWVudHMgd2l0aCBzYXJjb2lkb3NpcywgcGF0aWVudHMgd2l0aAphbGxlcmdpYyByaGluaXRpcyBhbmQgaGVhbHRoeSBjb250cm9scyBpcyBhbHNvIGluY2x1ZGVkLgoKSGVyZSB3ZSdsbCB0cmFpbiBhIFBMSUVSIG1vZGVsIGFuZCBleHBsb3JlOgoKICAqIFRoZSBzcGFyc2l0eSBvZiB0aGUgVSBtYXRyaXgKICAqIEhvdyBtYW55IExWcyBhcmUgcmVjb3ZlcmVkPyBIb3cgbWFueSBwYXRod2F5cz8KICAqIFdoYXQgYXJlIHRoZSBwYXRod2F5cyB0aGF0IGFyZSByZXByZXNlbnRlZD8KCiMjIExpYnJhcmllcwoKYGBge3J9CmxpYnJhcnkoQW5ub3RhdGlvbkRiaSkKbGlicmFyeShQTElFUikKYGBgCgojIyBOQVJFUyBkYXRhCgpgYGB7cn0KbmFyZXMuZGF0YSA8LSByZWFkcjo6cmVhZF90c3YoZmlsZS5wYXRoKCJkYXRhIiwgImV4cHJlc3Npb25fZGF0YSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQVJFU19TQ0FOZmFzdF9Db21CYXQucGNsIikpCgpzeW1ib2wub2JqIDwtIG9yZy5Icy5lZy5kYjo6b3JnLkhzLmVnU1lNQk9MCm1hcHBlZC5nZW5lcyA8LSBBbm5vdGF0aW9uRGJpOjptYXBwZWRrZXlzKHN5bWJvbC5vYmopCnN5bWJvbC5saXN0IDwtIGFzLmxpc3Qoc3ltYm9sLm9ialttYXBwZWQuZ2VuZXNdKQpzeW1ib2wuZGYgPC0gYXMuZGF0YS5mcmFtZShjYmluZChuYW1lcyhzeW1ib2wubGlzdCksIHVubGlzdChzeW1ib2wubGlzdCkpKQpjb2xuYW1lcyhzeW1ib2wuZGYpIDwtIGMoIkVudHJleklEIiwgIkdlbmVTeW1ib2wiKQoKIyBnZXQgZ2VuZSBjb2x1bW4gbmFtZSB0byBtYXRjaCB0byBmYWNpbGl0YXRlIHVzZSB3aXRoIGRwbHlyCmNvbG5hbWVzKG5hcmVzLmRhdGEpWzFdIDwtICJFbnRyZXpJRCIKCiMgbWF0Y2hpbmcgdHlwZXMKc3ltYm9sLmRmJEVudHJleklEIDwtIGFzLmludGVnZXIoYXMuY2hhcmFjdGVyKHN5bWJvbC5kZiRFbnRyZXpJRCkpCgojIGlubmVyIGpvaW4KYW5ub3QubmFyZXMuZGF0YSA8LSBkcGx5cjo6aW5uZXJfam9pbihzeW1ib2wuZGYsIG5hcmVzLmRhdGEsIGJ5ID0gIkVudHJleklEIikKCnN5bWJvbC5maWxlIDwtIAogIGZpbGUucGF0aCgiZGF0YSIsICJleHByZXNzaW9uX2RhdGEiLCAKICAgICAgICAgICAgIk5BUkVTX1NDQU5mYXN0X0NvbUJhdF93aXRoX0dlbmVTeW1ib2wucGNsIikKCnJlYWRyOjp3cml0ZV9kZWxpbShhbm5vdC5uYXJlcy5kYXRhLCBwYXRoID0gc3ltYm9sLmZpbGUsIGRlbGltID0gIlx0IikKCiMgb25seSBsZWF2ZSB0aGUgbWF0cml4IHdpdGggZ2VuZSBzeW1ib2wgYXMgcm93bmFtZXMKZXhwcnMubWF0IDwtIGRwbHlyOjpzZWxlY3QoYW5ub3QubmFyZXMuZGF0YSwgLUVudHJleklEKQpyb3duYW1lcyhleHBycy5tYXQpIDwtIGV4cHJzLm1hdCRHZW5lU3ltYm9sCmV4cHJzLm1hdCA8LSBhcy5tYXRyaXgoZHBseXI6OnNlbGVjdChleHBycy5tYXQsIC1HZW5lU3ltYm9sKSkKcm0obGlzdCA9IHNldGRpZmYobHMoKSwgYygiZXhwcnMubWF0IikpKQpgYGAKCiMjIEZ1bmN0aW9ucyBhbmQgZGlyZWN0b3J5IHNldCB1cAoKT3JnYW5pemVkIHRoaXMgd2F5IGZvciBjb252ZW5pZW5jZSB3LnIudC4gcmVtb3Zpbmcgb2JqZWN0cyBmcm9tIHRoZSBlbnZpcm9ubWVudAphZnRlciBnZW5lIGlkZW50aWZpZXIgY29udmVyc2lvbi4KCmBgYHtyfQpgJT4lYCA8LSBkcGx5cjo6YCU+JWAKc291cmNlKGZpbGUucGF0aCgidXRpbCIsICJwbGllcl91dGlsLlIiKSkKYGBgCgpgYGB7cn0KIyBwbG90IGFuZCByZXN1bHQgZGlyZWN0b3J5IHNldHVwIGZvciB0aGlzIG5vdGVib29rCnBsb3QuZGlyIDwtIGZpbGUucGF0aCgicGxvdHMiLCAiMTIiKQpkaXIuY3JlYXRlKHBsb3QuZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKcmVzdWx0cy5kaXIgPC0gZmlsZS5wYXRoKCJyZXN1bHRzIiwgIjEyIikKZGlyLmNyZWF0ZShyZXN1bHRzLmRpciwgcmVjdXJzaXZlID0gVFJVRSwgc2hvd1dhcm5pbmdzID0gRkFMU0UpCmBgYAoKIyMgUExJRVIgbW9kZWwKCiMjIyBUcmFpbmluZwoKYGBge3J9CiMgdHJhaW4gbW9kZWwgYW5kIHNhdmUgdG8gZmlsZQpuYXJlcy5wbGllciA8LSBQTElFUk5ld0RhdGEoZXhwcnMubWF0KQpwbGllci5maWxlIDwtIGZpbGUucGF0aChyZXN1bHRzLmRpciwgIk5BUkVTX1BMSUVSX21vZGVsLlJEUyIpCnNhdmVSRFMobmFyZXMucGxpZXIsIGZpbGUgPSBwbGllci5maWxlKQoKIyBzYXZlIHN1bW1hcnkgZGF0YS5mcmFtZSB0byByZXN1bHRzCnN1bW1hcnkuZmlsZSA8LSBmaWxlLnBhdGgocmVzdWx0cy5kaXIsICJOQVJFU19zdW1tYXJ5LnRzdiIpCnJlYWRyOjp3cml0ZV90c3YobmFyZXMucGxpZXIkc3VtbWFyeSwgcGF0aCA9IHN1bW1hcnkuZmlsZSkKYGBgCgojIyMgTnVtYmVyIG9mIExWcwoKYGBge3J9Cm5yb3cobmFyZXMucGxpZXIkQikKYGBgCgpUaGUgbW9kZWwgbGVhcm5zIDM0IGxhdGVudCB2YXJpYWJsZXMuIApGcm9tIHRoZSB0cmFjZSBkdXJpbmcgdHJhaW5pbmcsIHdlIGtub3cgdGhhdCAxNSBvZiB0aGVtIGhhdmUgYEFVQz4wLjcwYC4KCiMjIyBFeGFtaW5lIFUgYW5kIHBhdGh3YXkgY292ZXJhZ2UKCkFzIG5vdGVkIGluIHRoZSBTTEUgV0IgUExJRVIgbm90ZWJvb2s6Cgo+IGBVYCBpcyB0aGUgcHJpb3IgaW5mb3JtYXRpb24gY29lZmZpY2llbnQgbWF0cml4OyBpdCB0ZWxscyB1cyBob3cgCnRoZSBwcmlvciBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBwYXRod2F5cy9nZW5lIHNldHMgcmVsYXRlcyB0byBMVnMuCgpgYGB7cn0KUExJRVI6OnBsb3RVKG5hcmVzLnBsaWVyLCBmb250c2l6ZV9yb3cgPSA3KQpgYGAKClRvIHN1bW1hcml6ZSAqc29tZSogb2YgdGhlc2UgcmVzdWx0czoKCiogQSBsYXRlbnQgdmFyaWFibGUgYXNzb2NpYXRlZCB3aXRoIGV4dHJhY2VsbHVsYXIgbWF0cml4IGZvcm1hdGlvbiBpcyBjYXB0dXJlZC4gCmBMVjE0YCBpcyBhc3NvY2lhdGVkIHdpdGggCltgUkVBQ1RPTUVfRVhUUkFDRUxMVUxBUl9NQVRSSVhfT1JHQU5JWkFUSU9OYF0oaHR0cDovL3NvZnR3YXJlLmJyb2FkaW5zdGl0dXRlLm9yZy9nc2VhL21zaWdkYi9jYXJkcy9SRUFDVE9NRV9FWFRSQUNFTExVTEFSX01BVFJJWF9PUkdBTklaQVRJT04uaHRtbCksIApbYFJFQUNUT01FX0NPTExBR0VOX0ZPUk1BVElPTmBdKGh0dHA6Ly9zb2Z0d2FyZS5icm9hZGluc3RpdHV0ZS5vcmcvZ3NlYS9tc2lnZGIvY2FyZHMvUkVBQ1RPTUVfQ09MTEFHRU5fRk9STUFUSU9OLmh0bWwpLAphbmQgW2BQSURfSU5URUdSSU4xX1BBVEhXQVlgXShodHRwOi8vc29mdHdhcmUuYnJvYWRpbnN0aXR1dGUub3JnL2dzZWEvbXNpZ2RiL2NhcmRzL1BJRF9JTlRFR1JJTjFfUEFUSFdBWS5odG1sKS4KKiBUaGVyZSdzIGEgbmV1dHJvcGhpbC1hc3NvY2lhdGVkIExWLCBgTFYzYC4KKiBJbnRlcmZlcm9uIHNpZ25hbGluZyBpcyBwcm9iYWJseSBjYXB0dXJlZCBieSBgTFYyNWAsIGJ1dCB0d28gaW1tdW5lIGNlbGwgCnR5cGVzLCBNMSBtYWNyb3BoYWdlcyBhbmQgQ0Q4IFQgY2VsbHMsIGFyZSBhbHNvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIExWLgpUaGlzIGlzIGxpa2VseSBkdWUgdG8gdGhlaXIgcHJvZHVjdGlvbiBvZiBvciBhY3RpdmF0aW9uIGJ5IElGTiBhbmQgd2Ugc2F3IGEgYml0Cm9mIHRoaXMgb3ZlcmxhcCB3aXRoIGNlbGwgdHlwZXMgaW4gb3RoZXIgbW9kZWxzIChTTEUgV0IsIHJlY291bnQyKS4KCmBgYHtyfQojIHNhdmUgVSBwbG90IHRvIGZpbGUKcGRmKGZpbGUucGF0aChwbG90LmRpciwgIk5BUkVTX1VfcGxvdC5wZGYiKSwgaGVpZ2h0ID0gNSwgd2lkdGggPSA3KQpQTElFUjo6cGxvdFUobmFyZXMucGxpZXIsIGZvbnRzaXplX3JvdyA9IDgsIGZvbnRzaXplX2NvbCA9IDgpCmRldi5vZmYoKQpgYGAKCiMjIyMgV2hhdCBwcm9wb3J0aW9uIG9mIHRoZSBwYXRod2F5cyBpbnB1dCBpbnRvIHRoZSBQTElFUiBtb2RlbCBhcmUgc2lnbmlmaWNhbnRseSBhc3NvY2lhdGVkIHdpdGggYXQgbGVhc3Qgb25lIExWPwoKYGBge3J9CmNvdmVyYWdlLnJlc3VsdHMgPC0gR2V0UGF0aHdheUNvdmVyYWdlKG5hcmVzLnBsaWVyKSAgIyBGRFIgPCAwLjA1IGJ5IGRlZmF1bHQKY292ZXJhZ2UucmVzdWx0cyRwYXRod2F5CmBgYAoKTGVzcyB0aGFuIDEwJSBvZiB0aGUgcGF0aHdheXMgd2UgYXJlIGludGVyZXN0ZWQgaW4gYXJlIHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZAp3aXRoIGEgbGF0ZW50IHZhcmlhYmxlLgoKIyMjIyBIb3cgc3BhcnNlIGlzIFU/CgpUYWtlIGludG8gYWNjb3VudCBfYWxsXyBwYXRod2F5cwpgYGB7cn0KdS5zcGFyc2l0eS5hbGwgPC0gQ2FsY3VsYXRlVVNwYXJzaXR5KG5hcmVzLnBsaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQub25seSA9IEZBTFNFKQpnZ3Bsb3QyOjpnZ3Bsb3QoYXMuZGF0YS5mcmFtZSh1LnNwYXJzaXR5LmFsbCksCiAgICAgICAgICAgICAgICBnZ3Bsb3QyOjphZXMoeCA9IHUuc3BhcnNpdHkuYWxsKSkgKwogIGdncGxvdDI6Omdlb21fZGVuc2l0eShmaWxsID0gImJsdWUiLCBhbHBoYSA9IDAuNSkgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmxhYnMoeCA9ICJwcm9wb3J0aW9uIG9mIHBvc2l0aXZlIGVudHJpZXMgaW4gVSIsCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJBbGwgTFZzIikgKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgpgYGB7cn0Kc3VtbWFyeSh1LnNwYXJzaXR5LmFsbCkKYGBgCgpgYGB7cn0KcGxvdC5maWxlIDwtIGZpbGUucGF0aChwbG90LmRpciwgIk5BUkVTX1Vfc3BhcnNpdHlfYWxsLnBuZyIpCmdncGxvdDI6Omdnc2F2ZShwbG90LmZpbGUsIHBsb3QgPSBnZ3Bsb3QyOjpsYXN0X3Bsb3QoKSkKYGBgCgpXaGF0IHByb3BvcnRpb24gb2YgZW50cmllcyBpbiB0aGUgVSBtYXRyaXggZm9yIGVhY2ggTFYgYXJlIHNpZ25pZmljYW50bHkKYXNzb2NpYXRlZCB3aXRoIHRoYXQgTFY/CgpgYGB7cn0KdS5zcGFyc2l0eS5zaWcgPC0gQ2FsY3VsYXRlVVNwYXJzaXR5KG5hcmVzLnBsaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQub25seSA9IFRSVUUpCmdncGxvdDI6OmdncGxvdChhcy5kYXRhLmZyYW1lKHUuc3BhcnNpdHkuc2lnKSwKICAgICAgICAgICAgICAgIGdncGxvdDI6OmFlcyh4ID0gdS5zcGFyc2l0eS5zaWcpKSArCiAgZ2dwbG90Mjo6Z2VvbV9kZW5zaXR5KGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC41KSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6bGFicyh4ID0gInByb3BvcnRpb24gb2YgcG9zaXRpdmUgZW50cmllcyBpbiBVIiwKICAgICAgICAgICAgICAgIHRpdGxlID0gIlBhdGh3YXktYXNzb2NpYXRlZCBMVnMiKSAgKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgpgYGB7cn0Kc3VtbWFyeSh1LnNwYXJzaXR5LnNpZykKYGBgCgpgYGB7cn0KcGxvdC5maWxlIDwtIGZpbGUucGF0aChwbG90LmRpciwgIk5BUkVTX1Vfc3BhcnNpdHlfc2lnbmlmaWNhbnQucG5nIikKZ2dwbG90Mjo6Z2dzYXZlKHBsb3QuZmlsZSwgcGxvdCA9IGdncGxvdDI6Omxhc3RfcGxvdCgpKQpgYGAK