├── README.md ├── cellchat ├── cellchat_lr_breast.ipynb ├── cellchat_lr_glioblastoma.ipynb ├── cellchat_lr_lung.ipynb ├── cellchat_lr_melanoma.ipynb ├── cellchat_lr_pancreas.ipynb ├── cellchat_lr_prostate.ipynb └── cellchat_lr_sarcoma.ipynb ├── differential_expression ├── bright_pb_vs_tr_deg.csv ├── de_up_adaptive.csv ├── de_up_brights.csv ├── de_up_cd57_pos.csv ├── de_up_kir_pos.csv ├── de_up_nkg2a_pos.csv ├── deg_pseudobulk.ipynb └── dim_pb_vs_tr_deg.csv ├── environment.yml ├── mapping_tumor_data └── map_tink_to_ref.ipynb ├── milo └── milo_r.ipynb ├── nk_reference └── normal_reference_nk.ipynb ├── pb_nk ├── meta_nk_aucell.ipynb ├── metank_gene_sig.txt ├── pb_nk_integration.ipynb └── pseudotime_trends.ipynb ├── regulatory_networks └── scenic_all_nk.ipynb ├── scripts └── decontx_all.py ├── spatial └── spatial_data_melanoma.ipynb ├── survival_analysis ├── nhood_markers_all.csv ├── tcga_survival_breast.ipynb ├── tcga_survival_gbm.ipynb ├── tcga_survival_lung.ipynb ├── tcga_survival_pancreas.ipynb ├── tcga_survival_prostate.ipynb ├── tcga_survival_sarc.ipynb └── tcga_survival_skcm.ipynb ├── tissue_integration ├── train_scvi_brain_normal_tissue_all_cells.ipynb ├── train_scvi_breast_normal_tissue_all_cells.ipynb ├── train_scvi_lung_normal_tissue_all_cells.ipynb ├── train_scvi_pancreas_normal_tissue_all_cells.ipynb ├── train_scvi_prostate_normal_tissue_all_cells.ipynb └── train_scvi_skin_normal_tissue_all_cells.ipynb └── tumor_integration ├── train_scvi_breast_tumor_all_cells.ipynb ├── train_scvi_glioblastoma_tumor_all_cells.ipynb ├── train_scvi_lung_tumor_all_cells.ipynb ├── train_scvi_melanoma_tumor_all_cells.ipynb ├── train_scvi_pancreas_tumor.ipynb ├── train_scvi_prostate_tumor_all_cells.ipynb └── train_scvi_sarcoma_tumor_all_cells.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # Pan-cancer profiling of tumor-infiltrating natural killer cells through transcriptional reference mapping 2 | We describe a transcriptional reference map of human natural killer (NK) cells based on analysis of scRNA-seq data from both blood and tissue. We also analyze data from various solid tumors and map these onto this reference. 3 | 4 | 5 | ### Data 6 | The gene expression data generated for this paper is available at NCBI GEO with accession number GSE245690 and raw sequencing data is available at EGA with accession number EGAS50000000014. The details about the publicly available data included in the analysis are available in Supplemental tables S1, S2 and S3. Processed data and models have also been made available on Zenodo (https://doi.org/10.5281/zenodo.10139343) and as an online resource at http://nk-scrna.malmberglab.com/. 7 | 8 | ### Citation 9 | 10 | Netskar, H., Pfefferle, A., Goodridge, J.P. et al. Pan-cancer profiling of tumor-infiltrating natural killer cells through transcriptional reference mapping. Nat Immunol (2024). https://doi.org/10.1038/s41590-024-01884-z 11 | -------------------------------------------------------------------------------- /differential_expression/bright_pb_vs_tr_deg.csv: -------------------------------------------------------------------------------- 1 | ,p_val,lfc_mean,comparison,group1,group2 2 | BOP1,0.0,-2.76402115,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 3 | PSMA2,0.0003999999999999,-3.7520975,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 4 | CNBD2,0.0006,-2.90462925,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 5 | S1PR2,0.001,-2.906996,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 6 | MLLT1,0.0018,-2.5398525,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 7 | SLC5A3,0.0018,-2.932918,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 8 | CCL4L2,0.0036,-4.2268445,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 9 | NAA60,0.0036,-2.31744265,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 10 | ZNF26,0.0048,-2.1598449,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 11 | MAP1LC3B2,0.0053999999999999,-2.4647608,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 12 | CLN3,0.0056,-2.98025725,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 13 | IKZF3,0.0058,-1.9523335,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 14 | PHKG1,0.007,-2.42111635,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 15 | SNRPN,0.007,-1.9984381,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 16 | FCRL1,0.0076,-2.31681085,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 17 | GPR89B,0.0076,-2.19977975,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 18 | LRRC32,0.008,-2.22786615,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 19 | PROB1,0.0088,-1.9505713,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 20 | SCGB1A1,0.0091999999999999,-2.9693825,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 21 | TAS2R4,0.0091999999999999,-2.007922,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 22 | KCNC4,0.01,-2.0154915,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 23 | GMPPB,0.011,-2.0619165,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 24 | CD4,0.0111999999999999,-2.22581365,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 25 | KRT19,0.0111999999999999,-1.9637259,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 26 | ALPL,0.0118,-2.11624815,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 27 | CCL4,0.0121999999999999,-2.1702975,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 28 | AREG,0.0123999999999999,-2.9210632,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 29 | NEK5,0.0125999999999999,-1.9284998,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 30 | CD101,0.013,-2.71466065,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 31 | ADAMTSL4,0.0131999999999999,-2.32180165,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 32 | DAB2IP,0.0135999999999999,-2.34844635,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 33 | RAPGEF5,0.014,-2.005295,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 34 | TLCD2,0.0143999999999999,-1.9427197,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 35 | CD200,0.0148,-2.004511,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 36 | GOLGA6L9,0.0148,-2.1279032,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 37 | KIR2DL4,0.0151999999999999,-2.26822375,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 38 | FABP4,0.0158,-2.31095575,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 39 | HGH1,0.0158,-2.0082375,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 40 | VCAM1,0.0178,-2.07527875,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 41 | ADAMTS17,0.018,-2.11274815,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 42 | SSTR2,0.019,-1.96810915,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 43 | ADIRF,0.0191999999999999,-1.903949,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 44 | COLEC12,0.0193999999999999,-2.5455155,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 45 | CSF3,0.02,-1.9936505,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 46 | CCL3,0.0208,-2.197789,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 47 | LINC00623,0.0211999999999999,-2.41912415,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 48 | PLEKHG1,0.0218,-2.105088,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 49 | SLC22A31,0.0228,-2.1296122,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 50 | CCL20,0.0235999999999999,-2.071835,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 51 | FCN3,0.024,-2.14468265,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 52 | MAPK11,0.0242,-1.96474375,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 53 | PDCD1,0.0245999999999999,-2.11278485,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 54 | PPARG,0.0245999999999999,-2.17645025,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 55 | NR4A1,0.026,-1.95851265,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 56 | EIF4EBP3,0.0268,-1.98449455,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 57 | IFNG,0.0272,-1.94155835,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 58 | MSMB,0.0273999999999999,-1.96967185,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 59 | LIF,0.0285999999999999,-2.1386855,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 60 | LAG3,0.0285999999999999,-1.9229406,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 61 | TFF3,0.0288,-1.9135463,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 62 | ZBTB32,0.0295999999999999,-1.9855144,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 63 | CH25H,0.0298,-1.93597815,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 64 | GCSAM,0.0302,-1.9912733,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 65 | SCGB3A1,0.0302,-2.1193465,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 66 | NR5A2,0.0308,-2.143848,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 67 | SFTPA2,0.0328,-2.2648795,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 68 | SFTPA1,0.0358,-2.16216325,pb_CD56bright vs tr_CD56bright,pb_CD56bright,tr_CD56bright 69 | -------------------------------------------------------------------------------- /differential_expression/de_up_adaptive.csv: -------------------------------------------------------------------------------- 1 | ,p_val,lfc_mean,comparison,group1,group2 2 | LAG3,0.01140456182472993,3.429098,Adaptive vs Rest,Adaptive,Rest 3 | TPRG1,0.014805922368947622,3.223274,Adaptive vs Rest,Adaptive,Rest 4 | CD3G,0.021608643457383003,3.2557805,Adaptive vs Rest,Adaptive,Rest 5 | CD3D,0.02200880352140855,2.8584,Adaptive vs Rest,Adaptive,Rest 6 | LINC00944,0.024609843937575038,2.4433143,Adaptive vs Rest,Adaptive,Rest 7 | MT1E,0.025210084033613467,2.5400834,Adaptive vs Rest,Adaptive,Rest 8 | PTMS,0.027611044417767072,2.0949793,Adaptive vs Rest,Adaptive,Rest 9 | NSG1,0.027611044417767072,2.1801746,Adaptive vs Rest,Adaptive,Rest 10 | GDPD5,0.03221288515406162,1.9429904,Adaptive vs Rest,Adaptive,Rest 11 | LILRB1,0.03461384553821534,2.173475,Adaptive vs Rest,Adaptive,Rest 12 | ZNF683,0.03461384553821534,1.7962058,Adaptive vs Rest,Adaptive,Rest 13 | MCOLN2,0.037214885954381716,1.8035908,Adaptive vs Rest,Adaptive,Rest 14 | KLRC2,0.039015606242497,1.730746,Adaptive vs Rest,Adaptive,Rest 15 | HBA2,0.03941576630652266,1.9326701,Adaptive vs Rest,Adaptive,Rest 16 | JAKMIP1,0.04001600640256098,1.6203659,Adaptive vs Rest,Adaptive,Rest 17 | CDKN2A,0.04001600640256098,1.7987171,Adaptive vs Rest,Adaptive,Rest 18 | B3GAT1,0.041816726690676265,2.0496426,Adaptive vs Rest,Adaptive,Rest 19 | RAB11FIP5,0.042617046818727466,1.7063745,Adaptive vs Rest,Adaptive,Rest 20 | CADM1,0.04361744697879155,1.8269724,Adaptive vs Rest,Adaptive,Rest 21 | HBA1,0.044617847138855526,1.805651,Adaptive vs Rest,Adaptive,Rest 22 | CD3E,0.04681872749099636,1.572491,Adaptive vs Rest,Adaptive,Rest 23 | CD52,0.04801920768307322,1.5066476,Adaptive vs Rest,Adaptive,Rest 24 | MIAT,0.04801920768307322,1.8538712,Adaptive vs Rest,Adaptive,Rest 25 | MT1F,0.048419367747098874,1.392345,Adaptive vs Rest,Adaptive,Rest 26 | GSC,0.04961984793917562,1.5933071,Adaptive vs Rest,Adaptive,Rest 27 | -------------------------------------------------------------------------------- /differential_expression/de_up_brights.csv: -------------------------------------------------------------------------------- 1 | ,p_val,lfc_mean,comparison,group1,group2 2 | GPR183,0.009003601440576214,6.285398,CD56bright vs Rest,CD56bright,Rest 3 | LSR,0.012404961984793905,4.5500937,CD56bright vs Rest,CD56bright,Rest 4 | SCML1,0.01340536214485799,4.5577207,CD56bright vs Rest,CD56bright,Rest 5 | COTL1,0.014805922368947622,3.879388,CD56bright vs Rest,CD56bright,Rest 6 | TNFRSF11A,0.01540616246498594,4.5678854,CD56bright vs Rest,CD56bright,Rest 7 | IL7R,0.016606642657062798,4.3428907,CD56bright vs Rest,CD56bright,Rest 8 | SELL,0.017607042817126883,3.4740772,CD56bright vs Rest,CD56bright,Rest 9 | MYC,0.01880752300920363,4.1500235,CD56bright vs Rest,CD56bright,Rest 10 | ANO9,0.019207683073229287,3.7253182,CD56bright vs Rest,CD56bright,Rest 11 | TOX2,0.02000800320128049,4.383712,CD56bright vs Rest,CD56bright,Rest 12 | LEF1,0.02200880352140855,3.1148262,CD56bright vs Rest,CD56bright,Rest 13 | S100A13,0.02280912364945975,2.6687405,CD56bright vs Rest,CD56bright,Rest 14 | GAB1,0.025610244097639012,2.933383,CD56bright vs Rest,CD56bright,Rest 15 | ID3,0.02601040416166467,4.5148683,CD56bright vs Rest,CD56bright,Rest 16 | RUNX2,0.02621048419367744,3.6585102,CD56bright vs Rest,CD56bright,Rest 17 | DLL1,0.026610644257703098,3.962849,CD56bright vs Rest,CD56bright,Rest 18 | GNA15,0.027210884353741527,3.7796278,CD56bright vs Rest,CD56bright,Rest 19 | GZMK,0.027811124449779956,4.635734,CD56bright vs Rest,CD56bright,Rest 20 | PPP1R9A,0.029011604641856703,2.4981825,CD56bright vs Rest,CD56bright,Rest 21 | TSPAN4,0.029211684673869587,3.1267219,CD56bright vs Rest,CD56bright,Rest 22 | WNT11,0.029211684673869587,3.7044983,CD56bright vs Rest,CD56bright,Rest 23 | HVCN1,0.03081232492997199,2.7438998,CD56bright vs Rest,CD56bright,Rest 24 | YBX3,0.03261304521808728,3.2776875,CD56bright vs Rest,CD56bright,Rest 25 | MAML3,0.03301320528211282,3.1240966,CD56bright vs Rest,CD56bright,Rest 26 | XCL1,0.033213285314125596,3.621864,CD56bright vs Rest,CD56bright,Rest 27 | TIAM1,0.03701480592236894,2.731915,CD56bright vs Rest,CD56bright,Rest 28 | SPRY1,0.043217286914765896,3.0067346,CD56bright vs Rest,CD56bright,Rest 29 | TMEM14C,0.0440176070428171,2.1036067,CD56bright vs Rest,CD56bright,Rest 30 | TTLL10,0.04541816726690673,2.618513,CD56bright vs Rest,CD56bright,Rest 31 | HAPLN3,0.04561824729891961,2.9495122,CD56bright vs Rest,CD56bright,Rest 32 | MMP25,0.047218887555022016,2.4840047,CD56bright vs Rest,CD56bright,Rest 33 | B3GALNT1,0.047218887555022016,2.7522516,CD56bright vs Rest,CD56bright,Rest 34 | CLNK,0.049219687875150075,2.540661,CD56bright vs Rest,CD56bright,Rest 35 | FXYD7,0.04941976790716285,2.8110745,CD56bright vs Rest,CD56bright,Rest 36 | -------------------------------------------------------------------------------- /differential_expression/de_up_cd57_pos.csv: -------------------------------------------------------------------------------- 1 | ,p_val,lfc_mean,comparison,group1,group2 2 | PTGDS,0.031212484993997647,2.4036758,CD57+ vs Rest,CD57+,Rest 3 | ZNF683,0.03301320528211282,1.93766,CD57+ vs Rest,CD57+,Rest 4 | S100B,0.039215686274509776,1.4937865,CD57+ vs Rest,CD57+,Rest 5 | B3GAT1,0.04081632653061229,2.1979692,CD57+ vs Rest,CD57+,Rest 6 | COL13A1,0.04081632653061229,1.8461539,CD57+ vs Rest,CD57+,Rest 7 | HBA1,0.04361744697879155,1.5930859,CD57+ vs Rest,CD57+,Rest 8 | HBA2,0.04361744697879155,1.4869615,CD57+ vs Rest,CD57+,Rest 9 | IFI27,0.046618647458983586,1.3252943,CD57+ vs Rest,CD57+,Rest 10 | NSG1,0.04741896758703479,1.1485823,CD57+ vs Rest,CD57+,Rest 11 | SORBS2,0.04821928771508599,1.4136593,CD57+ vs Rest,CD57+,Rest 12 | PALLD,0.04961984793917562,1.6887579,CD57+ vs Rest,CD57+,Rest 13 | -------------------------------------------------------------------------------- /differential_expression/de_up_kir_pos.csv: -------------------------------------------------------------------------------- 1 | ,p_val,lfc_mean,comparison,group1,group2 2 | PTGDS,0.02941176470588236,1.9585695,KIR+ vs Rest,KIR+,Rest 3 | PCSK5,0.039215686274509776,1.8463434,KIR+ vs Rest,KIR+,Rest 4 | SORBS2,0.039215686274509776,1.5607915,KIR+ vs Rest,KIR+,Rest 5 | PDGFRB,0.03941576630652266,1.6379219,KIR+ vs Rest,KIR+,Rest 6 | B3GAT1,0.04001600640256098,1.2591028,KIR+ vs Rest,KIR+,Rest 7 | COL13A1,0.04421768707482998,1.0165076,KIR+ vs Rest,KIR+,Rest 8 | PCDH1,0.04601840736294516,1.5785737,KIR+ vs Rest,KIR+,Rest 9 | LGR6,0.04621848739495793,1.8811342,KIR+ vs Rest,KIR+,Rest 10 | NUAK1,0.046618647458983586,1.0643895,KIR+ vs Rest,KIR+,Rest 11 | GNAL,0.047819127651060445,1.5318292,KIR+ vs Rest,KIR+,Rest 12 | DAB2,0.049219687875150075,1.5454047,KIR+ vs Rest,KIR+,Rest 13 | -------------------------------------------------------------------------------- /differential_expression/de_up_nkg2a_pos.csv: -------------------------------------------------------------------------------- 1 | ,p_val,lfc_mean,comparison,group1,group2 2 | GPR183,0.016406562625050025,2.1510997,NKG2A+ vs Rest,NKG2A+,Rest 3 | GZMK,0.019807923169267716,2.241302,NKG2A+ vs Rest,NKG2A+,Rest 4 | MYC,0.024609843937575038,1.7149199,NKG2A+ vs Rest,NKG2A+,Rest 5 | SCML1,0.025610244097639012,1.1689938,NKG2A+ vs Rest,NKG2A+,Rest 6 | ID3,0.027811124449779956,1.9320335,NKG2A+ vs Rest,NKG2A+,Rest 7 | TNFRSF11A,0.0282112845138055,1.5531603,NKG2A+ vs Rest,NKG2A+,Rest 8 | XCL1,0.03001200480192079,1.5373559,NKG2A+ vs Rest,NKG2A+,Rest 9 | ANO9,0.03081232492997199,1.3135897,NKG2A+ vs Rest,NKG2A+,Rest 10 | IL7R,0.03281312525010005,1.2158722,NKG2A+ vs Rest,NKG2A+,Rest 11 | RUNX2,0.036414565826330514,1.4067564,NKG2A+ vs Rest,NKG2A+,Rest 12 | LSR,0.037214885954381716,1.0812525,NKG2A+ vs Rest,NKG2A+,Rest 13 | LDB2,0.044417767106842754,1.5218979,NKG2A+ vs Rest,NKG2A+,Rest 14 | SPRY1,0.04561824729891961,1.0180645,NKG2A+ vs Rest,NKG2A+,Rest 15 | ANK3,0.04601840736294516,1.4278271,NKG2A+ vs Rest,NKG2A+,Rest 16 | PDGFA,0.047819127651060445,1.200781,NKG2A+ vs Rest,NKG2A+,Rest 17 | HOXA10,0.04801920768307322,1.0112121,NKG2A+ vs Rest,NKG2A+,Rest 18 | -------------------------------------------------------------------------------- /differential_expression/dim_pb_vs_tr_deg.csv: -------------------------------------------------------------------------------- 1 | ,p_val,lfc_mean,comparison,group1,group2 2 | BOP1,0.0,-3.072363,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 3 | MLLT1,0.0,-2.79313875,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 4 | ZNF26,0.0,-2.3058375,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 5 | CNBD2,0.0003999999999999,-3.15787075,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 6 | PSMA2,0.0003999999999999,-3.4815605,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 7 | CLN3,0.0011999999999999,-2.8690903,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 8 | MAP1LC3B2,0.0013999999999999,-2.739333,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 9 | SLC5A3,0.0021999999999999,-2.9390855,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 10 | GPR89B,0.0021999999999999,-2.151487,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 11 | THTPA,0.0028,-2.6392795,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 12 | S1PR2,0.003,-2.4175923,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 13 | GMPPB,0.0036,-2.08686925,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 14 | NAA60,0.004,-2.0106585,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 15 | NEK5,0.0043999999999999,-2.32111835,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 16 | CCL4L2,0.0046,-3.3302903,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 17 | TAS2R4,0.0048,-2.009121,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 18 | PHKG1,0.0058,-2.4281675,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 19 | PROB1,0.0061999999999999,-1.9860959,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 20 | TLCD2,0.0063999999999999,-2.4841597,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 21 | HGH1,0.0076,-2.0555285,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 22 | FXYD3,0.0091999999999999,-2.4454746,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 23 | AREG,0.0096,-3.19706,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 24 | LIMS2,0.0106,-2.0491335,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 25 | CD4,0.0106,-2.1975955,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 26 | TMEM100,0.0108,-1.9190438,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 27 | PLLP,0.011,-1.9782828,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 28 | SAA1,0.0121999999999999,-2.1271913,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 29 | TIMP3,0.013,-1.9060068,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 30 | FCRL1,0.0131999999999999,-2.067314,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 31 | COLEC12,0.0133999999999999,-2.5503862,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 32 | RNASE1,0.0133999999999999,-2.1744415,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 33 | MANSC1,0.0135999999999999,-1.9382111,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 34 | GOLGA6L9,0.014,-1.9357234,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 35 | GSTA1,0.0153999999999999,-1.98287775,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 36 | SCGB1A1,0.0158,-2.95024015,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 37 | TMEM190,0.016,-1.95152805,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 38 | KRT19,0.016,-2.034782,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 39 | TFF3,0.0161999999999999,-1.93687855,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 40 | AGR2,0.0163999999999999,-1.9171795,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 41 | TACSTD2,0.0168,-1.9605725,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 42 | DLX2,0.017,-2.0536418,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 43 | PCDHGA5,0.0171999999999999,-1.9068047,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 44 | AGR3,0.0173999999999999,-2.1755805,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 45 | CDH13,0.0178,-2.22078515,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 46 | KIR2DL4,0.018,-2.07412385,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 47 | PCDHGB6,0.0188,-2.0085295,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 48 | MS4A2,0.019,-2.10072,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 49 | FCN3,0.019,-2.09395765,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 50 | SCGB3A2,0.0193999999999999,-2.479611,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 51 | NR4A3,0.0203999999999999,-2.14060185,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 52 | SCGB3A1,0.0205999999999999,-2.76610015,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 53 | BGN,0.0211999999999999,-1.95564045,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 54 | SSTR2,0.0213999999999999,-1.9162601,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 55 | PPARG,0.0228,-1.9421674,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 56 | NR4A2,0.0242,-2.03139685,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 57 | TNFSF9,0.0248,-1.97289,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 58 | NR4A1,0.0252,-2.05915665,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 59 | SPARCL1,0.0268,-1.9343699,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 60 | FOSB,0.0278,-1.91559375,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 61 | PTGDS,0.03,-1.9413053,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 62 | SLPI,0.0318,-2.078176,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 63 | TM4SF1,0.0335999999999999,-1.9220258,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 64 | GREM1,0.0345999999999999,-1.9036832,pb_CD56dim vs tr_CD56dim,pb_CD56dim,tr_CD56dim 65 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: nk_reference 2 | channels: 3 | - conda-forge 4 | - bioconda 5 | - defaults 6 | dependencies: 7 | - _libgcc_mutex=0.1=conda_forge 8 | - _openmp_mutex=4.5=2_gnu 9 | - _r-mutex=1.0.1=anacondar_1 10 | - aiosignal=1.3.1=pyhd8ed1ab_0 11 | - anndata=0.10.3=pyhd8ed1ab_0 12 | - anndata2ri=1.1=pyhdfd78af_0 13 | - annotated-types=0.6.0=pyhd8ed1ab_0 14 | - anyio=4.1.0=pyhd8ed1ab_0 15 | - aom=3.7.1=h59595ed_0 16 | - argon2-cffi=23.1.0=pyhd8ed1ab_0 17 | - argon2-cffi-bindings=21.2.0=py39hd1e30aa_4 18 | - arpack=3.7.0=hdefa2d7_2 19 | - array-api-compat=1.4=pyhd8ed1ab_0 20 | - asttokens=2.4.1=pyhd8ed1ab_0 21 | - attrs=23.1.0=pyh71513ae_1 22 | - aws-c-auth=0.7.11=h0b4cabd_1 23 | - aws-c-cal=0.6.9=h14ec70c_3 24 | - aws-c-common=0.9.12=hd590300_0 25 | - aws-c-compression=0.2.17=h572eabf_8 26 | - aws-c-event-stream=0.4.1=h97bb272_2 27 | - aws-c-http=0.8.0=h9129f04_2 28 | - aws-c-io=0.14.0=hf8f278a_1 29 | - aws-c-mqtt=0.10.1=h2b97f5f_0 30 | - aws-c-s3=0.4.9=hca09fc5_0 31 | - aws-c-sdkutils=0.1.13=h572eabf_1 32 | - aws-checksums=0.1.17=h572eabf_7 33 | - aws-crt-cpp=0.26.0=h04327c0_8 34 | - aws-sdk-cpp=1.11.210=hba3e011_10 35 | - babel=2.13.1=pyhd8ed1ab_0 36 | - beautifulsoup4=4.12.2=pyha770c72_0 37 | - binutils_impl_linux-64=2.40=hf600244_0 38 | - bleach=6.1.0=pyhd8ed1ab_0 39 | - blosc=1.21.5=h0f2a231_0 40 | - brotli=1.1.0=hd590300_1 41 | - brotli-bin=1.1.0=hd590300_1 42 | - brotli-python=1.1.0=py39h3d6467e_1 43 | - brunsli=0.1=h9c3ff4c_0 44 | - bwidget=1.9.14=ha770c72_1 45 | - bzip2=1.0.8=hd590300_5 46 | - c-ares=1.23.0=hd590300_0 47 | - c-blosc2=2.12.0=hb4ffafa_0 48 | - ca-certificates=2023.11.17=hbcca054_0 49 | - cached-property=1.5.2=hd8ed1ab_1 50 | - cached_property=1.5.2=pyha770c72_1 51 | - cairo=1.18.0=h3faef2a_0 52 | - certifi=2023.11.17=pyhd8ed1ab_0 53 | - cffi=1.16.0=py39h7a31438_0 54 | - charls=2.4.2=h59595ed_0 55 | - charset-normalizer=3.3.2=pyhd8ed1ab_0 56 | - colorama=0.4.6=pyhd8ed1ab_0 57 | - comm=0.1.4=pyhd8ed1ab_0 58 | - contourpy=1.2.0=py39h7633fee_0 59 | - curl=8.5.0=hca28451_0 60 | - cycler=0.12.1=pyhd8ed1ab_0 61 | - dask-core=2024.1.0=pyhd8ed1ab_0 62 | - dask-image=2023.3.0=pyhd8ed1ab_0 63 | - dav1d=1.2.1=hd590300_0 64 | - debugpy=1.8.0=py39h3d6467e_1 65 | - decorator=5.1.1=pyhd8ed1ab_0 66 | - defusedxml=0.7.1=pyhd8ed1ab_0 67 | - docrep=0.3.2=pyh44b312d_0 68 | - dunamai=1.19.0=pyhd8ed1ab_0 69 | - entrypoints=0.4=pyhd8ed1ab_0 70 | - executing=2.0.1=pyhd8ed1ab_0 71 | - expat=2.5.0=hcb278e6_1 72 | - fa2=0.3.5=py39hb9d737c_2 73 | - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 74 | - font-ttf-inconsolata=3.000=h77eed37_0 75 | - font-ttf-source-code-pro=2.038=h77eed37_0 76 | - font-ttf-ubuntu=0.83=h77eed37_1 77 | - fontconfig=2.14.2=h14ed4e7_0 78 | - fonts-conda-ecosystem=1=0 79 | - fonts-conda-forge=1=0 80 | - fonttools=4.46.0=py39hd1e30aa_0 81 | - fqdn=1.5.1=pyhd8ed1ab_0 82 | - freetype=2.12.1=h267a509_2 83 | - fribidi=1.0.10=h36c2ea0_0 84 | - gcc_impl_linux-64=13.2.0=h338b0a0_3 85 | - get_version=3.5.5=pyhd8ed1ab_0 86 | - gettext=0.21.1=h27087fc_0 87 | - gflags=2.2.2=he1b5a44_1004 88 | - gfortran_impl_linux-64=13.2.0=h76e1118_3 89 | - giflib=5.2.1=h0b41bf4_3 90 | - git=2.43.0=pl5321h7bc287a_0 91 | - glog=0.6.0=h6f12383_0 92 | - glpk=5.0=h445213a_0 93 | - gmp=6.3.0=h59595ed_0 94 | - graphite2=1.3.13=h58526e2_1001 95 | - gxx_impl_linux-64=13.2.0=h338b0a0_3 96 | - h5py=3.10.0=nompi_py39h87cadad_100 97 | - harfbuzz=8.3.0=h3d44ed6_0 98 | - hdf5=1.14.2=nompi_h4f84152_100 99 | - icu=73.2=h59595ed_0 100 | - idna=3.6=pyhd8ed1ab_0 101 | - igraph=0.10.4=hb9ddf80_2 102 | - imagecodecs=2024.1.1=py39hf9b8f0e_0 103 | - imageio=2.33.1=pyh8c1a49c_0 104 | - importlib-metadata=7.0.0=pyha770c72_0 105 | - importlib-resources=6.1.1=pyhd8ed1ab_0 106 | - importlib_metadata=7.0.0=hd8ed1ab_0 107 | - importlib_resources=6.1.1=pyhd8ed1ab_0 108 | - inflect=7.0.0=pyhd8ed1ab_0 109 | - ipykernel=6.26.0=pyhf8b6a83_0 110 | - ipython=8.18.1=pyh707e725_3 111 | - ipython_genutils=0.2.0=py_1 112 | - isoduration=20.11.0=pyhd8ed1ab_0 113 | - jedi=0.19.1=pyhd8ed1ab_0 114 | - jinja2=3.1.2=pyhd8ed1ab_1 115 | - joblib=1.3.2=pyhd8ed1ab_0 116 | - json5=0.9.14=pyhd8ed1ab_0 117 | - jsonpointer=2.4=py39hf3d152e_3 118 | - jsonschema=4.20.0=pyhd8ed1ab_0 119 | - jsonschema-specifications=2023.11.2=pyhd8ed1ab_0 120 | - jsonschema-with-format-nongpl=4.20.0=pyhd8ed1ab_0 121 | - jupyter_client=8.6.0=pyhd8ed1ab_0 122 | - jupyter_core=5.5.0=py39hf3d152e_0 123 | - jupyter_events=0.9.0=pyhd8ed1ab_0 124 | - jupyter_server=2.12.1=pyhd8ed1ab_0 125 | - jupyter_server_terminals=0.4.4=pyhd8ed1ab_1 126 | - jupyterlab=3.5.3=pyhd8ed1ab_0 127 | - jupyterlab_pygments=0.3.0=pyhd8ed1ab_0 128 | - jupyterlab_server=2.25.2=pyhd8ed1ab_0 129 | - jxrlib=1.1=hd590300_3 130 | - kernel-headers_linux-64=2.6.32=he073ed8_16 131 | - keyutils=1.6.1=h166bdaf_0 132 | - kiwisolver=1.4.5=py39h7633fee_1 133 | - krb5=1.21.2=h659d440_0 134 | - lazy_loader=0.3=pyhd8ed1ab_0 135 | - lcms2=2.16=hb7c19ff_0 136 | - ld_impl_linux-64=2.40=h41732ed_0 137 | - leidenalg=0.9.1=py39h227be39_0 138 | - lerc=4.0.0=h27087fc_0 139 | - libabseil=20230802.1=cxx17_h59595ed_0 140 | - libaec=1.1.2=h59595ed_1 141 | - libarrow=14.0.2=h84dd17c_2_cpu 142 | - libarrow-acero=14.0.2=h59595ed_2_cpu 143 | - libarrow-dataset=14.0.2=h59595ed_2_cpu 144 | - libarrow-flight=14.0.2=h120cb0d_2_cpu 145 | - libarrow-flight-sql=14.0.2=h61ff412_2_cpu 146 | - libarrow-gandiva=14.0.2=hacb8726_2_cpu 147 | - libarrow-substrait=14.0.2=h61ff412_2_cpu 148 | - libavif16=1.0.3=hef5bec9_1 149 | - libblas=3.9.0=20_linux64_openblas 150 | - libbrotlicommon=1.1.0=hd590300_1 151 | - libbrotlidec=1.1.0=hd590300_1 152 | - libbrotlienc=1.1.0=hd590300_1 153 | - libcblas=3.9.0=20_linux64_openblas 154 | - libcrc32c=1.1.2=h9c3ff4c_0 155 | - libcurl=8.5.0=hca28451_0 156 | - libdeflate=1.19=hd590300_0 157 | - libedit=3.1.20191231=he28a2e2_2 158 | - libev=4.33=h516909a_1 159 | - libevent=2.1.12=hf998b51_1 160 | - libexpat=2.5.0=hcb278e6_1 161 | - libffi=3.4.2=h7f98852_5 162 | - libgcc-devel_linux-64=13.2.0=ha9c7c90_103 163 | - libgcc-ng=13.2.0=h807b86a_3 164 | - libgfortran-ng=13.2.0=h69a702a_3 165 | - libgfortran5=13.2.0=ha4646dd_3 166 | - libglib=2.78.2=h783c2da_0 167 | - libgomp=13.2.0=h807b86a_3 168 | - libgoogle-cloud=2.12.0=h5206363_4 169 | - libgrpc=1.59.3=hd6c4280_0 170 | - libhwloc=2.9.1=hd6dc26d_0 171 | - libiconv=1.17=h166bdaf_0 172 | - libjpeg-turbo=3.0.0=hd590300_1 173 | - liblapack=3.9.0=20_linux64_openblas 174 | - libllvm14=14.0.6=hcd5def8_4 175 | - libllvm15=15.0.7=hadd5161_1 176 | - libnghttp2=1.58.0=h47da74e_0 177 | - libnl=3.9.0=hd590300_0 178 | - libnsl=2.0.1=hd590300_0 179 | - libnuma=2.0.16=h0b41bf4_1 180 | - libopenblas=0.3.25=pthreads_h413a1c8_0 181 | - libparquet=14.0.2=h352af49_2_cpu 182 | - libpng=1.6.39=h753d276_0 183 | - libprotobuf=4.24.4=hf27288f_0 184 | - libre2-11=2023.06.02=h7a70373_0 185 | - libsanitizer=13.2.0=h7e041cc_3 186 | - libsodium=1.0.18=h36c2ea0_1 187 | - libsqlite=3.44.2=h2797004_0 188 | - libssh2=1.11.0=h0841786_0 189 | - libstdcxx-devel_linux-64=13.2.0=ha9c7c90_103 190 | - libstdcxx-ng=13.2.0=h7e041cc_3 191 | - libthrift=0.19.0=hb90f79a_1 192 | - libtiff=4.6.0=ha9c0a0a_2 193 | - libutf8proc=2.8.0=h166bdaf_0 194 | - libuuid=2.38.1=h0b41bf4_0 195 | - libwebp-base=1.3.2=hd590300_0 196 | - libxcb=1.15=h0b41bf4_0 197 | - libxml2=2.10.4=hf1b16e4_1 198 | - libzlib=1.2.13=hd590300_5 199 | - libzopfli=1.0.3=h9c3ff4c_0 200 | - locket=1.0.0=pyhd8ed1ab_0 201 | - lz4-c=1.9.4=hcb278e6_0 202 | - make=4.3=hd18ef5c_1 203 | - markupsafe=2.1.3=py39hd1e30aa_1 204 | - matplotlib-base=3.8.2=py39he9076e7_0 205 | - matplotlib-inline=0.1.6=pyhd8ed1ab_0 206 | - matplotlib-scalebar=0.8.1=pyhd8ed1ab_0 207 | - metis=5.1.0=h59595ed_1007 208 | - mistune=3.0.2=pyhd8ed1ab_0 209 | - mpfr=4.2.1=h9458935_0 210 | - msgpack-python=1.0.7=py39h7633fee_0 211 | - multidict=6.0.4=py39hd1e30aa_1 212 | - munkres=1.1.4=pyh9f0ad1d_0 213 | - natsort=8.4.0=pyhd8ed1ab_0 214 | - nb_conda_kernels=2.3.1=py39hf3d152e_2 215 | - nbclassic=1.0.0=pyh8b2e9e2_0 216 | - nbconvert-core=7.12.0=pyhd8ed1ab_0 217 | - nbformat=5.9.2=pyhd8ed1ab_0 218 | - ncurses=6.4=h59595ed_2 219 | - nest-asyncio=1.5.8=pyhd8ed1ab_0 220 | - networkx=3.2.1=pyhd8ed1ab_0 221 | - notebook=6.5.4=pyha770c72_0 222 | - notebook-shim=0.2.3=pyhd8ed1ab_0 223 | - numba=0.57.0=py39hb75a051_0 224 | - numcodecs=0.12.1=py39h3d6467e_0 225 | - numpy=1.23.5=py39h3d75532_0 226 | - omnipath=1.0.8=pyhd8ed1ab_0 227 | - openjpeg=2.5.0=h488ebb8_3 228 | - openssl=3.2.1=hd590300_0 229 | - orc=1.9.2=h4b38347_0 230 | - overrides=7.4.0=pyhd8ed1ab_0 231 | - packaging=23.2=pyhd8ed1ab_0 232 | - pandas=1.5.3=py39h2ad29b5_1 233 | - pandocfilters=1.5.0=pyhd8ed1ab_0 234 | - pango=1.50.14=ha41ecd1_2 235 | - parso=0.8.3=pyhd8ed1ab_0 236 | - patsy=0.5.4=pyhd8ed1ab_0 237 | - pcre2=10.42=hcad00b1_0 238 | - perl=5.32.1=4_hd590300_perl5 239 | - pexpect=4.8.0=pyh1a96a4e_2 240 | - pickleshare=0.7.5=py_1003 241 | - pillow=10.1.0=py39had0adad_0 242 | - pims=0.6.1=pyhd8ed1ab_1 243 | - pip=23.3.1=pyhd8ed1ab_0 244 | - pixman=0.42.2=h59595ed_0 245 | - pkg-config=0.29.2=h36c2ea0_1008 246 | - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 247 | - prometheus_client=0.19.0=pyhd8ed1ab_0 248 | - prompt-toolkit=3.0.41=pyha770c72_0 249 | - psutil=5.9.5=py39hd1e30aa_1 250 | - pthread-stubs=0.4=h36c2ea0_1001 251 | - ptyprocess=0.7.0=pyhd3deb0d_0 252 | - pure_eval=0.2.2=pyhd8ed1ab_0 253 | - pyarrow-hotfix=0.6=pyhd8ed1ab_0 254 | - pycparser=2.21=pyhd8ed1ab_0 255 | - pydantic=2.5.3=pyhd8ed1ab_0 256 | - pydantic-core=2.14.6=py39h9fdd4d6_1 257 | - pygments=2.17.2=pyhd8ed1ab_0 258 | - pynndescent=0.5.11=pyhca7485f_0 259 | - pyparsing=3.1.1=pyhd8ed1ab_0 260 | - pysocks=1.7.1=pyha2e5f31_6 261 | - python=3.9.16=h2782a2a_0_cpython 262 | - python-dateutil=2.8.2=pyhd8ed1ab_0 263 | - python-fastjsonschema=2.19.0=pyhd8ed1ab_0 264 | - python-igraph=0.10.4=py39hfac54ea_0 265 | - python-json-logger=2.0.7=pyhd8ed1ab_0 266 | - python_abi=3.9=4_cp39 267 | - pytz=2023.3.post1=pyhd8ed1ab_0 268 | - pywavelets=1.4.1=py39h44dd56e_1 269 | - pyyaml=6.0.1=py39hd1e30aa_1 270 | - pyzmq=25.1.2=py39h8c080ef_0 271 | - r-base=4.3.2=hb8ee39d_1 272 | - rav1e=0.6.6=he8a937b_2 273 | - rdma-core=49.0=hd3aeb46_2 274 | - re2=2023.06.02=h2873b5e_0 275 | - readline=8.2=h8228510_1 276 | - referencing=0.31.1=pyhd8ed1ab_0 277 | - requests=2.31.0=pyhd8ed1ab_0 278 | - rfc3339-validator=0.1.4=pyhd8ed1ab_0 279 | - rfc3986-validator=0.1.1=pyh9f0ad1d_0 280 | - rpds-py=0.13.2=py39h9fdd4d6_0 281 | - rpy2=3.5.11=py39r43h44dd56e_3 282 | - s2n=1.4.1=h06160fa_0 283 | - scanpy==1.10.1 284 | - scikit-image==0.22.0 285 | - scikit-learn==1.3.2 286 | - scipy==1.11.4 287 | - scvelo==0.3.2 288 | - scvi-tools==1.0.4 289 | - seaborn==0.13.2 290 | - seaborn-base=0.13.0=pyhd8ed1ab_0 291 | - sed=4.8=he412f7d_0 292 | - send2trash=1.8.2=pyh41d4057_0 293 | - session-info=1.0.0=pyhd8ed1ab_0 294 | - setuptools=68.2.2=pyhd8ed1ab_0 295 | - simplegeneric=0.8.1=py_1 296 | - six=1.16.0=pyh6c4a22f_0 297 | - slicerator=1.1.0=pyhd8ed1ab_0 298 | - snappy=1.1.10=h9fff704_0 299 | - sniffio=1.3.0=pyhd8ed1ab_0 300 | - sortedcontainers=2.4.0=pyhd8ed1ab_0 301 | - soupsieve=2.5=pyhd8ed1ab_1 302 | - squidpy=1.2.2=pyhd8ed1ab_0 303 | - stack_data=0.6.2=pyhd8ed1ab_0 304 | - statsmodels=0.14.0=py39h44dd56e_2 305 | - stdlib-list=0.8.0=pyhd8ed1ab_0 306 | - suitesparse=5.10.1=h9e50725_1 307 | - svt-av1=1.8.0=h59595ed_0 308 | - sysroot_linux-64=2.12=he073ed8_16 309 | - tangram-sc==1.0.4 310 | - tbb=2021.9.0=hf52228f_0 311 | - terminado=0.18.0=pyh0d859eb_0 312 | - texttable=1.7.0=pyhd8ed1ab_0 313 | - threadpoolctl=3.2.0=pyha21a80b_0 314 | - tifffile=2023.12.9=pyhd8ed1ab_0 315 | - tinycss2=1.2.1=pyhd8ed1ab_0 316 | - tk=8.6.13=noxft_h4845f30_101 317 | - tktable=2.10=h0c5db8f_5 318 | - tomli=2.0.1=pyhd8ed1ab_0 319 | - toolz=0.12.0=pyhd8ed1ab_0 320 | - tornado=6.3.3=py39hd1e30aa_1 321 | - tqdm=4.66.1=pyhd8ed1ab_0 322 | - traitlets=5.9.0=pyhd8ed1ab_0 323 | - types-python-dateutil=2.8.19.14=pyhd8ed1ab_0 324 | - typing-extensions=4.8.0=hd8ed1ab_0 325 | - typing_extensions=4.8.0=pyha770c72_0 326 | - typing_utils=0.1.0=pyhd8ed1ab_0 327 | - tzdata=2023c=h71feb2d_0 328 | - tzlocal=5.2=py39hf3d152e_0 329 | - ucx=1.15.0=h75e419f_3 330 | - umap-learn=0.5.5=py39hf3d152e_0 331 | - unicodedata2=15.1.0=py39hd1e30aa_0 332 | - uri-template=1.3.0=pyhd8ed1ab_0 333 | - urllib3=2.1.0=pyhd8ed1ab_0 334 | - validators=0.22.0=pyhd8ed1ab_0 335 | - wcwidth=0.2.12=pyhd8ed1ab_0 336 | - webcolors=1.13=pyhd8ed1ab_0 337 | - webencodings=0.5.1=pyhd8ed1ab_2 338 | - websocket-client=1.7.0=pyhd8ed1ab_0 339 | - wheel=0.42.0=pyhd8ed1ab_0 340 | - wrapt=1.16.0=py39hd1e30aa_0 341 | - xarray=2024.1.1=pyhd8ed1ab_0 342 | - xorg-kbproto=1.0.7=h7f98852_1002 343 | - xorg-libice=1.1.1=hd590300_0 344 | - xorg-libsm=1.2.4=h7391055_0 345 | - xorg-libx11=1.8.7=h8ee46fc_0 346 | - xorg-libxau=1.0.11=hd590300_0 347 | - xorg-libxdmcp=1.1.3=h7f98852_0 348 | - xorg-libxext=1.3.4=h0b41bf4_2 349 | - xorg-libxrender=0.9.11=hd590300_0 350 | - xorg-libxt=1.3.0=hd590300_1 351 | - xorg-renderproto=0.11.1=h7f98852_1002 352 | - xorg-xextproto=7.3.0=h0b41bf4_1003 353 | - xorg-xproto=7.0.31=h7f98852_1007 354 | - xz=5.4.5=h5eee18b_0 355 | - yaml=0.2.5=h7f98852_2 356 | - zarr=2.16.1=pyhd8ed1ab_0 357 | - zeromq=4.3.5=h59595ed_0 358 | - zfp=1.0.1=h59595ed_0 359 | - zict=3.0.0=pyhd8ed1ab_0 360 | - zipp=3.17.0=pyhd8ed1ab_0 361 | - zlib=1.2.13=hd590300_5 362 | - zlib-ng=2.0.7=h0b41bf4_0 363 | - zstd=1.5.5=hfc55251_0 364 | - pip: 365 | - accessible-pygments==0.0.4 366 | - adjusttext==0.8 367 | - aiohttp==3.8.4 368 | - alabaster==0.7.13 369 | - arboreto==0.1.6 370 | - arrow==1.2.3 371 | - asciitree==0.3.3 372 | - async-timeout==4.0.2 373 | - binaryornot==0.4.4 374 | - bioinfokit==2.1.0 375 | - blosc2==2.0.0 376 | - bokeh==3.1.0 377 | - boltons==23.0.0 378 | - cfgv==3.4.0 379 | - chardet==5.1.0 380 | - click==8.1.3 381 | - cloudpickle==2.2.1 382 | - cmake==3.26.3 383 | - cookiecutter==2.1.1 384 | - ctxcore==0.2.0 385 | - cython==0.29.34 386 | - cytoolz==0.12.1 387 | - dask==2023.4.0 388 | - dill==0.3.6 389 | - distlib==0.3.7 390 | - distributed==2023.4.0 391 | - docutils==0.17.1 392 | - et-xmlfile==1.1.0 393 | - exceptiongroup==1.1.3 394 | - fasteners==0.19 395 | - fcsparser==0.2.6 396 | - filelock==3.12.4 397 | - frozendict==2.3.7 398 | - frozenlist==1.3.3 399 | - fsspec==2023.4.0 400 | - get-annotations==0.1.2 401 | - greenlet==3.0.1 402 | - gtfparse==2.5.0 403 | - identify==2.5.30 404 | - imagesize==1.4.1 405 | - infercnvpy==0.4.5 406 | - iniconfig==2.0.0 407 | - interlap==0.2.7 408 | - jinja2-time==0.2.0 409 | - jupyter-cache==0.6.1 410 | - llvmlite==0.40.0 411 | - loompy==3.0.7 412 | - lz4==4.3.2 413 | - markdown-it-py==2.2.0 414 | - matplotlib-venn==0.11.9 415 | - mdit-py-plugins==0.3.5 416 | - mdurl==0.1.2 417 | - milopy==0.1.1 418 | - more-itertools==9.1.0 419 | - msgpack==1.0.5 420 | - multiprocessing-on-dill==3.5.0a4 421 | - myst-nb==0.17.2 422 | - myst-parser==0.18.1 423 | - nbclient==0.7.4 424 | - nbsphinx==0.9.3 425 | - nodeenv==1.8.0 426 | - numexpr==2.8.4 427 | - numpy-groupies==0.9.20 428 | - nxviz==0.6.3 429 | - openpyxl==3.1.2 430 | - palantir==1.2 431 | - palettable==3.3.3 432 | - partd==1.4.0 433 | - pbr==5.11.1 434 | - phenograph==1.5.7 435 | - platformdirs==3.11.0 436 | - pluggy==1.3.0 437 | - polars==0.20.31 438 | - pre-commit==3.5.0 439 | - profimp==0.1.0 440 | - progressbar2==4.2.0 441 | - py-cpuinfo==9.0.0 442 | - pyarrow==14.0.2 443 | - pydata-sphinx-theme==0.13.3 444 | - pygam==0.9.0 445 | - pypi-latest==0.1.2 446 | - pyreadr==0.5.0 447 | - pysam==0.21.0 448 | - pyscenic==0.12.1 449 | - pytest==7.4.3 450 | - pytest-mock==3.12.0 451 | - pytest-nunit==1.0.4 452 | - python-slugify==8.0.1 453 | - python-utils==3.5.2 454 | - pytoml==0.1.21 455 | - questionary==1.10.0 456 | - rich==13.3.5 457 | - sc-toolbox==0.12.1 458 | - scanpydoc==0.9.5 459 | - scvelo==0.2.5 460 | - setuptools-scm==8.0.4 461 | - snowballstemmer==2.2.0 462 | - sphinx==4.5.0 463 | - sphinx-autodoc-typehints==1.19.1 464 | - sphinx-book-theme==1.0.1 465 | - sphinx-copybutton==0.5.2 466 | - sphinx-design==0.4.1 467 | - sphinxcontrib-applehelp==1.0.4 468 | - sphinxcontrib-devhelp==1.0.2 469 | - sphinxcontrib-htmlhelp==2.0.1 470 | - sphinxcontrib-jsmath==1.0.1 471 | - sphinxcontrib-qthelp==1.0.3 472 | - sphinxcontrib-serializinghtml==1.1.5 473 | - sphinxext-opengraph==0.8.2 474 | - sqlalchemy==2.0.22 475 | - tables==3.8.0 476 | - tabulate==0.9.0 477 | - tblib==1.7.0 478 | - text-unidecode==1.3 479 | - textwrap3==0.9.2 480 | - velocyto==0.17.17 481 | - virtualenv==20.24.6 482 | - xyzservices==2023.2.0 483 | - yarl==1.9.2 484 | -------------------------------------------------------------------------------- /mapping_tumor_data/map_tink_to_ref.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "0606f7fd", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "#import scvi\n", 11 | "import scanpy as sc\n", 12 | "import pandas as pd\n", 13 | "import numpy as np" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 2, 19 | "id": "1aa95077", 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "import matplotlib.pyplot as plt" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 3, 29 | "id": "3fe5bd3d", 30 | "metadata": {}, 31 | "outputs": [], 32 | "source": [ 33 | "import anndata" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 4, 39 | "id": "ecb149bf", 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "import os" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 5, 49 | "id": "4c13c8c3", 50 | "metadata": {}, 51 | "outputs": [], 52 | "source": [ 53 | "import random" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 6, 59 | "id": "7fc2a272", 60 | "metadata": {}, 61 | "outputs": [], 62 | "source": [ 63 | "#from pyscenic.aucell import aucell\n", 64 | "#from pyscenic.genesig import GeneSignature\n", 65 | "#from pyscenic.aucell import create_rankings, enrichment" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 154, 71 | "id": "81b53796-af8f-42f6-87da-1d55ea93acda", 72 | "metadata": {}, 73 | "outputs": [], 74 | "source": [ 75 | "data_dir = ''" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "id": "54acaaf3", 81 | "metadata": {}, 82 | "source": [ 83 | "### Load data and reference model" 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": 108, 89 | "id": "d87c69e5-13b2-4e3c-971c-20ef158b8850", 90 | "metadata": {}, 91 | "outputs": [ 92 | { 93 | "name": "stderr", 94 | "output_type": "stream", 95 | "text": [ 96 | "/home/ubuntu/miniconda3/envs/scenic/lib/python3.9/site-packages/anndata/__init__.py:51: FutureWarning: `anndata.read` is deprecated, use `anndata.read_h5ad` instead. `ad.read` will be removed in mid 2024.\n", 97 | " warnings.warn(\n" 98 | ] 99 | } 100 | ], 101 | "source": [ 102 | "adata = sc.read(os.path.join(data_dir, 'zenodo', 'adata_ref_after_training.h5ad'))" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 137, 108 | "id": "ad8cb5cf-25c2-4fef-b962-d7a3611d9605", 109 | "metadata": {}, 110 | "outputs": [ 111 | { 112 | "name": "stderr", 113 | "output_type": "stream", 114 | "text": [ 115 | "/home/ubuntu/miniconda3/envs/scenic/lib/python3.9/site-packages/anndata/__init__.py:51: FutureWarning: `anndata.read` is deprecated, use `anndata.read_h5ad` instead. `ad.read` will be removed in mid 2024.\n", 116 | " warnings.warn(\n" 117 | ] 118 | } 119 | ], 120 | "source": [ 121 | "adata_query = sc.read(os.path.join(data_dir, 'zenodo', 'adata_nk_tumor_query.h5ad'))" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 111, 127 | "id": "f71acd40", 128 | "metadata": {}, 129 | "outputs": [], 130 | "source": [ 131 | "scvi_model = scvi.model.SCVI.load(os.path.join(data_dir, 'zenodo', 'nk_ref_scvi_model'), adata=adata)" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": null, 137 | "id": "a224fd9d", 138 | "metadata": {}, 139 | "outputs": [], 140 | "source": [] 141 | }, 142 | { 143 | "cell_type": "markdown", 144 | "id": "3747fbab", 145 | "metadata": {}, 146 | "source": [ 147 | "#### Map query scvi model" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": null, 153 | "id": "fac6079b", 154 | "metadata": {}, 155 | "outputs": [ 156 | { 157 | "name": "stdout", 158 | "output_type": "stream", 159 | "text": [ 160 | "\u001b[34mINFO \u001b[0m Found \u001b[1;36m97.47352972009644\u001b[0m% reference vars in query data. \n" 161 | ] 162 | }, 163 | { 164 | "name": "stderr", 165 | "output_type": "stream", 166 | "text": [ 167 | "/itf-fi-ml/home/hermankn/.local/lib/python3.8/site-packages/scvi/model/base/_archesmixin.py:211: FutureWarning: X.dtype being converted to np.float32 from float64. In the next version of anndata (0.9) conversion will not be automatic. Pass dtype explicitly to avoid this warning. Pass `AnnData(X, dtype=X.dtype, ...)` to get the future behavour.\n", 168 | " adata_padding = AnnData(\n" 169 | ] 170 | } 171 | ], 172 | "source": [ 173 | "scvi.model.SCVI.prepare_query_anndata(adata_query, scvi_model)" 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": null, 179 | "id": "df180371", 180 | "metadata": {}, 181 | "outputs": [], 182 | "source": [ 183 | "query_model = scvi.model.SCVI.load_query_data(adata_query, scvi_model)" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": null, 189 | "id": "d60338ff", 190 | "metadata": {}, 191 | "outputs": [], 192 | "source": [ 193 | "query_model.train(max_epochs=100, plan_kwargs=dict(weight_decay=0.0))" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 102, 199 | "id": "d1c2a0f7", 200 | "metadata": {}, 201 | "outputs": [ 202 | { 203 | "data": { 204 | "text/html": [ 205 | "
SCVI Model with the following params: \n",
206 |        "n_hidden: 128, n_latent: 40, n_layers: 2, dropout_rate: 0.1, dispersion: gene, gene_likelihood: nb, \n",
207 |        "latent_distribution: normal\n",
208 |        "Training status: Not Trained\n",
209 |        "Model's adata is minified?: False\n",
210 |        "
\n" 211 | ], 212 | "text/plain": [ 213 | "SCVI Model with the following params: \n", 214 | "n_hidden: \u001b[1;36m128\u001b[0m, n_latent: \u001b[1;36m40\u001b[0m, n_layers: \u001b[1;36m2\u001b[0m, dropout_rate: \u001b[1;36m0.1\u001b[0m, dispersion: gene, gene_likelihood: nb, \n", 215 | "latent_distribution: normal\n", 216 | "Training status: Not Trained\n", 217 | "Model's adata is minified?: \u001b[3;91mFalse\u001b[0m\n" 218 | ] 219 | }, 220 | "metadata": {}, 221 | "output_type": "display_data" 222 | }, 223 | { 224 | "data": { 225 | "text/plain": [] 226 | }, 227 | "execution_count": 102, 228 | "metadata": {}, 229 | "output_type": "execute_result" 230 | } 231 | ], 232 | "source": [ 233 | "query_model" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": null, 239 | "id": "68d1cc3c", 240 | "metadata": {}, 241 | "outputs": [], 242 | "source": [ 243 | "plt.plot(query_model.history[\"elbo_train\"], label=\"train\")\n", 244 | "#plt.plot(vae.history[\"elbo_validation\"], label=\"val\")\n", 245 | "plt.title(\"Negative ELBO over training epochs\")\n", 246 | "#plt.ylim(1100, 1500)\n", 247 | "plt.legend()" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 171, 253 | "id": "548a95a8", 254 | "metadata": {}, 255 | "outputs": [], 256 | "source": [ 257 | "adata_query.obsm['X_scVI'] = query_model.get_latent_representation()" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 172, 263 | "id": "99302dc6", 264 | "metadata": {}, 265 | "outputs": [ 266 | { 267 | "name": "stderr", 268 | "output_type": "stream", 269 | "text": [ 270 | "/itf-fi-ml/home/hermankn/.local/lib/python3.8/site-packages/anndata/_core/anndata.py:1828: UserWarning: Observation names are not unique. To make them unique, call `.obs_names_make_unique`.\n", 271 | " utils.warn_names_duplicates(\"obs\")\n" 272 | ] 273 | } 274 | ], 275 | "source": [ 276 | "adata_full = anndata.concat([adata, adata_query])" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 174, 282 | "id": "f9cdc741", 283 | "metadata": {}, 284 | "outputs": [], 285 | "source": [ 286 | "sc.pp.neighbors(adata_full, use_rep='X_scVI')\n", 287 | "sc.tl.umap(adata_full)" 288 | ] 289 | }, 290 | { 291 | "cell_type": "code", 292 | "execution_count": null, 293 | "id": "a2cb855f-d3fa-4406-833d-de6e7aedf9c2", 294 | "metadata": {}, 295 | "outputs": [], 296 | "source": [] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": null, 301 | "id": "71f2009f-8fd2-4536-b9c8-153729e34b89", 302 | "metadata": {}, 303 | "outputs": [], 304 | "source": [ 305 | "adata_full = sc.read(os.path.join(data_dir, 'zenodo_revision', 'adata_all_nk_after_mapping.h5ad'))" 306 | ] 307 | }, 308 | { 309 | "cell_type": "code", 310 | "execution_count": null, 311 | "id": "47e7ecbb-c0a7-49d4-9913-c6ee9b973de7", 312 | "metadata": {}, 313 | "outputs": [], 314 | "source": [] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": null, 319 | "id": "1312a4e2-5158-49de-a40c-cc27d629973e", 320 | "metadata": {}, 321 | "outputs": [], 322 | "source": [] 323 | } 324 | ], 325 | "metadata": { 326 | "kernelspec": { 327 | "display_name": "Python 3 (ipykernel)", 328 | "language": "python", 329 | "name": "python3" 330 | }, 331 | "language_info": { 332 | "codemirror_mode": { 333 | "name": "ipython", 334 | "version": 3 335 | }, 336 | "file_extension": ".py", 337 | "mimetype": "text/x-python", 338 | "name": "python", 339 | "nbconvert_exporter": "python", 340 | "pygments_lexer": "ipython3", 341 | "version": "3.9.16" 342 | } 343 | }, 344 | "nbformat": 4, 345 | "nbformat_minor": 5 346 | } 347 | -------------------------------------------------------------------------------- /nk_reference/normal_reference_nk.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "#import scvi\n", 10 | "import scanpy as sc\n", 11 | "import pandas as pd\n", 12 | "import numpy as np" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 2, 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "import matplotlib.pyplot as plt" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 3, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "import anndata" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 4, 36 | "metadata": {}, 37 | "outputs": [], 38 | "source": [ 39 | "import os" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 5, 45 | "metadata": {}, 46 | "outputs": [], 47 | "source": [ 48 | "import random" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 6, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "#from pyscenic.aucell import aucell\n", 58 | "#from pyscenic.genesig import GeneSignature\n", 59 | "#from pyscenic.aucell import create_rankings, enrichment" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 6, 65 | "metadata": {}, 66 | "outputs": [], 67 | "source": [ 68 | "data_dir = ''" 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": {}, 74 | "source": [ 75 | "#### Load data" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 7, 81 | "metadata": {}, 82 | "outputs": [ 83 | { 84 | "name": "stderr", 85 | "output_type": "stream", 86 | "text": [ 87 | "/home/ubuntu/miniconda3/envs/scenic/lib/python3.9/site-packages/anndata/__init__.py:51: FutureWarning: `anndata.read` is deprecated, use `anndata.read_h5ad` instead. `ad.read` will be removed in mid 2024.\n", 88 | " warnings.warn(\n" 89 | ] 90 | } 91 | ], 92 | "source": [ 93 | "adata_ref = sc.read(os.path.join(data_dir, 'zenodo', 'adata_ref_nk.h5ad'))" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": null, 99 | "metadata": {}, 100 | "outputs": [], 101 | "source": [] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "#### Train scVI model" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 56, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "name": "stderr", 117 | "output_type": "stream", 118 | "text": [ 119 | "/itf-fi-ml/home/hermankn/.local/lib/python3.8/site-packages/scvi/data/fields/_layer_field.py:91: UserWarning: adata.X does not contain unnormalized count data. Are you sure this is what you want?\n", 120 | " warnings.warn(\n" 121 | ] 122 | } 123 | ], 124 | "source": [ 125 | "scvi.model.SCVI.setup_anndata(adata,\n", 126 | " batch_key='batch')" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 57, 132 | "metadata": {}, 133 | "outputs": [], 134 | "source": [ 135 | "scvi_model = scvi.model.SCVI(adata,\n", 136 | " n_latent=20,#n_latent=40,\n", 137 | " n_layers=2,\n", 138 | " gene_likelihood = \"nb\")" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 58, 144 | "metadata": {}, 145 | "outputs": [ 146 | { 147 | "name": "stderr", 148 | "output_type": "stream", 149 | "text": [ 150 | "GPU available: True (cuda), used: True\n", 151 | "TPU available: False, using: 0 TPU cores\n", 152 | "IPU available: False, using: 0 IPUs\n", 153 | "HPU available: False, using: 0 HPUs\n", 154 | "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1,2,3]\n" 155 | ] 156 | }, 157 | { 158 | "name": "stdout", 159 | "output_type": "stream", 160 | "text": [ 161 | "Epoch 158/158: 100%|██████████| 158/158 [20:49<00:00, 8.29s/it, loss=2.52e+03, v_num=1]" 162 | ] 163 | }, 164 | { 165 | "name": "stderr", 166 | "output_type": "stream", 167 | "text": [ 168 | "`Trainer.fit` stopped: `max_epochs=158` reached.\n" 169 | ] 170 | }, 171 | { 172 | "name": "stdout", 173 | "output_type": "stream", 174 | "text": [ 175 | "Epoch 158/158: 100%|██████████| 158/158 [20:49<00:00, 7.91s/it, loss=2.52e+03, v_num=1]\n" 176 | ] 177 | } 178 | ], 179 | "source": [ 180 | "scvi_model.train()" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 59, 186 | "metadata": {}, 187 | "outputs": [ 188 | { 189 | "data": { 190 | "text/plain": [ 191 | "" 192 | ] 193 | }, 194 | "execution_count": 59, 195 | "metadata": {}, 196 | "output_type": "execute_result" 197 | }, 198 | { 199 | "data": { 200 | "image/png": "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\n", 201 | "text/plain": [ 202 | "
" 203 | ] 204 | }, 205 | "metadata": { 206 | "needs_background": "light" 207 | }, 208 | "output_type": "display_data" 209 | } 210 | ], 211 | "source": [ 212 | "plt.plot(scvi_model.history[\"elbo_train\"], label=\"train\")\n", 213 | "#plt.plot(vae.history[\"elbo_validation\"], label=\"val\")\n", 214 | "plt.title(\"Negative ELBO over training epochs\")\n", 215 | "#plt.ylim(1100, 1500)\n", 216 | "plt.legend()" 217 | ] 218 | }, 219 | { 220 | "cell_type": "code", 221 | "execution_count": 65, 222 | "metadata": {}, 223 | "outputs": [ 224 | { 225 | "data": { 226 | "text/plain": [ 227 | "" 228 | ] 229 | }, 230 | "execution_count": 65, 231 | "metadata": {}, 232 | "output_type": "execute_result" 233 | }, 234 | { 235 | "data": { 236 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEICAYAAACzliQjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAsxElEQVR4nO3de3xdZZ3v8c83O3vn0qZN0qZt2qSkQCkCA4WWm4ACI1pAhdFzAI8izKiMjHjAQecAcxEdnaOMg4KjMih1dOSmglAZkFMcijJKoS0FWkrpFZrSS3pJmzb35Hf+WE/SlZA0OyXNTvb+vV+v/craz7PW2r+1dvZvrfU8z15bZoZzzrnckJfpAJxzzg0fT/rOOZdDPOk751wO8aTvnHM5xJO+c87lEE/6zjmXQzzpu35JekLSVZmOw/VvMO9RNr2fkm6V9LNMxzEaedIfQSRtlLRd0phY2aclLRqG137bh8jMLjSznxyG1zJJ+yXtiz3+pr84YsttlNQU5t8t6T8lVfea52pJr0hqlLRV0g8klQ71NgyFsB+OfifrGMx7dLjeTze6eNIfeRLA9ZkOYhicZGZjY4/b0lzuQ2Y2FqgEtgHf7aqQdCPwTeBLwHjgDOAIYKGk1NCGnz5J+cO5nHMH40l/5Pln4Iv9nZ1KOlbSQkm7JK2WdFmsboKkX0vaK+kFSV+T9Gys/g5Jm0L9UknnhPJ5wC3A5eEs+qVQvihcaRRIqpd0QmxdFeGse1J4/kFJy8N8f5B04uHYOV3MrBn4JXBceP1xwFeAz5vZb8yszcw2ApcBNcAn+lqPpPGSfiqpTtIbkv5OUt473eZwVfJ/JL0M7O+dwCX9Lky+FPb55ZLOlVQbltsK/FhSmaTHQny7w3RVbD2LJH06TF8t6VlJ3wrzbpB04SHOO0PS7yQ1SHpK0vcO1pySxr64WdKr4bV+LKkwVv8ZSWvD//QCSVNjdcfH/t+3Sbol9rKp8N41SFopaW5suf8jaXOoWy3pT/uLPdd40h95lgCLgC/2rlDU7LMQuA+YBFwBfF/ScWGW7wH7gSnAVeER9wIwGygP6/iFpEIz+w3wT8CD4az7pPhCZtYCPAx8LFZ8GfCMmW2XdDIwH/hLYALwb8ACSQWHsgPSIakYuBx4LhS9GygMccZj3wc8DlzQz6q+S3RVcCTwXuCTwJ8P0TZ/DLgYKDWz9l5xvSdMdl3xPBieTyF6f44AriH6jP44PJ8ONAH/2v+e4XRgNTARuA24R5IOYd77gOfDtt0KXNnfC6a5Lz4OfAA4CjgG+Luw7PnA/yXat5XAG8ADoa4EeAr4DTAVOBr4bWydHw7zlgILCPtF0izgOuBUMysJr7uxv/hzjpn5Y4Q8iP4x3wecAOwBKoBPA4tC/eXA73st82/Al4mahdqAWbG6rwHPHuT1dhMlHYg+2D/rVb8I+HSYfh+wLlb338Anw/QPgH/stexq4L39vK4Be4H62OMD/cXRa//sC/O3AW8BfxLqPgFs7We5bwAL+yhPAK3AcbGyv4zt70Pe5hDrXwzwfhtwdOz5uSGewoMsMxvY3c97dDWwNlZXHF5jymDmJTq4tAPFsfqfHeR9SWdffDZWd1HXfgXuAW6L1Y0N720N0UHzxX5e81bgqdjz44CmMH00sD28f8mh/pyO9oef6Y9AZrYCeAy4qVfVEcDp4RK6XlI90RnUFKIDRD6wKTZ/fBpJX5S0StKesOx4orO8dDwNFEs6XVINUfL5VSyuG3vFVU10dtafU8ysNPZ4Ms04LjWzUqKz+uuAZyRNAXYAE3s3owSVob63iUCS6OyyyxvAtDD9Tre5x/5PU51FTVdAdEUj6d9C09Ne4HdAqaREP8tv7Zows8YwOXaQ804FdsXK4ODbMth98Uasbiqx/W/RldlOovegGlh3kNfdGptuBAol5ZvZWuAGogPDdkkPxJuMcp0n/ZHry8BnOJCAIPrgPNMrWY41s2uBOqKzs6rY/N0jWxS13/8N0WV0WUice4Cuy/mD3m7VzDqAnxOdfX0MeMzMGmJxfb1XXMVmdv8hbXkazKzDzB4GOoCzgT8CLcBH4vNJGgtcSM9mgS47iM4qj4iVTQc2d70G72ybD+UWtr2XuRGYBZxuZuOArmah/ppshsIWoDw0oXWp7m9m0tsX8eWnE12lEf527//QhDmB6D3YRNTsNmhmdp+ZnR3WbUQd/A5P+iNWOFt5EPjfseLHgGMkXSkpGR6nSnpXSFAPA7eGs8Njidqnu5QQHRTqgHxJ/wCMi9VvA2okHex/4j6iJqaPh+kuPwQ+G86IJWmMpItDm+yhyJNUGHu8rW8gvM4lQBmwysz2EHXkflfSvLBvaoiSdi3wH73XEUvqX5dUIukI4K+JmjKGY5u3MXBSKyFqx6+XVE50MnBYmdkbRH1Lt0pKSToT+NBBFklnX3xOUlXYhr8l+t8GuB/4c0mzw/v8T8BiizrhHwMqJd2gqGO9RNLpA8UvaZak88P6mon2X+fg9kL28qQ/sn0V6B6zH84y30/UgfsW0eXtN4GupHgdUZPNVqIkdz/R2S/Ak0QdYq8TXU430/OS+xfh705Jy/oKxswWE3UUTwWeiJUvIboq+VeifoK1RG3GB/OSeo7T/06s7mNEH9SuR/wS/9eS9hH1CXwduMrMVoY4biMahfStUL84bOOfWtQx25fPh21aDzxLlNjnH6Zt7u1W4CehSeSyfub5DlBEdFXyHNF7OBw+DpxJ1NTyNaIk3ec+THNf3Af8P6L9vC6sEzN7Cvh74CGiK4yjiP6/u/7fLyA64GwF1gDnpRF7AVE/zo6w3CTg5jSWywky8x9RyVaSvknUiZcV38J0mSPpQeA1Mxv0lYakjUQdyE8NeWBu0PxMP4soGsN/YrjEPg34FAc6Hp1LW2g2PErRdxbmAZcAj2Q4LDcE/Bt/2aWEqElnKlF78b8Aj2Y0IjdaTSHqI5pA1CdyrZm9mNmQ3FDw5h3nnMsh3rzjnHM5ZMQ370ycONFqamoyHYZzzo0aS5cu3WFmFX3VjfikX1NTw5IlSzIdhnPOjRqS3uivzpt3nHMuh3jSd865HOJJ3znncsiIb9N3zrnBamtro7a2lubm5oFnHsUKCwupqqoimUymvYwnfedc1qmtraWkpISamhrU72/IjG5mxs6dO6mtrWXGjBlpL+fNO865rNPc3MyECROyNuEDSGLChAmDvprxpO+cy0rZnPC7HMo2Zm3Sv/O3a3jm9bpMh+GccyNK1ib9u55Zx+896TvnMqC+vp7vf//7g17uoosuor6+fugDisnapJ/Kz6O1w38sxzk3/PpL+u3t7Qdd7vHHH6e0tPQwRRXJ2tE7yUQebZ70nXMZcNNNN7Fu3Tpmz55NMpmksLCQsrIyXnvtNV5//XUuvfRSNm3aRHNzM9dffz3XXHMNcOC2M/v27ePCCy/k7LPP5g9/+APTpk3j0Ucfpaio6B3HlrVJP5XIo6Xdk75zue4rv17Jq2/tHdJ1Hjd1HF/+0PH91n/jG99gxYoVLF++nEWLFnHxxRezYsWK7qGV8+fPp7y8nKamJk499VQ++tGPMmHChB7rWLNmDffffz8//OEPueyyy3jooYf4xCc+8Y5jz9qkX5CfR6snfefcCHDaaaf1GEt/55138qtfRT9qt2nTJtasWfO2pD9jxgxmz54NwJw5c9i4ceOQxJK1ST/lSd85Bwc9Ix8uY8aM6Z5etGgRTz31FH/84x8pLi7m3HPP7XOsfUFBQfd0IpGgqalpSGLxjlznnBtiJSUlNDQ09Fm3Z88eysrKKC4u5rXXXuO5554b1tiy9kzfO3Kdc5kyYcIEzjrrLE444QSKioqYPHlyd928efO46667eNe73sWsWbM444wzhjW2AZO+pGrgp8BkwIC7zewOSbOBu4BCoB34KzN7XtK5RD/GvSGs4mEz+2pY1zzgDiAB/MjMvjGkWxOTSnjzjnMuc+67774+ywsKCnjiiSf6rOtqt584cSIrVqzoLv/iF784ZHGlc6bfDtxoZssklQBLJS0EbgO+YmZPSLooPD83LPN7M/tgfCWSEsD3gAuAWuAFSQvM7NUh2pYeUvl5NDYefEysc87lmgHb9M1si5ktC9MNwCpgGtFZ/7gw23jgrQFWdRqw1szWm1kr8ABwyaEGPpBUvg/ZdM653gbVpi+pBjgZWAzcADwp6VtEB493x2Y9U9JLRAeCL5rZSqIDxabYPLXA6f28zjXANQDTp08fTIjdUgnvyHUul5lZ1t90zcwGvUzao3ckjQUeAm4ws73AtcAXzKwa+AJwT5h1GXCEmZ0EfBd4ZLBBmdndZjbXzOZWVPT5g+4DSuV7R65zuaqwsJCdO3ceUlIcLbrup19YWDio5dI605eUJEr495rZw6H4KuD6MP0L4EchkO6vvpnZ45K+L2kisBmojq22KpQdFt6R61zuqqqqora2lrq67L7pYtcvZw1GOqN3RHQWv8rMbo9VvQW8F1gEnA+sCfNPAbaZmUk6jehqYidQD8yUNIMo2V8B/K9BRTsI/uUs53JXMpkc1K9J5ZJ0zvTPAq4EXpG0PJTdAnwGuENSPtBMaIMH/gdwraR2oAm4wqJrrHZJ1wFPEg3ZnB/a+g8LT/rOOfd2AyZ9M3sW6K83ZE4f8/8r8K/9rOtx4PHBBHiokt6R65xzb5PVt2Fo67Cs7shxzrnBytqkX5AfbZqf7Tvn3AFZm/RTiZD0vV3fOee6ZW/Sz/ek75xzvWVt0k+GM/22Dm/Td865Llmb9P1M3znn3i77k35HR4Yjcc65kSN7k35o3vE7bTrn3AHZm/Tzo++TefOOc84dkL1JP5EAvCPXOefisjfpe0euc869TfYnfe/Idc65btmb9P0buc459zbZm/RDR66P3nHOuQOyN+l7R65zzr1N9iZ978h1zrm3yYGk7x25zjnXJfuTvt9P3znnumVt0k8m/Bu5zjnXW9Ym/e4hm96R65xz3QZM+pKqJT0t6VVJKyVdH8pnS3pO0nJJSySdFsol6U5JayW9LOmU2LqukrQmPK46fJsFkkgl8vxM3znnYvLTmKcduNHMlkkqAZZKWgjcBnzFzJ6QdFF4fi5wITAzPE4HfgCcLqkc+DIwF7CwngVmtnuoN6pLKt+TvnPOxQ14pm9mW8xsWZhuAFYB04gS97gw23jgrTB9CfBTizwHlEqqBD4ALDSzXSHRLwTmDenW9JJMyG/D4JxzMemc6XeTVAOcDCwGbgCelPQtooPHu8Ns04BNscVqQ1l/5X29zjXANQDTp08fTIg9pPLzaGv3Nn3nnOuSdkeupLHAQ8ANZrYXuBb4gplVA18A7hmqoMzsbjOba2ZzKyoqDnk9qfw8H7LpnHMxaSV9SUmihH+vmT0ciq8CuqZ/AZwWpjcD1bHFq0JZf+WHjXfkOudcT+mM3hHRWfwqM7s9VvUW8N4wfT6wJkwvAD4ZRvGcAewxsy3Ak8D7JZVJKgPeH8oOm1R+wm+45pxzMem06Z8FXAm8Iml5KLsF+Axwh6R8oJnQBg88DlwErAUagT8HMLNdkv4ReCHM91Uz2zUUG9GfVELevOOcczEDJn0zexZQP9Vz+pjfgM/1s675wPzBBPhORB25nvSdc65L1n4jF7wj1znnesvupO8duc4510N2J33/Rq5zzvWQ1Uk/mfDmHeeci8vqpO9n+s4511NWJ/0C78h1zrkesjrpe0euc871lNVJP+lJ3znnesjqpO/j9J1zrqesT/odnUZHp99e2TnnIAeSPkCbn+075xyQ7Uk//Di632nTOeci2Z30w5m+d+Y651wku5N+wpt3nHMuLruTvp/pO+dcD7mR9P1M3znngGxP+gk/03fOubisTvrJfB+945xzcVmd9Au8I9c553rI6qTvHbnOOdeTJ33nnMshAyZ9SdWSnpb0qqSVkq4P5Q9KWh4eGyUtD+U1kppidXfF1jVH0iuS1kq6U5IO25YR3WUTfPSOc851yU9jnnbgRjNbJqkEWCppoZld3jWDpH8B9sSWWWdms/tY1w+AzwCLgceBecAThxr8QPxM3znnehrwTN/MtpjZsjDdAKwCpnXVh7P1y4D7D7YeSZXAODN7zswM+Clw6aGHPrCUn+k751wPg2rTl1QDnEx0pt7lHGCbma2Jlc2Q9KKkZySdE8qmAbWxeWqJHTx6vc41kpZIWlJXVzeYEHso8DN955zrIe2kL2ks8BBwg5ntjVV9jJ5n+VuA6WZ2MvDXwH2Sxg0mKDO728zmmtncioqKwSzagzfvOOdcT+m06SMpSZTw7zWzh2Pl+cBHgDldZWbWArSE6aWS1gHHAJuBqthqq0LZYeMduc4511M6o3cE3AOsMrPbe1W/D3jNzGpj81dISoTpI4GZwHoz2wLslXRGWOcngUeHaDv6VJhMkCfY19x+OF/GOedGjXSad84CrgTOjw3DvCjUXcHbO3DfA7wchnD+Evisme0KdX8F/AhYC6zjMI7cAUjkiamlRdTubjycL+Occ6PGgM07ZvYs0Od4ejO7uo+yh4iagvqafwlwwuBCfGemlxfz5i5P+s45B1n+jVyA6rJi3tzVlOkwnHNuRMj6pD99QjE79rXQ2Ort+s45l/VJv7q8GIDa3X6275xz2Z/0y4oAeHOnt+s751zWJ/3p4UzfO3Odcy4Hkn75mBRjUgk2+bBN55zL/qQvieryYjb5mb5zzmV/0oeoM9ebd5xzLkeS/vTyYjbtaiK6o7NzzuWunEn6TW0d7NjXmulQnHMuo3Ii6VeXh2Gb3sTjnMtxOZH0u4Ztemeucy7X5UTSryrzpO+cc5AjSb8wmWBSSYE37zjncl5OJH3wWyw75xzkWNL35h3nXK7LmaRfVV7Mlr3N/iPpzrmcljNJf3p5MWawud5vseycy105lfTBx+o753JbziV9b9d3zuWynEn6k0oKSOXnedJ3zuW0AZO+pGpJT0t6VdJKSdeH8gclLQ+PjZKWx5a5WdJaSaslfSBWPi+UrZV002HZon7k5YmqsiJv3nHO5bT8NOZpB240s2WSSoClkhaa2eVdM0j6F2BPmD4OuAI4HpgKPCXpmDDr94ALgFrgBUkLzOzVoducg/Ox+s65XDfgmb6ZbTGzZWG6AVgFTOuqlyTgMuD+UHQJ8ICZtZjZBmAtcFp4rDWz9WbWCjwQ5h021WU+Vt85l9sG1aYvqQY4GVgcKz4H2GZma8LzacCmWH1tKOuvvK/XuUbSEklL6urqBhPiQU0vL2Zvczt7GtuGbJ3OOTeapJ30JY0FHgJuMLO9saqPceAsf0iY2d1mNtfM5lZUVAzZeqt92KZzLsellfQlJYkS/r1m9nCsPB/4CPBgbPbNQHXseVUo66982HQN23xj1/7hfFnnnBsx0hm9I+AeYJWZ3d6r+n3Aa2ZWGytbAFwhqUDSDGAm8DzwAjBT0gxJKaLO3gVDsRHpmjFxDBKs2bZvOF/WOedGjHRG75wFXAm8EhuWeYuZPU6UuHs07ZjZSkk/B14lGvnzOTPrAJB0HfAkkADmm9nKIdmKNBWlEtRMGMPqrQ3D+bLOOTdiDJj0zexZQP3UXd1P+deBr/dR/jjw+OBCHFqzJpewepsnfedcbsqZb+R2mTWlhI0799PU2pHpUJxzbtjlXNI/dkoJZrBmu5/tO+dyT84l/VlTSgB4zdv1nXM5KOeS/hETxlCYzPPOXOdcTsq5pJ/IEzMnlXjSd87lpJxL+hA18XjzjnMuF+Vk0j92Sgk79rWwc19LpkNxzrlhlZNJ3ztznXO5KieT/glTxwOwfFN9ZgNxzrlhlpNJv2xMiiMrxrDsjd2ZDsU554ZVTiZ9gDnTy1j25m7MLNOhOOfcsMnZpH/KEWXsbmxjww6/zbJzLnfkbNKfc0QZAMverM9sIM45N4xyNukfXTGWksJ8lnq7vnMuh+Rs0s/LEydPL+PFNz3pO+dyR84mfYBTppeyelsDe5v9h9Kdc7khp5P+3CPKMYMlG3dlOhTnnBsWuZ30a8ooTObxzOq6TIfinHPDIqeTfmEywVlHTeTp1XU+Xt85lxNyOukDnDurgjd3NbLex+s753LAgElfUrWkpyW9KmmlpOtjdZ+X9Foovy2U1UhqkrQ8PO6KzT9H0iuS1kq6U1KfP7g+nM6dNQmARd7E45zLAflpzNMO3GhmyySVAEslLQQmA5cAJ5lZi6RJsWXWmdnsPtb1A+AzwGLgcWAe8MQ72YB3qrq8mKMnjWXR6u186uwZmQzFOecOuwHP9M1si5ktC9MNwCpgGnAt8A0zawl12w+2HkmVwDgze86iBvSfApe+s/CHxnmzKli8fhf7W9ozHYpzzh1Wg2rTl1QDnEx0pn4McI6kxZKekXRqbNYZkl4M5eeEsmlAbWye2lDW1+tcI2mJpCV1dYe/2eX8YyfT2tHpTTzOuayXdtKXNBZ4CLjBzPYSNQ2VA2cAXwJ+HtrotwDTzexk4K+B+ySNG0xQZna3mc01s7kVFRWDWfSQnDajnIqSAn790luH/bWccy6T0kr6kpJECf9eM3s4FNcCD1vkeaATmGhmLWa2E8DMlgLriK4KNgNVsdVWhbKMS+SJi/+kkv9avZ0G/3aucy6LpTN6R8A9wCozuz1W9QhwXpjnGCAF7JBUISkRyo8EZgLrzWwLsFfSGWGdnwQeHcqNeSc+dFIlre2dPLVqW6ZDcc65wyadM/2zgCuB82PDMC8C5gNHSloBPABcFTpo3wO8LGk58Evgs2bWdZ+DvwJ+BKwlugLI6MiduJOry5hWWsSvX9qS6VCcc+6wGXDIppk9C/Q3nv4Tfcz/EFFTUF/rWgKcMJgAh0tenrj4xErmP7uBXftbKR+TynRIzjk35HL+G7lxHz2livZO46GltQPP7Jxzo5An/ZhZU0qYe0QZ9z3/Jp2dfi8e51z28aTfy8fPmM6GHfv54/qdmQ7FOeeGnCf9Xi48oZLS4iT3Ln4j06E459yQ86TfS2Eywf+cU8X/W7mNzfVNmQ7HOeeGlCf9Plx9VnTjtbufWZfhSJxzbmh50u/DtNIiPnLKNB54YRN1DS2ZDsc554aMJ/1+XHvu0bR1dPKjZ9dnOhTnnBsynvT7MWPiGC4+cSo/++Mb1De2Zjoc55wbEp70D+Jz5x3F/tYOfvzfGzMdinPODQlP+gdx7JRxXHDcZP79DxvZ5z+w4pzLAp70B3DdeUezp6mNnz3n4/adc6OfJ/0BnFRdyjkzJ/LD3633e+0750Y9T/pp+NIHZrFzfyvfe9rH7TvnRjdP+mk4saqUj55SxfxnN/DmzsZMh+Occ4fMk36a/mbeLBJ54p8eX5XpUJxz7pB50k/T5HGFXHf+0fxm5VaeXr090+E459wh8aQ/CJ8+ZwZHVYzh7x9ZQVNrR6bDcc65QfOkPwgF+Qm+dumfULu7iTt+uybT4Tjn3KB50h+kM4+awP+cU8Xdv1vH0jd2DbyAc86NIJ70D8E/fOg4ppUVcf0Dy33svnNuVBkw6UuqlvS0pFclrZR0fazu85JeC+W3xcpvlrRW0mpJH4iVzwtlayXdNPSbMzxKCpN85/LZbNnTzD88ujLT4TjnXNry05inHbjRzJZJKgGWSloITAYuAU4ysxZJkwAkHQdcARwPTAWeknRMWNf3gAuAWuAFSQvM7NWh3aThMeeIcj5//tF856k1nDurgktmT8t0SM45N6ABz/TNbIuZLQvTDcAqYBpwLfANM2sJdV3jGC8BHjCzFjPbAKwFTguPtWa23sxagQfCvKPWdecdzZwjyvi7X61g0y7/0pZzbuQbVJu+pBrgZGAxcAxwjqTFkp6RdGqYbRqwKbZYbSjrr7yv17lG0hJJS+rq6gYT4rDKT+TxnctnY8B19y2jsdXvxOmcG9nSTvqSxgIPATeY2V6ipqFy4AzgS8DPJWkogjKzu81srpnNraioGIpVHjbV5cV8+/LZvLJ5D//7/uV0dFqmQ3LOuX6llfQlJYkS/r1m9nAorgUetsjzQCcwEdgMVMcWrwpl/ZWPehccN5kvf+h4nlq1ja/+eiVmnvidcyNTOqN3BNwDrDKz22NVjwDnhXmOAVLADmABcIWkAkkzgJnA88ALwExJMySliDp7FwzhtmTUVe+u4TPnzOAnf3yDe57dkOlwnHOuT+mM3jkLuBJ4RdLyUHYLMB+YL2kF0ApcZdEp7kpJPwdeJRr58zkz6wCQdB3wJJAA5ptZVo13vPnCd7G5vomv/ecqKkoKfESPc27E0Uhvipg7d64tWbIk02Gkrbmtg6vmP8/zG3fx1Q8fz5Vn1mQ6JOdcjpG01Mzm9lXn38gdYoXJBD/5i9P402Mn8fePruTWBStpbvObsznnRgZP+odBYTLBXZ+Yw9XvruHf/7CRi+/8PS/X1mc6LOec86R/uOQn8rj1w8fzH586jf0tHfzZ9//Atxe+TltHZ6ZDc87lME/6h9k5Myt48gvv4ZKTpnLHb9fwke//gTXbGjIdlnMuR3nSHwbji5Lcfvls7vrEKWyub+Li7z7LHU+t8bZ+59yw86Q/jOadUMmTN7yHC46bzLefep33f/t3/HbVtkyH5ZzLIZ70h1lFSQHf+1+ncO+nTyeVn8enfrKEP//x897R65wbFj5OP4PaOjr59//eyJ3/tYaG5nbOOnoCn33vUZx99ESG6DZGzrkcdLBx+p70R4CG5jbuW/wm9zy7ge0NLZwwbRx/+Z6juOhPKknkefJ3zg2OJ/1RoqW9g18t28zdv1vP+h37mV5ezFXvruGyuVWUFCYzHZ5zbpTwpD/KdHQaC1/dyo9+v4Elb+ymKJng/cdP5tLZ0zh75kSSCe+Kcc7172BJP50brrlhlsgT806oZN4Jlby0qZ4Hl2ziP1/ewqPL32LCmBQfPLGSS0+exuzqUm/7d84Nip/pjxKt7Z0sWr2dR5e/xcJV22ht76RmQjGXzJ7GxSdWMnPSWD8AOOcAb97JOnub2/jNiq088uJm/rh+J2YwdXwh751VwXuPqeDdR09knPcBOJezPOlnsa17mnl69XaeWV3Hf6/dQUNLO4k8MWd6WfdB4LjKceT5KCDncoYn/RzR1tHJi2/W88zr23nm9TpWbN4LRLeBOLWmjNNmlHPajAkcP3WcdwY7l8U86eeouoYWfr+mjsXrd/H8xl1s2LEfgOJUgjlHlHFaTTlza8o5dkoJZWNSGY7WOTdUPOk7ALY3NPPCht08v2Enizfs4rWtB+72OXFsihOmjefEqlJmV4/n+KnjqRhb4M1Czo1CPmTTATCppJCLT6zk4hMrAahvbOXFTfWs276P1VsbeLl2D797fQ2d4TwgmRDTSos4dso4jq0s4dgp43hXZQnVZcV+MHBulPKkn8NKi1OcN2sS582a1F22v6WdFZv38Pq2BjbXN7Nxx35Wb2vgyVe30nVROCaVYPqEMUwcm6KqrJiZk8Yyc/JYjplcwqSSAh866twINmDSl1QN/BSYDBhwt5ndIelW4DNAXZj1FjN7XFINsApYHcqfM7PPhnXNAf4dKAIeB663kd6+lGPGFORz+pETOP3ICT3KG1vbeX3bPlZv3cuqLQ1s2tXIjn0tPLF5C/c3tnXPV1KQz4yKMcyYOIYjJ46lcnwhE0tSTCstZnp5MUWpxHBvknMuJp0z/XbgRjNbJqkEWCppYaj7tpl9q49l1pnZ7D7Kf0B0oFhMlPTnAU8MPmw33IpT+cyuLmV2dWmPcjNj5/5WXt/WwJpt+1hft4/1O/azZONuHl3+1tvWU1FSwPTyYqaVFlFZWhj9HV9E5fhourQ46VcKzh1GAyZ9M9sCbAnTDZJWAdMG+0KSKoFxZvZceP5T4FI86Y9qkpg4toCJYwt491ETe9Q1t3VQ19BC3b4Wanc3sWlXI2/s3M+buxpZvqme36xoprXXbwYXJvOYWlrE1PFFTC0tjKZLi6gqLWLSuEJKi5OUFaf87qPOHaJBtemHppuTic7UzwKuk/RJYAnR1cDuMOsMSS8Ce4G/M7PfEx0oamOrq+UQDh5u9ChMJqguL6a6vJhTppe9rb6z09ixv4Ut9c1s2dPE5vpmttQ3sWVPM5vrm1i0uo66fS30bgBMJfI4YkIx08qKKC9OUT4mRdmYFBPC3/KuR3GK8UVJ73R2LibtpC9pLPAQcIOZ7ZX0A+Afidr5/xH4F+AviK4KppvZztCG/4ik4wcTlKRrgGsApk+fPphF3SiSlycmlRQyqaSQk3o1G3Vpae9g254WNtc3sb2hmfrGNt7a08T6uv1s29vMmm372N3YSmNr3783nCcoCweGSeMKmDyukMnjCpkS/k4aV0B5cYrS4iQlhUm/gnBZL62kLylJlPDvNbOHAcxsW6z+h8BjobwFaAnTSyWtA44BNgNVsdVWhbK3MbO7gbshGqc/uE1y2aQgP8H0CcVMn1B80Pma2zrYtb+170djKzv3tbC9oYXn1u1ke0ML7Z1v/7eSYFxhktLiJKXFKUqLkoyPPcYV5TO+6EBdaThYjC9KUpj0Dmo3OqQzekfAPcAqM7s9Vl4Z2vsB/gxYEcorgF1m1iHpSGAmsN7MdknaK+kMouahTwLfHdrNcbmqMJnobv8fSGdn1Pm8bW9z99VDfWMb9U1t1De29pjeuHM/e5va2NvcTkcfB4ouRclE9wGgtDhJaVGKsjFJxhelwvOovDiVT3EqQVEqwZhUPuOKkpQU5vttMdywSedM/yzgSuAVSctD2S3AxyTNJmre2Qj8Zah7D/BVSW1AJ/BZM9sV6v6KA0M2n8A7cV0G5OWJipICKkoKgPFpLWNm7G/t6D4o7GnqOlAceL57fyv1TW3saWxj/Y591L8ZzdO7s7ovxakEJYX5lBQmGVuQT0lhPuNi02ML87uni1P5FCUTFCYTFKXyGF+UZMKYAkoK88n3g4cbgN+GwbnDyMxoauvovppobG2nsbWDxtYO9re009DcRkNzO3ub29jb1E5DS/Q8erSxr6Wdfc3t7O+nz6K3VCKPwmQexameB4qug0XXVcbYVH73ga8oleg+iBQmu6bzKEwmKMjP8yG0o5DfhsG5DJEUkm1+Wk1P/enoNPaFg0RjawfNbR00t3WGA0orO/a1sq+5naa2DprCgWVfS3tYpp236ptoau2gsS064LS2D3z1EcUPhfnRQSB+YChM5lGUSkR14W9RKi/8TXQfMIq66w4cSA4cWPwAkwme9J0bBRJ56u5QHgqt7Z3U7WuhrqGFptYOmts7aO7629bZqyw8b+ugKRxsooNOdAXTHCtrCuUH6f7oV18HmIJkgqJwUHjbQae7iSu9A0yP9ebwAcaTvnM5KJWfx7TSIqa9g6uP/pgZrR2dPQ4OXQeLroNJSx9lAx1g9jQN7QGmIL/n1Ut+nshP5JFMiGQij/y88DchUok8CsLBInokKEjGpvPzKEhGVzpReWze2HLJRB6JPHW/1oFpkczLG5bvlHjSd84NKUkh6SWG7MqkP/EDTI8DSexgk84Bprm9k/aOTto6jPbOTtrCdGNrO+2dRmt7J63tnbS0d9LS3kFLWyfN7R20dQxtn2hRMkFxKkFxQYLKcUX8/LNnDun6wZO+c24Uix9gOMwHmL50hANCS3tHdEBoi02Hg0PXdHNbJ+2dRkdndEDp6DTaOjrp6LTuA0tTW9TB39jaQWHy8IzE8qTvnHOHKJGnaPTTKLp7rA/qdc65HOJJ3znncognfeecyyGe9J1zLod40nfOuRziSd8553KIJ33nnMshnvSdcy6HjPhbK0uqA944xMUnAjuGMJyhNFJjG6lxgcd2qEZqbCM1Lhj9sR1hZhV9VYz4pP9OSFrS3z2lM22kxjZS4wKP7VCN1NhGalyQ3bF5845zzuUQT/rOOZdDsj3p353pAA5ipMY2UuMCj+1QjdTYRmpckMWxZXWbvnPOuZ6y/UzfOedcjCd955zLIVmZ9CXNk7Ra0lpJN2U4lmpJT0t6VdJKSdeH8nJJCyWtCX/LMhhjQtKLkh4Lz2dIWhz234OSUhmKq1TSLyW9JmmVpDNHwn6T9IXwXq6QdL+kwkztM0nzJW2XtCJW1uc+UuTOEOPLkk7JQGz/HN7PlyX9SlJprO7mENtqSR8Y7thidTdKMkkTw/OM77dQ/vmw71ZKui1WPrj9ZmZZ9QASwDrgSCAFvAQcl8F4KoFTwnQJ8DpwHHAbcFMovwn4ZgZj/GvgPuCx8PznwBVh+i7g2gzF9RPg02E6BZRmer8B04ANQFFsX12dqX0GvAc4BVgRK+tzHwEXAU8AAs4AFmcgtvcD+WH6m7HYjguf1QJgRvgMJ4YztlBeDTxJ9IXQiSNov50HPAUUhOeTDnW/DduHZbgewJnAk7HnNwM3ZzquWDyPAhcAq4HKUFYJrM5QPFXAb4HzgcfCP/aO2Aezx/4cxrjGh+SqXuUZ3W8h6W8Cyol+bvQx4AOZ3GdATa8E0ec+Av4N+Fhf8w1XbL3q/gy4N0z3+JyGxHvmcMcG/BI4CdgYS/oZ329EJxXv62O+Qe+3bGze6fpQdqkNZRknqQY4GVgMTDazLaFqKzA5Q2F9B/gboDM8nwDUm1l7eJ6p/TcDqAN+HJqefiRpDBneb2a2GfgW8CawBdgDLGVk7LMu/e2jkfbZ+AuiM2gYAbFJugTYbGYv9arKeGzAMcA5oQnxGUmnHmps2Zj0RyRJY4GHgBvMbG+8zqJD9LCPnZX0QWC7mS0d7tdOQz7RJe4PzOxkYD9RU0W3TOy30D5+CdFBaSowBpg3nDEMRqb+twYi6W+BduDeTMcCIKkYuAX4h0zH0o98oqvLM4AvAT+XpENZUTYm/c1E7XJdqkJZxkhKEiX8e83s4VC8TVJlqK8EtmcgtLOAD0vaCDxA1MRzB1AqKT/Mk6n9VwvUmtni8PyXRAeBTO+39wEbzKzOzNqAh4n240jYZ13620cj4rMh6Wrgg8DHw0EJMh/bUUQH8pfC56EKWCZpygiIDaLPw8MWeZ7oynziocSWjUn/BWBmGE2RAq4AFmQqmHA0vgdYZWa3x6oWAFeF6auI2vqHlZndbGZVZlZDtJ/+y8w+DjwN/I8Mx7YV2CRpVij6U+BVMr/f3gTOkFQc3tuuuDK+z2L620cLgE+G0ShnAHtizUDDQtI8oubED5tZY6xqAXCFpAJJM4CZwPPDFZeZvWJmk8ysJnweaokGYGxlBOw34BGizlwkHUM0sGEHh7LfDmdnRKYeRL3trxP1ZP9thmM5m+jy+mVgeXhcRNR2/ltgDVGvfHmG4zyXA6N3jgz/OGuBXxBGDGQgptnAkrDvHgHKRsJ+A74CvAasAP6DaORERvYZcD9R30IbUaL6VH/7iKiT/nvhc/EKMDcDsa0laoPu+izcFZv/b0Nsq4ELhzu2XvUbOdCROxL2Wwr4WfifWwacf6j7zW/D4JxzOSQbm3ecc871w5O+c87lEE/6zjmXQzzpO+dcDvGk75xzOcSTvnPO5RBP+s45l0P+P+Mlb8HKgBVGAAAAAElFTkSuQmCC\n", 237 | "text/plain": [ 238 | "
" 239 | ] 240 | }, 241 | "metadata": { 242 | "needs_background": "light" 243 | }, 244 | "output_type": "display_data" 245 | } 246 | ], 247 | "source": [ 248 | "plt.plot(scvi_model.history[\"elbo_train\"], label=\"train\")\n", 249 | "#plt.plot(vae.history[\"elbo_validation\"], label=\"val\")\n", 250 | "plt.title(\"Negative ELBO over training epochs\")\n", 251 | "#plt.ylim(1100, 1500)\n", 252 | "plt.legend()" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": 61, 258 | "metadata": {}, 259 | "outputs": [], 260 | "source": [ 261 | "adata.obsm[\"X_scVI\"] = scvi_model.get_latent_representation()" 262 | ] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "execution_count": 62, 267 | "metadata": {}, 268 | "outputs": [], 269 | "source": [ 270 | "sc.pp.neighbors(adata, use_rep=\"X_scVI\")" 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": null, 276 | "metadata": {}, 277 | "outputs": [], 278 | "source": [] 279 | }, 280 | { 281 | "cell_type": "markdown", 282 | "metadata": {}, 283 | "source": [ 284 | "#### Load adata" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": 95, 290 | "metadata": {}, 291 | "outputs": [ 292 | { 293 | "name": "stderr", 294 | "output_type": "stream", 295 | "text": [ 296 | "/home/ubuntu/miniconda3/envs/scenic/lib/python3.9/site-packages/anndata/__init__.py:51: FutureWarning: `anndata.read` is deprecated, use `anndata.read_h5ad` instead. `ad.read` will be removed in mid 2024.\n", 297 | " warnings.warn(\n" 298 | ] 299 | } 300 | ], 301 | "source": [ 302 | "adata = sc.read(os.path.join(data_dir, 'zenodo', 'adata_ref_after_training.h5ad'))" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": null, 308 | "metadata": {}, 309 | "outputs": [], 310 | "source": [] 311 | } 312 | ], 313 | "metadata": { 314 | "kernelspec": { 315 | "display_name": "Python 3 (ipykernel)", 316 | "language": "python", 317 | "name": "python3" 318 | }, 319 | "language_info": { 320 | "codemirror_mode": { 321 | "name": "ipython", 322 | "version": 3 323 | }, 324 | "file_extension": ".py", 325 | "mimetype": "text/x-python", 326 | "name": "python", 327 | "nbconvert_exporter": "python", 328 | "pygments_lexer": "ipython3", 329 | "version": "3.9.16" 330 | } 331 | }, 332 | "nbformat": 4, 333 | "nbformat_minor": 4 334 | } 335 | -------------------------------------------------------------------------------- /pb_nk/meta_nk_aucell.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 28, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import scvi\n", 10 | "import scanpy as sc\n", 11 | "import pandas as pd\n", 12 | "import numpy as np\n", 13 | "\n", 14 | "import json\n", 15 | "\n", 16 | "from pyscenic.aucell import aucell\n", 17 | "from ctxcore.genesig import GeneSignature\n", 18 | "from pyscenic.aucell import create_rankings, enrichment" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 29, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "adata_bulk = sc.read('zenodo/pb_12_donors_bulk.h5ad')" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": null, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 30, 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "filename = 'metank_gene_sig.txt'\n", 44 | "\n", 45 | "with open(filename, 'r') as file:\n", 46 | " gene_sig = json.load(file)" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 31, 59 | "metadata": {}, 60 | "outputs": [], 61 | "source": [ 62 | "signature_genes = [x for x in gene_sig.values()]" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 32, 68 | "metadata": {}, 69 | "outputs": [], 70 | "source": [ 71 | "gene_sigs = [GeneSignature(name,gene_sig[name]) for name in gene_sig]" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 33, 77 | "metadata": {}, 78 | "outputs": [ 79 | { 80 | "data": { 81 | "text/plain": [ 82 | "AnnData object with n_obs × n_vars = 23253 × 32549\n", 83 | " obs: 'total_counts', 'n_genes_by_counts', 'pct_counts_mt', 'sample', 'batch', 'subset', 'label', 'dataset', '_scvi_batch', '_scvi_labels', 'C_scANVI', 'source', 'tumor_type'\n", 84 | " obsm: 'X_scANVI', 'X_scVI', 'X_umap'" 85 | ] 86 | }, 87 | "execution_count": 33, 88 | "metadata": {}, 89 | "output_type": "execute_result" 90 | } 91 | ], 92 | "source": [ 93 | "adata_bulk" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 35, 99 | "metadata": {}, 100 | "outputs": [], 101 | "source": [ 102 | "exp_df = adata_bulk.to_df()" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 36, 108 | "metadata": {}, 109 | "outputs": [], 110 | "source": [ 111 | "auc_mtx = aucell(exp_df, gene_sigs, num_workers=4)" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": 37, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "adata_bulk.obs[[x + '_auc' for x in auc_mtx.columns]] = auc_mtx.to_numpy()" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": null, 126 | "metadata": {}, 127 | "outputs": [], 128 | "source": [] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 140, 133 | "metadata": {}, 134 | "outputs": [ 135 | { 136 | "name": "stdout", 137 | "output_type": "stream", 138 | "text": [ 139 | "WARNING: saving figure to file /itf-fi-ml/home/hermankn/uni_res/figures/nk_all_cells_figs/matrixplot_meatank_sig_scores.pdf\n" 140 | ] 141 | }, 142 | { 143 | "data": { 144 | "image/png": "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\n", 145 | "text/plain": [ 146 | "
" 147 | ] 148 | }, 149 | "metadata": { 150 | "image/png": { 151 | "height": 256, 152 | "width": 341 153 | }, 154 | "needs_background": "light" 155 | }, 156 | "output_type": "display_data" 157 | } 158 | ], 159 | "source": [ 160 | "sc.pl.matrixplot(adata_bulk, ['NK2A_auc', 'NK2B_auc', 'NK1A_auc', 'NK1B_auc', 'NK1C_auc', 'NK3_auc'], \n", 161 | " standard_scale='var',groupby='C_scANVI', save='metank_sig_scores.pdf')" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": null, 167 | "metadata": {}, 168 | "outputs": [], 169 | "source": [] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": null, 174 | "metadata": {}, 175 | "outputs": [], 176 | "source": [] 177 | } 178 | ], 179 | "metadata": { 180 | "kernelspec": { 181 | "display_name": "Python 3 (ipykernel)", 182 | "language": "python", 183 | "name": "python3" 184 | }, 185 | "language_info": { 186 | "codemirror_mode": { 187 | "name": "ipython", 188 | "version": 3 189 | }, 190 | "file_extension": ".py", 191 | "mimetype": "text/x-python", 192 | "name": "python", 193 | "nbconvert_exporter": "python", 194 | "pygments_lexer": "ipython3", 195 | "version": "3.10.4" 196 | } 197 | }, 198 | "nbformat": 4, 199 | "nbformat_minor": 4 200 | } 201 | -------------------------------------------------------------------------------- /pb_nk/metank_gene_sig.txt: -------------------------------------------------------------------------------- 1 | { 2 | "NK1C": [ 3 | "ACTB", 4 | "ACTG1", 5 | "SPON2", 6 | "PRF1", 7 | "FCER1G", 8 | "PFN1", 9 | "GZMA", 10 | "GZMB", 11 | "CORO1A", 12 | "CFL1", 13 | "ITGB2", 14 | "RAC2", 15 | "NKG7", 16 | "AKR1C3", 17 | "MYL12A", 18 | "ARPC2", 19 | "CLIC1", 20 | "TMSB10", 21 | "CST7", 22 | "ALOX5AP" 23 | ], 24 | "NK3": [ 25 | "CD52", 26 | "KLRC2", 27 | "CCL5", 28 | "GZMH", 29 | "IL32", 30 | "CD3E", 31 | "CD3D", 32 | "S100A6", 33 | "S100A4", 34 | "VIM", 35 | "RPL27A", 36 | "KLRC3", 37 | "LGALS1", 38 | "RPS29", 39 | "TMSB4X", 40 | "RPS27", 41 | "RPL23A", 42 | "HLA-DPB1" 43 | ], 44 | "NK1A": [ 45 | "KLRB1", 46 | "TXNIP", 47 | "CXCR4", 48 | "JUNB", 49 | "H3F3B", 50 | "CCL3", 51 | "ZFP36", 52 | "BTG1", 53 | "IER2", 54 | "C1orf56", 55 | "JUN" 56 | ], 57 | "NK1B": [ 58 | "KLRB1", 59 | "CLIC3", 60 | "CD38", 61 | "SPON2", 62 | "FCER1G", 63 | "JAK1", 64 | "HIST1H1E", 65 | "AOAH", 66 | "UTRN", 67 | "GNG2", 68 | "CD160", 69 | "GZMB", 70 | "MT-ND6", 71 | "SYNE1", 72 | "ETS1", 73 | "CEP78", 74 | "MT-CO1", 75 | "LBH", 76 | "CD247", 77 | "MT-ATP8" 78 | ], 79 | "NK2B": [ 80 | "GZMK", 81 | "TPT1", 82 | "EEF1A1", 83 | "RPL10", 84 | "RPL13", 85 | "XCL1", 86 | "RPS15A", 87 | "RPS23", 88 | "RPLP1", 89 | "RPL32", 90 | "FOS", 91 | "RPS28", 92 | "RPL19", 93 | "RPS24", 94 | "RPL34", 95 | "RPS12", 96 | "RPL18A", 97 | "RPS18", 98 | "RPSA", 99 | "RPL10A" 100 | ], 101 | "NK2A": [ 102 | "GZMK", 103 | "SELL", 104 | "CMC1", 105 | "XCL1", 106 | "IL7R", 107 | "XCL2", 108 | "RPS18", 109 | "RPL13A", 110 | "TPT1", 111 | "KLRC1", 112 | "LTB", 113 | "EEF1G", 114 | "RPLP1", 115 | "RPL36A", 116 | "CD44", 117 | "FOS", 118 | "RPL10A", 119 | "RPSA", 120 | "EEF1A1" 121 | ] 122 | } -------------------------------------------------------------------------------- /scripts/decontx_all.py: -------------------------------------------------------------------------------- 1 | import scanpy as sc 2 | import pandas as pd 3 | import numpy as np 4 | import os 5 | 6 | import anndata 7 | import anndata2ri 8 | import logging 9 | 10 | import rpy2.rinterface_lib.callbacks as rcb 11 | import rpy2.robjects as ro 12 | 13 | rcb.logger.setLevel(logging.ERROR) 14 | ro.pandas2ri.activate() 15 | anndata2ri.activate() 16 | from rpy2.robjects.packages import importr 17 | decontX = importr('decontX') 18 | 19 | data_dir = '' 20 | for f in os.listdir(data_dir): 21 | adata = sc.read_h5ad(os.path.join(data_dir, f)) 22 | 23 | batch_adatas = [] 24 | 25 | for batch in adata.obs['batch'].cat.categories: 26 | adata_temp = adata[adata.obs['batch'] == batch].copy() 27 | adata_temp.layers['counts'] = adata_temp.X 28 | adata_temp_adj = adata_temp.copy() 29 | adata_temp_adj = decontX.decontX(adata_temp_adj) 30 | adata_temp.layers['counts_adj'] = np.round(adata_temp_adj.layers['decontXcounts']) 31 | batch_adatas += [adata_temp] 32 | 33 | adata_adj = anndata.concat(batch_adatas) 34 | 35 | adata_adj.X = adata_adj.layers['counts_adj'] 36 | 37 | adata_adj.write(f) 38 | -------------------------------------------------------------------------------- /survival_analysis/tcga_survival_sarc.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "0ea4aebb-52ef-44d6-b23b-8c77da7a372e", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "import scanpy as sc" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 2, 16 | "id": "f014eadd-55d4-42e6-997b-f9d1a2394124", 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import pandas as pd\n", 21 | "import numpy as np\n", 22 | "import rpy2.rinterface_lib.callbacks\n", 23 | "import anndata2ri\n", 24 | "import logging\n", 25 | "\n", 26 | "from rpy2.robjects import pandas2ri\n", 27 | "from rpy2.robjects import r\n", 28 | "\n", 29 | "sc.settings.verbosity = 0\n", 30 | "rpy2.rinterface_lib.callbacks.logger.setLevel(logging.ERROR)\n", 31 | "\n", 32 | "pandas2ri.activate()\n", 33 | "anndata2ri.activate()\n", 34 | "\n", 35 | "%load_ext rpy2.ipython" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 3, 41 | "id": "e2d2d730-55a4-49cd-9f4d-bfaffc6e705f", 42 | "metadata": {}, 43 | "outputs": [], 44 | "source": [ 45 | "import os" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 4, 51 | "id": "4c120c57-6d65-40ea-9906-93da7a2d5ae7", 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "import matplotlib.pyplot as plt" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 5, 61 | "id": "636fc6aa-cf16-480f-8370-42743e9a4c7f", 62 | "metadata": {}, 63 | "outputs": [], 64 | "source": [ 65 | "import anndata2ri\n", 66 | "import rpy2.rinterface_lib.callbacks\n", 67 | "import logging" 68 | ] 69 | }, 70 | { 71 | "cell_type": "markdown", 72 | "id": "8e1836b8-0d02-4419-86ff-94e57c9771c9", 73 | "metadata": {}, 74 | "source": [ 75 | "### Prepare sc data" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 6, 81 | "id": "1199eb34-0797-4489-b30d-090225441123", 82 | "metadata": {}, 83 | "outputs": [], 84 | "source": [ 85 | "data_dir = 'zenodo'" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": null, 91 | "id": "dfd24ed1-df46-4b9f-8c28-e69458f27f46", 92 | "metadata": {}, 93 | "outputs": [ 94 | { 95 | "name": "stderr", 96 | "output_type": "stream", 97 | "text": [ 98 | "/home/ubuntu/miniconda3/envs/scenic/lib/python3.9/site-packages/anndata/__init__.py:51: FutureWarning: `anndata.read` is deprecated, use `anndata.read_h5ad` instead. `ad.read` will be removed in mid 2024.\n", 99 | " warnings.warn(\n" 100 | ] 101 | } 102 | ], 103 | "source": [ 104 | "adata = sc.read(os.path.join(data_dir, 'sarcoma.h5ad'))" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": null, 110 | "id": "2a57bce0-fffa-46d5-8498-90cb3b787c5b", 111 | "metadata": {}, 112 | "outputs": [], 113 | "source": [ 114 | "adata.obs['label'] = adata.obs['level2_cell_type_new']" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": null, 120 | "id": "57dba386-dd05-42cd-a5d2-d42c990bbd3f", 121 | "metadata": {}, 122 | "outputs": [], 123 | "source": [ 124 | "adata.obs['replicate'] = adata.obs['dataset']" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": null, 130 | "id": "be7c8d59-c136-4209-97b1-47c955829f88", 131 | "metadata": {}, 132 | "outputs": [], 133 | "source": [ 134 | "adata.obs[\"sample\"] = [\n", 135 | " f\"{rep}_{l}\" for rep, l in zip(adata.obs[\"replicate\"], adata.obs[\"label\"])\n", 136 | "]" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": 17, 142 | "id": "d8fb6cf7-9796-4c57-b919-e2dfce3f958c", 143 | "metadata": {}, 144 | "outputs": [], 145 | "source": [ 146 | "adata.obs[\"replicate\"] = adata.obs[\"replicate\"].astype(\"category\")\n", 147 | "adata.obs[\"label\"] = adata.obs[\"label\"].astype(\"category\")\n", 148 | "adata.obs[\"sample\"] = adata.obs[\"sample\"].astype(\"category\")" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 31, 154 | "id": "e91620cb-f3c2-4191-9246-021dddcbfbe5", 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "del adata.obsp\n", 159 | "del adata.uns\n", 160 | "del adata.obsm\n", 161 | "#adata.obsm.pop('X_scVI')" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 20, 167 | "id": "4855e74b-21af-4602-9d3c-c25c8a6d56c0", 168 | "metadata": {}, 169 | "outputs": [], 170 | "source": [ 171 | "adata.obs['cellstate'] = adata.obs['label']" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 26, 177 | "id": "d555a094-2bca-4462-8262-951c2db0bf6b", 178 | "metadata": {}, 179 | "outputs": [], 180 | "source": [ 181 | "cellstate_celltype_dict = {'B cells' : 'B cells', 'CD56bright NK cells' : 'NK cells', 'CD56dim NK cells' : 'NK cells', 'Dendritic cells' : 'Myeloid',\n", 182 | " 'Endothelial cells' : 'Endothelial cells', 'Epithelial Stroma' : 'Epithelial Stroma', 'Fibroblasts' : 'Fibroblasts', 'ILC' : 'ILC', 'Late erythroid' : 'Late erythroid',\n", 183 | " 'MAIT cells' : 'T cells', 'Macrophages' : 'Myeloid', 'Mast cells' : 'Myeloid', 'NKT cells' : 'NKT cells', 'Plasma cells' : 'B cells',\n", 184 | " 'Melanoma cells' : 'Melanoma cells', 'Memory B cells' : 'B cells', 'Monocytes' : 'Myeloid', 'Regulatory T cells' : 'T cells',\n", 185 | " 'Tcm/Naive helper T cells' : 'T cells', 'Tem/Effector helper T cells' : 'T cells', 'Naive B cells' : 'B cells', 'pDC' : 'Myeloid',\n", 186 | " 'Tem/Trm cytotoxic T cells' : 'T cells', 'Type 1 helper T cells' : 'T cells', 'CAFs' : 'CAFs', 'Osteoblasts' : 'Osteoblasts', 'Osteoclasts' : 'Osteoclasts', 'Tcm/Naive cytotoxic T cells' : 'T cells'}" 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "execution_count": 32, 192 | "id": "68c296df-7050-48e4-8a48-be4097a2bbd2", 193 | "metadata": {}, 194 | "outputs": [], 195 | "source": [ 196 | "adata.obs['celltype'] = [cellstate_celltype_dict[x] for x in adata.obs['cellstate']]" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 33, 202 | "id": "4b8914c0-57ca-4879-a1b6-e9ad2ba9cf40", 203 | "metadata": {}, 204 | "outputs": [], 205 | "source": [ 206 | "adata_subsample = adata#sc.pp.subsample(adata, fraction=0.1, copy=True)" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": 34, 212 | "id": "4aa6f5f2-523f-4b1c-8fb8-59380e2f3894", 213 | "metadata": {}, 214 | "outputs": [ 215 | { 216 | "name": "stdout", 217 | "output_type": "stream", 218 | "text": [ 219 | "class: SingleCellExperiment \n", 220 | "dim: 21505 150851 \n", 221 | "metadata(0):\n", 222 | "assays(3): X counts counts_adj\n", 223 | "rownames(21505): FAM138A OR4F5 ... MT-ND6 MT-CYB\n", 224 | "rowData names(0):\n", 225 | "colnames(150851): AAACCTGAGATCCCGC-1-BC2_zhou_BC2\n", 226 | " AAACCTGCAGGAATCG-1-BC2_zhou_BC2 ...\n", 227 | " TTTGTCAGTAGCCTAT-1_P4_cillo_cillio_osteosarcoma_4\n", 228 | " TTTGTCATCGTTACAG-1_P4_cillo_cillio_osteosarcoma_4\n", 229 | "colData names(23): sample patient ... cellstate celltype\n", 230 | "reducedDimNames(0):\n", 231 | "mainExpName: NULL\n", 232 | "altExpNames(0):\n" 233 | ] 234 | } 235 | ], 236 | "source": [ 237 | "%%R -i adata_subsample\n", 238 | "adata_subsample" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": 35, 244 | "id": "f438e1dd-2a5a-4cfe-9c14-a7e656fde064", 245 | "metadata": {}, 246 | "outputs": [], 247 | "source": [ 248 | "%%R\n", 249 | "sc.dat <- t(assay(adata_subsample))" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 36, 255 | "id": "32b2054c-08cb-43a7-a687-e1a0f2fd339e", 256 | "metadata": {}, 257 | "outputs": [], 258 | "source": [ 259 | "%%R\n", 260 | "sc.dat <- as.matrix(sc.dat)" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": 37, 266 | "id": "e06da537-0374-46ff-b434-44dfc367b11f", 267 | "metadata": {}, 268 | "outputs": [], 269 | "source": [ 270 | "%%R\n", 271 | "cell.type.labels <- colData(adata_subsample)$celltype" 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 38, 277 | "id": "8b117c99-4322-424e-b364-d49f4332eb16", 278 | "metadata": {}, 279 | "outputs": [], 280 | "source": [ 281 | "%%R\n", 282 | "cell.type.labels <- as.vector(cell.type.labels)" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": 39, 288 | "id": "79962a98-b844-470c-8871-54b673a4dd13", 289 | "metadata": {}, 290 | "outputs": [], 291 | "source": [ 292 | "%%R\n", 293 | "cell.state.labels <- colData(adata_subsample)$cellstate" 294 | ] 295 | }, 296 | { 297 | "cell_type": "code", 298 | "execution_count": 40, 299 | "id": "c20a8b1b-4ef8-49f8-ba45-8d782d9dcc0d", 300 | "metadata": {}, 301 | "outputs": [], 302 | "source": [ 303 | "%%R\n", 304 | "cell.state.labels <- as.vector(cell.state.labels)" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": null, 310 | "id": "02a0f24a-fd60-4607-a050-843a972357bb", 311 | "metadata": {}, 312 | "outputs": [], 313 | "source": [] 314 | }, 315 | { 316 | "cell_type": "markdown", 317 | "id": "e50d9bcd-93c5-4da1-b987-6eac737d7119", 318 | "metadata": {}, 319 | "source": [ 320 | "### download and prepare tcga data" 321 | ] 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": 32, 326 | "id": "d01783aa-ec4b-4e4c-8f29-68c3b030aae2", 327 | "metadata": {}, 328 | "outputs": [], 329 | "source": [ 330 | "%%R\n", 331 | "library(TCGAbiolinks)" 332 | ] 333 | }, 334 | { 335 | "cell_type": "code", 336 | "execution_count": 33, 337 | "id": "4dc026e3-9c63-47fd-ad1b-787f0ede45a8", 338 | "metadata": {}, 339 | "outputs": [], 340 | "source": [ 341 | "%%R\n", 342 | "library(scran)" 343 | ] 344 | }, 345 | { 346 | "cell_type": "code", 347 | "execution_count": null, 348 | "id": "bd8c9517-fc1d-4353-b862-a9d449e12943", 349 | "metadata": { 350 | "scrolled": true, 351 | "tags": [] 352 | }, 353 | "outputs": [], 354 | "source": [ 355 | "%%R\n", 356 | "my.dir = '/tumor-data/GDCdata'\n", 357 | "\n", 358 | "# Gene expression aligned against hg38\n", 359 | "query <- GDCquery(\n", 360 | " project = \"TARGET-OS\",\n", 361 | " data.category = \"Transcriptome Profiling\",\n", 362 | " data.type = \"Gene Expression Quantification\", \n", 363 | " workflow.type = \"STAR - Counts\"\n", 364 | ")\n", 365 | "#GDCdownload(query = query,\n", 366 | "# directory = \"/tumor-data/GDCdata\")\n", 367 | "\n", 368 | "data <- GDCprepare(query = query,\n", 369 | " directory = my.dir,\n", 370 | " save = TRUE,\n", 371 | " save.filename = \"/tumor-data/SARC_OS_exp.rda\")" 372 | ] 373 | }, 374 | { 375 | "cell_type": "code", 376 | "execution_count": 44, 377 | "id": "6a557993-eb93-4a24-9563-d64d0872a5e1", 378 | "metadata": {}, 379 | "outputs": [], 380 | "source": [ 381 | "%%R\n", 382 | "load(file='/tumor-data/SARC_OS_exp.rda')" 383 | ] 384 | }, 385 | { 386 | "cell_type": "code", 387 | "execution_count": 45, 388 | "id": "55c18344-ad02-462b-9848-965a1d81a6e9", 389 | "metadata": {}, 390 | "outputs": [], 391 | "source": [ 392 | "%%R\n", 393 | "bk.mtx <- assay(data)" 394 | ] 395 | }, 396 | { 397 | "cell_type": "code", 398 | "execution_count": 46, 399 | "id": "84d6e95d-04f9-4f46-8dde-06ce23201818", 400 | "metadata": {}, 401 | "outputs": [], 402 | "source": [ 403 | "%%R\n", 404 | "rownames(bk.mtx) <- rowData(data)$gene_name" 405 | ] 406 | }, 407 | { 408 | "cell_type": "code", 409 | "execution_count": 47, 410 | "id": "99939271-7c24-4139-b24a-09a2c59c83f8", 411 | "metadata": {}, 412 | "outputs": [], 413 | "source": [ 414 | "%%R\n", 415 | "bk.dat <- t(bk.mtx)" 416 | ] 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": 34, 421 | "id": "92f83d3e-50a6-4cc1-b9b4-6d2ccca64de9", 422 | "metadata": {}, 423 | "outputs": [], 424 | "source": [ 425 | "%%R\n", 426 | "clin.dat <- GDCquery_clinic(\"TARGET-OS\", \"clinical\")" 427 | ] 428 | }, 429 | { 430 | "cell_type": "code", 431 | "execution_count": 49, 432 | "id": "aaed5275-64f3-4473-8bf3-6c46ead158b3", 433 | "metadata": {}, 434 | "outputs": [], 435 | "source": [ 436 | "%%R\n", 437 | "colnames(bk.dat) <- make.unique(colnames(bk.dat), sep = \".\")" 438 | ] 439 | }, 440 | { 441 | "cell_type": "code", 442 | "execution_count": 50, 443 | "id": "fbbe0d62-9dd0-4608-8290-a7a8e32fe363", 444 | "metadata": {}, 445 | "outputs": [ 446 | { 447 | "name": "stdout", 448 | "output_type": "stream", 449 | "text": [ 450 | "[1] 88 60660\n" 451 | ] 452 | } 453 | ], 454 | "source": [ 455 | "%%R\n", 456 | "dim(bk.dat)" 457 | ] 458 | }, 459 | { 460 | "cell_type": "code", 461 | "execution_count": 14, 462 | "id": "f64e84ed-8038-4730-964c-65f57d1b2bb1", 463 | "metadata": {}, 464 | "outputs": [ 465 | { 466 | "name": "stdout", 467 | "output_type": "stream", 468 | "text": [ 469 | "[1] 88 60660\n" 470 | ] 471 | } 472 | ], 473 | "source": [ 474 | "%%R\n", 475 | "dim(bk.dat)" 476 | ] 477 | }, 478 | { 479 | "cell_type": "markdown", 480 | "id": "faf67e40-94b3-48d5-96d5-b3385380603f", 481 | "metadata": {}, 482 | "source": [ 483 | "### BayesPrism" 484 | ] 485 | }, 486 | { 487 | "cell_type": "code", 488 | "execution_count": 51, 489 | "id": "322e477a-14c0-4223-a30d-6f54eed952fa", 490 | "metadata": {}, 491 | "outputs": [], 492 | "source": [ 493 | "%%R\n", 494 | "library(BayesPrism)" 495 | ] 496 | }, 497 | { 498 | "cell_type": "code", 499 | "execution_count": 52, 500 | "id": "ab08cc58-e270-4154-8e91-90f9b4908465", 501 | "metadata": {}, 502 | "outputs": [ 503 | { 504 | "name": "stdout", 505 | "output_type": "stream", 506 | "text": [ 507 | "Gene symbols detected. Recommend to use EMSEMBLE IDs for more unique mapping.\n", 508 | "number of genes filtered in each category: \n", 509 | " Rb Mrp other_Rb chrM MALAT1 chrX chrY \n", 510 | " 89 78 17 13 1 882 115 \n", 511 | "A total of 1154 genes from Rb Mrp other_Rb chrM MALAT1 chrX chrY have been excluded \n", 512 | "A total of 2080 gene expressed in fewer than 5 cells have been excluded \n" 513 | ] 514 | } 515 | ], 516 | "source": [ 517 | "%%R\n", 518 | "sc.dat.filtered <- cleanup.genes (input=sc.dat, input.type=\"count.matrix\",\n", 519 | " species=\"hs\",\n", 520 | " gene.group=c( \"Rb\",\"Mrp\",\"other_Rb\",\"chrM\",\"MALAT1\",\"chrX\",\"chrY\") , exp.cells=5)" 521 | ] 522 | }, 523 | { 524 | "cell_type": "code", 525 | "execution_count": 53, 526 | "id": "30182eba-cb55-439a-8d5c-3c55d2a397d9", 527 | "metadata": {}, 528 | "outputs": [ 529 | { 530 | "name": "stdout", 531 | "output_type": "stream", 532 | "text": [ 533 | "[1] 150851 18271\n" 534 | ] 535 | } 536 | ], 537 | "source": [ 538 | "%%R\n", 539 | "dim(sc.dat.filtered)" 540 | ] 541 | }, 542 | { 543 | "cell_type": "code", 544 | "execution_count": null, 545 | "id": "5a205390-81cb-4df2-97c3-7febed8fe9fa", 546 | "metadata": {}, 547 | "outputs": [ 548 | { 549 | "name": "stdout", 550 | "output_type": "stream", 551 | "text": [ 552 | "number of cells in each cell state \n", 553 | "cell.state.labels\n", 554 | " ILC MAIT cells \n", 555 | " 14 21 \n", 556 | " Osteoclasts Fibroblasts \n", 557 | " 31 105 \n", 558 | " Naive B cells CD56bright NK cells \n", 559 | " 237 393 \n", 560 | " Osteoblasts pDC \n", 561 | " 395 427 \n", 562 | "Tcm/Naive cytotoxic T cells Memory B cells \n", 563 | " 435 819 \n", 564 | " Plasma cells Tem/Effector helper T cells \n", 565 | " 886 887 \n", 566 | " Tcm/Naive helper T cells Dendritic cells \n", 567 | " 986 1057 \n", 568 | " CD56dim NK cells Regulatory T cells \n", 569 | " 1299 1361 \n", 570 | " NKT cells Monocytes \n", 571 | " 1405 1884 \n", 572 | " Endothelial cells Tem/Trm cytotoxic T cells \n", 573 | " 4891 7585 \n", 574 | " Macrophages CAFs \n", 575 | " 51616 74117 \n", 576 | "recommend to have sufficient number of cells in each cell state \n", 577 | "No tumor reference is speficied. Reference cell types are treated equally. \n", 578 | "Number of outlier genes filtered from mixture = 12 \n" 579 | ] 580 | } 581 | ], 582 | "source": [ 583 | "%%R\n", 584 | "myPrism <- new.prism(reference=sc.dat.filtered,\n", 585 | " mixture=bk.dat,\n", 586 | " input.type=\"count.matrix\",\n", 587 | " cell.type.labels = cell.type.labels,\n", 588 | " cell.state.labels = cell.state.labels,\n", 589 | " key=NULL,\n", 590 | " outlier.cut=0.01,\n", 591 | " outlier.fraction=0.1,\n", 592 | ")" 593 | ] 594 | }, 595 | { 596 | "cell_type": "code", 597 | "execution_count": null, 598 | "id": "606301eb-2f5f-4bc0-9a2c-b9bece1e9fec", 599 | "metadata": {}, 600 | "outputs": [], 601 | "source": [ 602 | "%%R\n", 603 | "bp.res <- run.prism(prism = myPrism, n.cores=5)" 604 | ] 605 | }, 606 | { 607 | "cell_type": "code", 608 | "execution_count": null, 609 | "id": "cfd406a5-6a9a-4288-9bd6-01ae97a33aad", 610 | "metadata": {}, 611 | "outputs": [], 612 | "source": [] 613 | }, 614 | { 615 | "cell_type": "code", 616 | "execution_count": 7, 617 | "id": "e3242f34-c50b-4697-8a32-44f1ef1721f1", 618 | "metadata": {}, 619 | "outputs": [], 620 | "source": [ 621 | "%%R -o Z_nk,Z_nk_colnames,Z_nk_rownames\n", 622 | "Z_nk <- get.exp(bp.res, state.or.type='type', cell.name='NK cells')\n", 623 | "Z_nk_colnames <- colnames(Z_nk)\n", 624 | "Z_nk_rownames <- rownames(Z_nk)" 625 | ] 626 | }, 627 | { 628 | "cell_type": "code", 629 | "execution_count": 8, 630 | "id": "544ed6cc-eef0-4470-9f18-7b813d0bb699", 631 | "metadata": {}, 632 | "outputs": [], 633 | "source": [ 634 | "Z_nk = pd.DataFrame(Z_nk,index=Z_nk_rownames,columns=Z_nk_colnames) ### NK expression matrix (patients x genes)" 635 | ] 636 | }, 637 | { 638 | "cell_type": "code", 639 | "execution_count": 9, 640 | "id": "09a613af-fd35-4143-bb55-ffdad4dab2f7", 641 | "metadata": {}, 642 | "outputs": [], 643 | "source": [ 644 | "Z_nk_adata = sc.AnnData(Z_nk)" 645 | ] 646 | }, 647 | { 648 | "cell_type": "code", 649 | "execution_count": 10, 650 | "id": "d9260841-f247-43b2-99ec-d80e32f73e7c", 651 | "metadata": {}, 652 | "outputs": [ 653 | { 654 | "data": { 655 | "text/plain": [ 656 | "AnnData object with n_obs × n_vars = 88 × 17836" 657 | ] 658 | }, 659 | "execution_count": 10, 660 | "metadata": {}, 661 | "output_type": "execute_result" 662 | } 663 | ], 664 | "source": [ 665 | "Z_nk_adata" 666 | ] 667 | }, 668 | { 669 | "cell_type": "code", 670 | "execution_count": 11, 671 | "id": "c1495ff9-6d9d-4979-bd9b-1739309942c6", 672 | "metadata": {}, 673 | "outputs": [], 674 | "source": [ 675 | "%%R -o theta,theta_colnames,theta_rownames\n", 676 | "theta <- get.fraction(bp=bp.res, \n", 677 | " which.theta=\"final\",\n", 678 | " state.or.type=\"type\")\n", 679 | "\n", 680 | "theta_colnames <- colnames(theta)\n", 681 | "theta_rownames <- rownames(theta)" 682 | ] 683 | }, 684 | { 685 | "cell_type": "code", 686 | "execution_count": 12, 687 | "id": "9c2d9683-5d40-4fb4-9831-d3569f1c3a22", 688 | "metadata": {}, 689 | "outputs": [], 690 | "source": [ 691 | "%%R -o theta_state,theta_state_colnames,theta_state_rownames\n", 692 | "theta_state <- get.fraction(bp=bp.res, \n", 693 | " which.theta=\"first\",\n", 694 | " state.or.type=\"state\")\n", 695 | "\n", 696 | "theta_state_colnames <- colnames(theta_state)\n", 697 | "theta_state_rownames <- rownames(theta_state)" 698 | ] 699 | }, 700 | { 701 | "cell_type": "code", 702 | "execution_count": 13, 703 | "id": "831b7ab0-fc6c-4985-9ad3-bf72501dccc7", 704 | "metadata": {}, 705 | "outputs": [], 706 | "source": [ 707 | "theta_type_df = pd.DataFrame(theta,index=theta_rownames,columns=theta_colnames) ### Cell type fractions (patients x cell types)" 708 | ] 709 | }, 710 | { 711 | "cell_type": "code", 712 | "execution_count": 14, 713 | "id": "75facb78-3a3a-4643-ba5f-0f107233443d", 714 | "metadata": {}, 715 | "outputs": [], 716 | "source": [ 717 | "theta_state_df = pd.DataFrame(theta_state,index=theta_state_rownames,columns=theta_state_colnames) ### Cell state fractions (patients x cell states)" 718 | ] 719 | }, 720 | { 721 | "cell_type": "code", 722 | "execution_count": 15, 723 | "id": "efbc8a2a-7f67-4182-82a7-6af224c38594", 724 | "metadata": {}, 725 | "outputs": [ 726 | { 727 | "data": { 728 | "image/png": "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qKioUH5FvnKO53hW3jdFbskJOQIad1oZAMAewgiaTWDH93X3Px5otvFWv7Xa5zECO46X9HPfiwEAtBjCCJqN+9tL9dCk69W7i+8zIzu279Co0aN8mhk5XHRCC54/7FMtAICWRxhBszEVEYqL6KdLOvt2yrbb7VZuQK7iO8X7dFGkyh++k6n42qdaAAAtjwWsAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsCbBcAAGgfysrKdODAgXr7HCz4VuWFh5TzcYgqj3Wst2///v0VGhrajBWitSKMAACaxYEDB5SQkNCovtf/qeE+WVlZGjp0qI9VoS0gjAAAmkX//v2VlZVVb58T35fr/23dpUnjEhUe4mxwPJwfCCMAgGYRGhra4EyG2+3WN8VFShw+TIGBgeeoMrR2LGAFAABWEUYAAIBVhBEAAGBVk8LI6tWrFRcXp+DgYCUkJGjbtm319n/33XeVkJCg4OBg9erVS2vXrm1SsQAAoP3xOoxs2rRJixYt0tKlS5Wdna0xY8Zo4sSJysvLq7V/bm6ufv7zn2vMmDHKzs7W3XffrQULFujll1/2uXgAAND2eX02zapVqzRr1izNnj1bkpSenq63335ba9asUVpaWo3+a9euVY8ePZSeni5Jio+P1549e7Ry5UpNnjzZt+rRanzvPi1J+vjodz6PdfL7cu35Wur6+TcKa+DUv/ocKjrhcy0AgJbnVRg5deqUsrKytHjx4mrtycnJ2rlzZ63b7Nq1S8nJydXaJkyYoPXr18vtdnNqVztx+H//8C9+ZV+9/SrdP8h97MtGjfn09iMN9gns3F1+gcH19glzcgY7ALRmXj1LFxcX6/Tp04qKiqrWHhUVpcLCwlq3KSwsrLV/RUWFiouLFR0dXWOb8vJylZeXe26XlJRIOnN+utvt9qZknCPj+nbW/Vdfol4Xhikk0L/Ofjkff6Tr/+O6Znvcv7yxRfEDBtd5f5jTX907BPF7A7QSVccix+T5obH7uUkvGR0OR7XbxpgabQ31r629SlpampYvX16jPTMzk88paMXCJRUV1d/Hv7xcDz30UL193JXS8R+kTsFSYAOrmvxPFuvzvdvr7bO//iEAWOByuWyXgHOgrKysUf28CiORkZHy9/evMQtSVFRUY/ajSteuXWvtHxAQoM6dO9e6zZIlS5Samuq5XVJSopiYGCUnJysiIsKbktEGud1uuVwuJSUl8TYe0M5wfJ9fqt7ZaIhXYSQoKEgJCQlyuVz6xS9+4Wl3uVy6+uqra90mMTFRmzdvrtaWmZmpYcPqvhSw0+mU01lz4WJgYCC/vOcR9jfQfnF8nx8au4+9PrU3NTVVTz/9tDZs2KCcnBzdeuutysvLU0pKiqQzsxrTp0/39E9JSdHnn3+u1NRU5eTkaMOGDVq/fr1uv/12bx8aAAC0Q16vGZk6daqOHTumFStWqKCgQAMGDFBGRoZiY2MlSQUFBdWuORIXF6eMjAzdeuuteuKJJ9StWzc9+uijnNYLAAAkNXEB69y5czV37txa79u4cWONtrFjx+rDDz9sykMBAIB2js+mAQAAVhFGAACAVYQRAABgFWEEAABYRRgBAABWEUYAAIBVhBEAAGAVYQQAAFhFGAEAAFY16Qqs55oxRlLjP/0PbZvb7VZZWZlKSkr4IC2gneH4Pr9U/d2u+jtelzYRRkpLSyVJMTExlisBAADeKi0tVYcOHeq832EaiiutQGVlpfLz83XBBRfI4XDYLgctrKSkRDExMfriiy8UERFhuxwAzYjj+/xijFFpaam6desmP7+6V4a0iZkRPz8/de/e3XYZOMciIiJ4sgLaKY7v80d9MyJVWMAKAACsIowAAACrCCNodZxOp+655x45nU7bpQBoZhzfqE2bWMAKAADaL2ZGAACAVYQRAABgFWEEAABYRRhBnZYtW6YhQ4Y0aduePXsqPT290f2PHDkih8OhvXv3Nunx2pKzf64zZ87UNddcY60eoLH43T3j7Oc3h8Oh1157zVo97QFhpJUoLCzU/Pnz1atXLzmdTsXExOjKK6/Uli1bPH169uwph8Mhh8OhkJAQ9ezZU1OmTNHf//73GuNV9fvx19q1a6v1McZo5cqV6tu3r+cxH3jggWb5fj744APddNNNzTJWlY0bN6pjx46N6udwOPTv//7v1dq//fZbORwOvfPOO562s59E3G63fvWrXyk6Olr//Oc/m6lyoH5t9fh/5JFHtHHjxiZ9z/W57LLL5HA49D//8z/V2tPT09WzZ0/P7dqeE3JyctS9e3dde+21Ki8vb/ba0DLaxBVY27sjR45o1KhR6tixox588EENGjRIbrdbb7/9tubNm6cDBw54+q5YsUJz5szRqVOndOTIET333HO64oordO+992rp0qXVxn3mmWeq/UE++yp4CxcuVGZmplauXKmBAwfqu+++U3FxsU/fy6lTpxQUFKQLL7zQp3F8FRAQoC1btmjr1q0aN25co7YpKyvT5MmT9emnn2r79u3q3bt3C1cJtO3jvzFX1myq4OBg/f73v9fkyZMb/YF6H3zwgSZOnKirr75aTz75pPz9/VusPjQzA+smTpxoLrroInPixIka933zzTee/8fGxpqHH364Rp8//OEPxs/Pzxw4cMDTJsm8+uqrdT7m/v37TUBAQLVtznbPPfeYwYMHm7Vr15ru3bubkJAQc91111WracaMGebqq682DzzwgImOjjaxsbG11pqTk2NGjRplnE6niY+PNy6Xq1qNubm5RpJ5+eWXzWWXXWZCQkLMoEGDzM6dO40xxmzdutVIqvZ1zz331Fr3M888Yzp06GDmzJljhg8f7mn/5ptvjCSzdevWGj+nb775xowaNcoMHDjQ5Ofn1/kzqbJ+/XpzySWXmKCgINO1a1czb948z33ffvutmTNnjrnwwgvNBRdcYMaNG2f27t1b4+d69s+wyksvvWQGDBhggoODTadOncz48eNr/d1A+9Baj39jjElLSzNdunQx4eHh5sYbbzR33XVXvb+7Y8eONbfccotZuHCh6dixo+nSpYtZt26dOXHihJk5c6YJDw83vXr1MhkZGfU+7tixY80NN9xgIiMjzRNPPOFpf/jhhz3PMcb837FujDFbtmwx4eHh5vbbb693bGPO/FznzJljunTpYpxOp/npT39qNm/e7Ll/x44dZsyYMSY4ONh0797dzJ8/v9r+OXtf/PjnXV5ebubNm2e6du1qnE6niY2NNQ888ECDNZ3veJvGsuPHj+utt97SvHnzFBYWVuP+xrwtsXDhQhlj9Le//a1a+y233KLIyEj97Gc/09q1a1VZWem5b/PmzerVq5feeOMNxcXFqWfPnpo9e7aOHz9ebYxDhw7pxRdf1ObNm/XWW29p7969mjdvXrU+W7ZsUU5Ojlwul954440a9VVWVuqaa65RaGio3n//fT355JM1XsVVWbp0qW6//Xbt3btXffv21a9//WtVVFRo5MiRSk9PV0REhAoKClRQUKDbb7+93p/LsmXLtG/fPv31r3+tt19hYaHGjh2ryspKvfvuu4qOjq63/5o1azRv3jzddNNN2rdvn15//XX16dNH0pmp70mTJqmwsFAZGRnKysrS0KFDNX78+Bo/29oUFBTo17/+tW688Ubl5OTonXfe0bXXXtvgx2+jbWrNx/+LL76oe+65R/fff7/27Nmj6OhorV69usF6/vSnPykyMlL/+Mc/NH/+fP3ud7/TL3/5S40cOVIffvihJkyYoGnTpqmsrKzecSIiInT33XdrxYoVOnnyZL19X331VU2aNElLly7Vf//3f9fbt7KyUhMnTtTOnTv13HPPaf/+/fqv//ovzyzKvn37NGHCBF177bX65z//qU2bNmn79u265ZZbGvzeJenRRx/V66+/rhdffFEHDx7Uc889V+2tJdTBbhbC+++/bySZV155pcG+db0yMsaYqKgo87vf/c5z+9577zU7d+402dnZZuXKlSY0NNTce++9nvtvvvlm43Q6zaWXXmree+89s3XrVjNkyBAzbtw4T5977rnH+Pv7my+++MLT9uabbxo/Pz9TUFBgjDnzyigqKsqUl5fXWeubb75pAgICPNsYY+qcGXn66ac9fT755BMjyeTk5Bhjqr8Kqs+P+y1evNj07dvXuN3uOmdGgoKCTP/+/c3JkycbHNsYY7p162aWLl1a631btmwxERER5ocffqjW3rt3b7Nu3TpjTP0zI1lZWUaSOXLkSKNqQdvWmo//xMREk5KSUu1xLr300gZnRkaPHu25XVFRYcLCwsy0adM8bQUFBUaS2bVrV53f69ixY83ChQvNDz/8YGJjY82KFSuMMbXPjPj7+xt/f3/zn//5n3WO92Nvv/228fPzMwcPHqz1/mnTppmbbrqpWtu2bduMn5+f+f77740x9c+MzJ8/31x++eWmsrKyUfXgDGZGLDP/+4rX4XD4PM6Px/j973+vxMREDRkyRLfddptWrFhR7RVDZWWlysvL9eyzz2rMmDG67LLLtH79em3dulUHDx709OvRo0e1T0xOTExUZWVltT4DBw5UUFBQnbUdPHhQMTEx6tq1q6dt+PDhtfYdNGiQ5/9VMxRFRUWN+RHU6q677tLXX3+tDRs21Nnnyiuv1Keffqp169Y1OF5RUZHy8/M1fvz4Wu/PysrSiRMn1LlzZ4WHh3u+cnNzdfjw4QbHHzx4sMaPH6+BAwfql7/8pZ566il98803DW6Htqk1H/85OTlKTEys9jhn367Nj49hf39/de7cWQMHDvS0RUVFSWrcce10Oj2117WeJSQkRElJSXrqqaeUk5PT4Jh79+5V9+7d1bdv31rvz8rK0saNG6sdvxMmTFBlZaVyc3MbHH/mzJnau3ev+vXrpwULFigzM7PBbcDZNNZdfPHFcjgcjTqI6nLs2DF9/fXXiouLq7PPiBEjVFJSoq+++krSmT/0AQEB1Q7I+Ph4SVJeXl6d41Q94f34ia+26eUfO/uJsj4/XqhWtc2Pp5e91bFjRy1ZskTLly+vc1r4t7/9rZ555hndcccdWrlyZb3jhYSE1Ht/ZWWloqOjtXfv3mpfBw8e1B133NFgvf7+/nK5XHrzzTd1ySWX6LHHHlO/fv0a9SSItqetHf+NcfZiU4fD4dNx/dvf/lY9e/bUfffdV+v9/v7+eu2115SQkKBx48Zp//799Y7XmGP45ptvrnb8fvTRR/rXv/7VqEXtQ4cOVW5uru699159//33mjJliq677roGtzvfEUYs69SpkyZMmKAnnnii1vdFv/322wbHeOSRR+Tn51fv+f7Z2dkKDg72vAc9atQoVVRUVHu1/umnn0qSYmNjPW15eXnKz8/33N61a5f8/PzqfFVRm/79+ysvL8/zRCidWfXuraCgIJ0+fdrr7ebPny8/Pz898sgjdfaZPn26/vSnP2nx4sV68MEH6+x3wQUXqGfPntVOufyxoUOHqrCwUAEBAerTp0+1r8jIyEbV63A4NGrUKC1fvlzZ2dkKCgrSq6++2qht0ba05uM/Pj5eu3fvrjbO2bfPBT8/P6WlpWnNmjU6cuRIrX2cTqdeeeUVDR8+XOPGjdPHH39c53iDBg3Sl19+6fl+zzZ06FB98sknNY7fPn361DsD/GMRERGaOnWqnnrqKW3atEkvv/xyo9aMnc84tbcVWL16tUaOHKnhw4drxYoVGjRokCoqKuRyubRmzZpqr5pKS0tVWFgot9ut3NxcPffcc3r66aeVlpbmWUS5efNmFRYWKjExUSEhIdq6dauWLl2qm266yfNJmVdccYWGDh2qG2+8Uenp6aqsrNS8efOUlJRULWgEBwdrxowZWrlypUpKSrRgwQJNmTKl2lsuDUlKSlLv3r01Y8YMPfjggyotLfUsYPVmerpnz546ceKEtmzZosGDBys0NFShoaENbhccHKzly5fXWHh7tt/85jfy8/PTtGnTVFlZqcWLF9fab9myZUpJSVGXLl00ceJElZaWaseOHZo/f76uuOIKJSYm6pprrtEf//hH9evXT/n5+crIyNA111yjYcOG1VvD+++/ry1btig5OVldunTR+++/r6+//trzqhXtT2s9/hcuXKgZM2Zo2LBhGj16tJ5//nl98skn6tWr1zn/GU2aNEmXXnqp1q1b53mb52xBQUF6+eWXNWXKFF1++eXasmVLtbeHqowdO1b/9m//psmTJ2vVqlXq06ePDhw44Lk20V133aURI0Zo3rx5mjNnjsLCwjwL9B977LEGa3344YcVHR2tIUOGyM/PTy+99JK6du3aqMXI5zWrK1bgkZ+fb+bNm2diY2NNUFCQueiii8xVV11VbbFlbGys57TWoKAg06NHDzNlyhTz97//vdpYb775phkyZIgJDw83oaGhZsCAASY9Pd243e5q/Y4ePWquvfZaEx4ebqKioszMmTPNsWPHPPdXLbRcvXq16datmwkODjbXXnutOX78uKfP2QvYflxrbaf2Vi0W3bx5s5Fk3nrrLWPM/y1gzc7O9mxT24LTlJQU07lz50ad2vtjFRUV5pJLLqnz1N4f27RpkwkICDD3339/reMbY8zatWtNv379TGBgoImOjjbz58/33FdSUmLmz59vunXrZgIDA01MTIz5zW9+Y/Ly8owx9S9g3b9/v5kwYYK58MILjdPpNH379jWPPfZYnXWgfWiNx78xxtx///0mMjLShIeHmxkzZpg777yzwQWsCxcurDZGbQtvazvufqy2cXbu3Gkk1Xlqb5VTp06ZyZMnm8jISPPRRx/VOv6xY8fMDTfcYDp37myCg4PNgAEDzBtvvOG5/x//+IdJSkoy4eHhJiwszAwaNKja80F9C1iffPJJM2TIEBMWFmYiIiLM+PHjzYcffljn94ozHMZwziDOvR07dmj06NE6dOgQFxcDgPMcYQTnxKuvvqrw8HBdfPHFOnTokBYuXKif/OQn2r59u+3SAACWsWYE50RpaanuvPNOffHFF4qMjNQVV1yhhx56yHZZAIBWgJkRAABgFaf2AgAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKv+P134xvC66Fd/AAAAAElFTkSuQmCC", 729 | "text/plain": [ 730 | "
" 731 | ] 732 | }, 733 | "metadata": {}, 734 | "output_type": "display_data" 735 | } 736 | ], 737 | "source": [ 738 | "bp_plot = pd.DataFrame(theta_state_df[['CD56bright NK cells', 'CD56dim NK cells']].T/theta_state_df[['CD56bright NK cells', 'CD56dim NK cells']].sum(axis=1).T).T.boxplot()" 739 | ] 740 | }, 741 | { 742 | "cell_type": "code", 743 | "execution_count": 16, 744 | "id": "05e30b54-4072-4f09-a520-cd8f0e9fadac", 745 | "metadata": {}, 746 | "outputs": [], 747 | "source": [ 748 | "figure = bp_plot.get_figure() \n", 749 | "figure.savefig('cd56bright_cd56dim_sarcoma_tcga.pdf', dpi=400)" 750 | ] 751 | }, 752 | { 753 | "cell_type": "code", 754 | "execution_count": null, 755 | "id": "ec80c5e2-4a99-4347-9ec1-881e8ca8687a", 756 | "metadata": {}, 757 | "outputs": [], 758 | "source": [] 759 | }, 760 | { 761 | "cell_type": "code", 762 | "execution_count": 17, 763 | "id": "a2d83d04-88e3-4b52-bbbd-4a35a7601e4a", 764 | "metadata": {}, 765 | "outputs": [], 766 | "source": [ 767 | "theta_state_groups = theta_state_df[['CD56bright NK cells', 'CD56dim NK cells']].copy()" 768 | ] 769 | }, 770 | { 771 | "cell_type": "code", 772 | "execution_count": 18, 773 | "id": "01cbf038-fbbc-40f4-8538-1b7701188a5e", 774 | "metadata": {}, 775 | "outputs": [], 776 | "source": [ 777 | "theta_type_immune = theta_type_df[['T cells', 'Myeloid', 'B cells', 'NK cells', 'NKT cells',]].copy()" 778 | ] 779 | }, 780 | { 781 | "cell_type": "code", 782 | "execution_count": null, 783 | "id": "ac2e6d76-8481-4993-b427-7f6f8ac713bb", 784 | "metadata": {}, 785 | "outputs": [], 786 | "source": [] 787 | }, 788 | { 789 | "cell_type": "code", 790 | "execution_count": 19, 791 | "id": "5b73f275-1c42-4cef-b0a1-011fa3a5154f", 792 | "metadata": {}, 793 | "outputs": [], 794 | "source": [ 795 | "theta_type_immune.index = ['-'.join(x.split('-')[:3]) for x in theta_type_immune.index]" 796 | ] 797 | }, 798 | { 799 | "cell_type": "code", 800 | "execution_count": 20, 801 | "id": "5b3c9aa2-8403-441b-b6d4-813772430f0e", 802 | "metadata": {}, 803 | "outputs": [], 804 | "source": [ 805 | "theta_type_immune = theta_type_immune[~theta_type_immune.index.duplicated(keep='first')]" 806 | ] 807 | }, 808 | { 809 | "cell_type": "code", 810 | "execution_count": 21, 811 | "id": "2022c5a6-2a15-496e-8098-9b79addc9329", 812 | "metadata": {}, 813 | "outputs": [], 814 | "source": [ 815 | "theta_state_groups.index = ['-'.join(x.split('-')[:3]) for x in theta_state_groups.index]" 816 | ] 817 | }, 818 | { 819 | "cell_type": "code", 820 | "execution_count": 22, 821 | "id": "8dcab9cd-2046-4ad0-bea3-d30ed4135467", 822 | "metadata": {}, 823 | "outputs": [], 824 | "source": [ 825 | "theta_state_groups = theta_state_groups[~theta_state_groups.index.duplicated(keep='first')]" 826 | ] 827 | }, 828 | { 829 | "cell_type": "code", 830 | "execution_count": null, 831 | "id": "3d309734-9df1-4818-a06a-593bb012eb81", 832 | "metadata": {}, 833 | "outputs": [], 834 | "source": [] 835 | }, 836 | { 837 | "cell_type": "code", 838 | "execution_count": 23, 839 | "id": "301b9a52-d27e-419f-808e-ca284d19327d", 840 | "metadata": {}, 841 | "outputs": [], 842 | "source": [ 843 | "theta_state_groups_fraction = (theta_state_groups.T/theta_state_groups.sum(axis=1)).T.copy()" 844 | ] 845 | }, 846 | { 847 | "cell_type": "code", 848 | "execution_count": 24, 849 | "id": "27291254-145e-4376-b30d-b749c2ee1020", 850 | "metadata": {}, 851 | "outputs": [], 852 | "source": [ 853 | "theta_type_immune_fraction = (theta_type_immune.T/theta_type_immune.sum(axis=1)).T.copy()" 854 | ] 855 | }, 856 | { 857 | "cell_type": "markdown", 858 | "id": "5f173cd0-59f1-4529-824b-17816cbd837b", 859 | "metadata": {}, 860 | "source": [ 861 | "#### Clinical SARC" 862 | ] 863 | }, 864 | { 865 | "cell_type": "code", 866 | "execution_count": 35, 867 | "id": "00d19a4a-d93d-4594-b436-23436a985276", 868 | "metadata": {}, 869 | "outputs": [], 870 | "source": [ 871 | "%%R -o clin_sarc\n", 872 | "clin_sarc <- clin.dat[1:20]" 873 | ] 874 | }, 875 | { 876 | "cell_type": "code", 877 | "execution_count": 36, 878 | "id": "3d9a9806-6b68-4106-adbf-69bd29350ef7", 879 | "metadata": {}, 880 | "outputs": [], 881 | "source": [ 882 | "sarc_survival_df = pd.read_csv('/tumor-data/TARGET-OS.survival.tsv', sep='\\t')" 883 | ] 884 | }, 885 | { 886 | "cell_type": "code", 887 | "execution_count": 37, 888 | "id": "c0dd160d-5732-4dbe-ad15-d5aa82408607", 889 | "metadata": {}, 890 | "outputs": [], 891 | "source": [ 892 | "sarc_survival_df = sarc_survival_df.drop_duplicates(subset='_PATIENT')" 893 | ] 894 | }, 895 | { 896 | "cell_type": "code", 897 | "execution_count": 38, 898 | "id": "ea19ec9a-0da3-497e-ac62-2ce5d4255581", 899 | "metadata": {}, 900 | "outputs": [], 901 | "source": [ 902 | "clin_sarc = clin_sarc[[x in theta_type_immune.index for x in clin_sarc['submitter_id']]]" 903 | ] 904 | }, 905 | { 906 | "cell_type": "code", 907 | "execution_count": 39, 908 | "id": "8533de78-bf3d-47db-b9d8-328bb7888266", 909 | "metadata": {}, 910 | "outputs": [], 911 | "source": [ 912 | "sarc_survival_df.index = sarc_survival_df['_PATIENT']" 913 | ] 914 | }, 915 | { 916 | "cell_type": "code", 917 | "execution_count": 40, 918 | "id": "7d706a96-4886-4803-a157-fef261913071", 919 | "metadata": {}, 920 | "outputs": [], 921 | "source": [ 922 | "clin_sarc = clin_sarc[[x in sarc_survival_df.index for x in clin_sarc['submitter_id']]]" 923 | ] 924 | }, 925 | { 926 | "cell_type": "code", 927 | "execution_count": 41, 928 | "id": "a3fc78e9-830e-406d-80f1-124877f531c9", 929 | "metadata": {}, 930 | "outputs": [], 931 | "source": [ 932 | "sarc_survival_df = sarc_survival_df.loc[clin_sarc['submitter_id']].copy()" 933 | ] 934 | }, 935 | { 936 | "cell_type": "code", 937 | "execution_count": 42, 938 | "id": "f7985dbd-6a8d-4af8-94f3-31bfbeb80beb", 939 | "metadata": {}, 940 | "outputs": [ 941 | { 942 | "name": "stderr", 943 | "output_type": "stream", 944 | "text": [ 945 | "/tmp/ipykernel_584069/3320016945.py:1: DeprecationWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`\n", 946 | " clin_sarc.loc[:,sarc_survival_df.columns] = sarc_survival_df.values\n" 947 | ] 948 | } 949 | ], 950 | "source": [ 951 | "clin_sarc.loc[:,sarc_survival_df.columns] = sarc_survival_df.values" 952 | ] 953 | }, 954 | { 955 | "cell_type": "code", 956 | "execution_count": null, 957 | "id": "e4197c1f-72ae-43d9-8540-01c1a4ec5617", 958 | "metadata": {}, 959 | "outputs": [], 960 | "source": [] 961 | }, 962 | { 963 | "cell_type": "code", 964 | "execution_count": 43, 965 | "id": "b5ee2ddc-531f-4d48-a23a-f0467651b0b1", 966 | "metadata": {}, 967 | "outputs": [], 968 | "source": [ 969 | "clin_sarc['total_nk'] = ['high' if x in theta_type_immune.sort_values('NK cells')[-int(theta_type_immune.shape[0]/3):].index \n", 970 | " else 'low' if x in theta_type_immune.sort_values('NK cells')[:int(theta_type_immune.shape[0]/3)].index else 'middle' for x in clin_sarc['submitter_id']]" 971 | ] 972 | }, 973 | { 974 | "cell_type": "code", 975 | "execution_count": 44, 976 | "id": "af56602c-12b6-4a99-9a54-2f11cf608dd6", 977 | "metadata": {}, 978 | "outputs": [], 979 | "source": [ 980 | "cell_state='CD56bright NK cells'\n", 981 | "clin_sarc['cd56bright'] = ['high' if x in theta_state_groups.sort_values(cell_state)[-int(theta_state_groups.shape[0]/3):].index \n", 982 | " else 'low' if x in theta_state_groups.sort_values(cell_state)[:int(theta_state_groups.shape[0]/3)].index else 'middle' for x in clin_sarc['submitter_id']]" 983 | ] 984 | }, 985 | { 986 | "cell_type": "code", 987 | "execution_count": 45, 988 | "id": "6af859c3-dfce-4f2c-802d-c7f5a44a0c76", 989 | "metadata": {}, 990 | "outputs": [], 991 | "source": [ 992 | "cell_state='CD56dim NK cells'\n", 993 | "clin_sarc['cd56dim'] = ['high' if x in theta_state_groups.sort_values(cell_state)[-int(theta_state_groups.shape[0]/3):].index \n", 994 | " else 'low' if x in theta_state_groups.sort_values(cell_state)[:int(theta_state_groups.shape[0]/3)].index else 'middle' for x in clin_sarc['submitter_id']]" 995 | ] 996 | }, 997 | { 998 | "cell_type": "code", 999 | "execution_count": null, 1000 | "id": "3751f140-a483-4f94-a1a4-ad129e041a50", 1001 | "metadata": {}, 1002 | "outputs": [], 1003 | "source": [] 1004 | }, 1005 | { 1006 | "cell_type": "markdown", 1007 | "id": "3bcfd948-e1f8-4851-b80c-09b1c9cf7c0c", 1008 | "metadata": {}, 1009 | "source": [ 1010 | "#### Stratify by NK, CD56bright and CD56dim" 1011 | ] 1012 | }, 1013 | { 1014 | "cell_type": "code", 1015 | "execution_count": 46, 1016 | "id": "d3955ba3-1080-4eb3-ada1-0b3609f021e3", 1017 | "metadata": {}, 1018 | "outputs": [], 1019 | "source": [ 1020 | "test_group='total_nk'" 1021 | ] 1022 | }, 1023 | { 1024 | "cell_type": "code", 1025 | "execution_count": 47, 1026 | "id": "23a0a87a-427f-46df-b0e3-6452572d51e6", 1027 | "metadata": {}, 1028 | "outputs": [], 1029 | "source": [ 1030 | "clin_sarc_test = clin_sarc[clin_sarc[f'{test_group}'] != 'middle'].copy()" 1031 | ] 1032 | }, 1033 | { 1034 | "cell_type": "code", 1035 | "execution_count": 48, 1036 | "id": "da9cfe55-9587-46a7-92d8-dfe5eee32b37", 1037 | "metadata": {}, 1038 | "outputs": [], 1039 | "source": [ 1040 | "%%R\n", 1041 | "library(survival)\n", 1042 | "library(\"survminer\")" 1043 | ] 1044 | }, 1045 | { 1046 | "cell_type": "code", 1047 | "execution_count": 49, 1048 | "id": "d1102d5a-324b-4cce-a741-ac70f1801512", 1049 | "metadata": {}, 1050 | "outputs": [], 1051 | "source": [ 1052 | "%%R -i clin_sarc_test\n", 1053 | "clin_sarc_test$OS=as.numeric(clin_sarc_test$OS)\n", 1054 | "clin_sarc_test$OS.time=as.numeric(clin_sarc_test$OS.time)\n", 1055 | "\n", 1056 | "clin_sarc_test$OS.time <- clin_sarc_test$OS.time / 365\n", 1057 | "\n", 1058 | "clin_sarc_test$OS[clin_sarc_test$OS.time>7] <- 0\n", 1059 | "clin_sarc_test$OS.time[clin_sarc_test$OS.time>7] <- 7\n", 1060 | "\n", 1061 | "clin_sarc_test$OS.use=clin_sarc_test$OS\n", 1062 | "clin_sarc_test$OS.time.use=clin_sarc_test$OS.time" 1063 | ] 1064 | }, 1065 | { 1066 | "cell_type": "code", 1067 | "execution_count": 50, 1068 | "id": "636acda2-0513-4dc2-9bac-febf8eb73ba6", 1069 | "metadata": {}, 1070 | "outputs": [], 1071 | "source": [ 1072 | "#%%R\n", 1073 | "#cox = coxph(Surv(OS.time.use,OS.use) ~ g1 + gender + age_at_index + ajcc_pathologic_stage, data=clin_sarc_test)" 1074 | ] 1075 | }, 1076 | { 1077 | "cell_type": "code", 1078 | "execution_count": 51, 1079 | "id": "558ee1ad-5212-4225-afc2-72c44cad8184", 1080 | "metadata": {}, 1081 | "outputs": [], 1082 | "source": [ 1083 | "%%R -i test_group\n", 1084 | "#form = as.formula(paste('Surv(OS.time.use,OS.use)', '~', test_group))\n", 1085 | "fit = survfit(as.formula(paste('Surv(OS.time.use,OS.use)', '~', test_group)), data=clin_sarc_test)" 1086 | ] 1087 | }, 1088 | { 1089 | "cell_type": "code", 1090 | "execution_count": 52, 1091 | "id": "d9fcbe81-9ad3-4478-853c-1ba3d28da488", 1092 | "metadata": {}, 1093 | "outputs": [ 1094 | { 1095 | "name": "stdout", 1096 | "output_type": "stream", 1097 | "text": [ 1098 | "png \n", 1099 | " 2 \n" 1100 | ] 1101 | } 1102 | ], 1103 | "source": [ 1104 | "%%R\n", 1105 | "dir=\"\"\n", 1106 | "cancer=paste('SARC', '_', test_group)\n", 1107 | "p = ggsurvplot(fit, clin_sarc_test, size=0.3, vlegend.labs=unique(clin_sarc_test[[test_group]]),\n", 1108 | " surv.median.line=\"none\", pval=T, conf.int=F,\n", 1109 | " palette=c(\"#990066\",\"#CCCCCC\"),title=cancer) + \n", 1110 | " xlab(\"Years\")\n", 1111 | " \n", 1112 | "pdf(file=sprintf(\"survival_%s.pdf\", cancer), width=3, height=3,onefile = FALSE)\n", 1113 | "print(p)\n", 1114 | "dev.off()" 1115 | ] 1116 | }, 1117 | { 1118 | "cell_type": "code", 1119 | "execution_count": null, 1120 | "id": "b4886f2e-69a8-4966-8b36-184058c6e808", 1121 | "metadata": {}, 1122 | "outputs": [], 1123 | "source": [] 1124 | }, 1125 | { 1126 | "cell_type": "code", 1127 | "execution_count": null, 1128 | "id": "d8d1dfa4-7a88-4c99-9203-9c7a296493be", 1129 | "metadata": {}, 1130 | "outputs": [], 1131 | "source": [] 1132 | }, 1133 | { 1134 | "cell_type": "markdown", 1135 | "id": "4af1fd89-99dd-4ce7-a615-3b1c9df13b6b", 1136 | "metadata": {}, 1137 | "source": [ 1138 | "#### Score NK cell states" 1139 | ] 1140 | }, 1141 | { 1142 | "cell_type": "code", 1143 | "execution_count": 53, 1144 | "id": "e8a4b598-0897-4fcd-8081-5e976e7f64b3", 1145 | "metadata": {}, 1146 | "outputs": [], 1147 | "source": [ 1148 | "from pyscenic.aucell import aucell\n", 1149 | "from ctxcore.genesig import GeneSignature\n", 1150 | "from pyscenic.aucell import create_rankings, enrichment" 1151 | ] 1152 | }, 1153 | { 1154 | "cell_type": "code", 1155 | "execution_count": null, 1156 | "id": "9a0c1a11-f727-4db3-9322-e9b1fec8d583", 1157 | "metadata": {}, 1158 | "outputs": [], 1159 | "source": [] 1160 | }, 1161 | { 1162 | "cell_type": "code", 1163 | "execution_count": 82, 1164 | "id": "5f887f91-1580-48a0-b3fb-1e53e27c6a73", 1165 | "metadata": {}, 1166 | "outputs": [], 1167 | "source": [ 1168 | "all_groups_deg = pd.read_csv('nhood_markers_all.csv')" 1169 | ] 1170 | }, 1171 | { 1172 | "cell_type": "code", 1173 | "execution_count": 83, 1174 | "id": "2df736c9-f190-4aef-9151-b6f45dd8d0b4", 1175 | "metadata": {}, 1176 | "outputs": [], 1177 | "source": [ 1178 | "for group in range(1,7):\n", 1179 | " all_groups_deg[f'rank_{group}'] = all_groups_deg[f'logFC_{group}']*-np.log10(all_groups_deg[f'adj.P.Val_{group}'])" 1180 | ] 1181 | }, 1182 | { 1183 | "cell_type": "code", 1184 | "execution_count": 84, 1185 | "id": "174b5fa8-6658-48f8-b65e-56884fdca455", 1186 | "metadata": {}, 1187 | "outputs": [], 1188 | "source": [ 1189 | "group = 1\n", 1190 | "g1_sig = np.array(all_groups_deg.sort_values(f'rank_{group}')[-30:]['GeneID'])" 1191 | ] 1192 | }, 1193 | { 1194 | "cell_type": "code", 1195 | "execution_count": 85, 1196 | "id": "532598c3-5e9d-4ecd-a7f5-b577ed9afc67", 1197 | "metadata": {}, 1198 | "outputs": [], 1199 | "source": [ 1200 | "group = 2\n", 1201 | "g2_sig = np.array(all_groups_deg.sort_values(f'rank_{group}')[-30:]['GeneID'])" 1202 | ] 1203 | }, 1204 | { 1205 | "cell_type": "code", 1206 | "execution_count": 86, 1207 | "id": "44c5db66-14c5-45ab-ac8b-e6a68e011ac8", 1208 | "metadata": {}, 1209 | "outputs": [], 1210 | "source": [ 1211 | "group = 3\n", 1212 | "g3_sig = np.array(all_groups_deg.sort_values(f'rank_{group}')[-30:]['GeneID'])" 1213 | ] 1214 | }, 1215 | { 1216 | "cell_type": "code", 1217 | "execution_count": 87, 1218 | "id": "4de9ce49-0fd7-4d56-828b-45b19b61bc18", 1219 | "metadata": {}, 1220 | "outputs": [], 1221 | "source": [ 1222 | "group = 4\n", 1223 | "g4_sig = np.array(all_groups_deg.sort_values(f'rank_{group}')[-30:]['GeneID'])" 1224 | ] 1225 | }, 1226 | { 1227 | "cell_type": "code", 1228 | "execution_count": 88, 1229 | "id": "73b54f8d-43bb-4bb0-8781-d40d3285f74c", 1230 | "metadata": {}, 1231 | "outputs": [], 1232 | "source": [ 1233 | "group = 5\n", 1234 | "g5_sig = np.array(all_groups_deg.sort_values(f'rank_{group}')[-30:]['GeneID'])" 1235 | ] 1236 | }, 1237 | { 1238 | "cell_type": "code", 1239 | "execution_count": 89, 1240 | "id": "fb6c6089-a94e-4d39-86cc-cc5b558f2f1b", 1241 | "metadata": {}, 1242 | "outputs": [], 1243 | "source": [ 1244 | "group = 6\n", 1245 | "g6_sig = np.array(all_groups_deg.sort_values(f'rank_{group}')[-30:]['GeneID'])" 1246 | ] 1247 | }, 1248 | { 1249 | "cell_type": "code", 1250 | "execution_count": null, 1251 | "id": "ccbc8921-f606-432a-b457-4bb6ef26c7c1", 1252 | "metadata": {}, 1253 | "outputs": [], 1254 | "source": [] 1255 | }, 1256 | { 1257 | "cell_type": "code", 1258 | "execution_count": 64, 1259 | "id": "8d26171f-c3e8-4758-9e7a-8152f4851ff8", 1260 | "metadata": {}, 1261 | "outputs": [], 1262 | "source": [ 1263 | "signature_genes = [g1_sig,g2_sig,g3_sig,g4_sig,g5_sig,g6_sig]\n", 1264 | "signature_names = [f'g{x}' for x in range(1,7)]" 1265 | ] 1266 | }, 1267 | { 1268 | "cell_type": "code", 1269 | "execution_count": null, 1270 | "id": "c2837b2e-8325-4ef0-a27d-080ce0bda7c3", 1271 | "metadata": {}, 1272 | "outputs": [], 1273 | "source": [] 1274 | }, 1275 | { 1276 | "cell_type": "code", 1277 | "execution_count": 65, 1278 | "id": "179e1677-e787-440e-b883-a50d85f9fa2b", 1279 | "metadata": {}, 1280 | "outputs": [], 1281 | "source": [ 1282 | "gene_sigs = [GeneSignature(name,genes) for (name,genes) in zip(signature_names, signature_genes)]" 1283 | ] 1284 | }, 1285 | { 1286 | "cell_type": "code", 1287 | "execution_count": 66, 1288 | "id": "a3cd91fe-766a-4701-91c7-cf0e71140924", 1289 | "metadata": {}, 1290 | "outputs": [], 1291 | "source": [ 1292 | "exp_df = Z_nk_adata.to_df()#pd.DataFrame(adata.X.todense(), columns=adata.var.index, index=adata.obs.index)" 1293 | ] 1294 | }, 1295 | { 1296 | "cell_type": "code", 1297 | "execution_count": 67, 1298 | "id": "7f06c825-276a-4603-af83-bf74664a1505", 1299 | "metadata": {}, 1300 | "outputs": [], 1301 | "source": [ 1302 | "import random" 1303 | ] 1304 | }, 1305 | { 1306 | "cell_type": "code", 1307 | "execution_count": 68, 1308 | "id": "f3b78f49-b4ab-4781-88fa-7c59685a608b", 1309 | "metadata": {}, 1310 | "outputs": [], 1311 | "source": [ 1312 | "random.seed(0)" 1313 | ] 1314 | }, 1315 | { 1316 | "cell_type": "code", 1317 | "execution_count": 69, 1318 | "id": "417bfe4d-a333-4b63-84d0-2610818021c0", 1319 | "metadata": {}, 1320 | "outputs": [], 1321 | "source": [ 1322 | "auc_mtx = aucell(exp_df, gene_sigs, num_workers=4) #normalize=True, " 1323 | ] 1324 | }, 1325 | { 1326 | "cell_type": "code", 1327 | "execution_count": 70, 1328 | "id": "79427fa9-b6a1-4ef7-9467-61318a929dd7", 1329 | "metadata": {}, 1330 | "outputs": [], 1331 | "source": [ 1332 | "auc_mtx.index = ['-'.join(x.split('-')[:3]) for x in auc_mtx.index]" 1333 | ] 1334 | }, 1335 | { 1336 | "cell_type": "code", 1337 | "execution_count": 71, 1338 | "id": "d9f7edb2-8f9b-48d1-b5f5-7c0582a9fb93", 1339 | "metadata": {}, 1340 | "outputs": [], 1341 | "source": [ 1342 | "auc_mtx = auc_mtx[~auc_mtx.index.duplicated(keep='first')]" 1343 | ] 1344 | }, 1345 | { 1346 | "cell_type": "code", 1347 | "execution_count": 72, 1348 | "id": "4ccfd324-cf00-402f-a328-38d650d3c7a6", 1349 | "metadata": {}, 1350 | "outputs": [], 1351 | "source": [ 1352 | "auc_mtx = auc_mtx.loc[clin_sarc['submitter_id']]" 1353 | ] 1354 | }, 1355 | { 1356 | "cell_type": "code", 1357 | "execution_count": null, 1358 | "id": "b2952d29-f759-4c47-b48e-4fdb825e7a26", 1359 | "metadata": {}, 1360 | "outputs": [], 1361 | "source": [] 1362 | }, 1363 | { 1364 | "cell_type": "code", 1365 | "execution_count": 73, 1366 | "id": "c749a55b-f672-432f-92cd-008a4c21318f", 1367 | "metadata": {}, 1368 | "outputs": [], 1369 | "source": [ 1370 | "for i in range(1,7):\n", 1371 | " nk_state=i\n", 1372 | " clin_sarc[f'g{nk_state}'] = ['high' if x in auc_mtx.sort_values(f'g{nk_state}')[-int(auc_mtx.shape[0]/2):].index \n", 1373 | " else 'low' if x in auc_mtx.sort_values(f'g{nk_state}')[:int(auc_mtx.shape[0]/2)].index else 'middle' for x in clin_sarc['submitter_id']]" 1374 | ] 1375 | }, 1376 | { 1377 | "cell_type": "code", 1378 | "execution_count": 74, 1379 | "id": "9c04681f-53fe-4508-a761-e664195df435", 1380 | "metadata": {}, 1381 | "outputs": [], 1382 | "source": [ 1383 | "clin_sarc['g1g3'] = [f'{x[:2]}_{y[:2]}' for x,y in zip(clin_sarc['g1'], clin_sarc['g3'])]" 1384 | ] 1385 | }, 1386 | { 1387 | "cell_type": "code", 1388 | "execution_count": null, 1389 | "id": "a752c09a-7668-4af3-a7a7-fdf04888378d", 1390 | "metadata": {}, 1391 | "outputs": [], 1392 | "source": [] 1393 | }, 1394 | { 1395 | "cell_type": "code", 1396 | "execution_count": 75, 1397 | "id": "a11b0f38-1f09-4b04-a1e2-8b80e4d1f5ee", 1398 | "metadata": {}, 1399 | "outputs": [], 1400 | "source": [ 1401 | "clin_sarc_test = clin_sarc[clin_sarc['g1g3'].isin(['lo_hi', 'hi_lo'])].copy()" 1402 | ] 1403 | }, 1404 | { 1405 | "cell_type": "code", 1406 | "execution_count": 76, 1407 | "id": "94aff084-d75a-4a8a-b97b-b45aa79fb9e1", 1408 | "metadata": {}, 1409 | "outputs": [], 1410 | "source": [ 1411 | "%%R\n", 1412 | "library(survival)\n", 1413 | "library(\"survminer\")" 1414 | ] 1415 | }, 1416 | { 1417 | "cell_type": "code", 1418 | "execution_count": 77, 1419 | "id": "3faf821e-2ba2-4766-b546-f9ec6b87ee51", 1420 | "metadata": {}, 1421 | "outputs": [], 1422 | "source": [ 1423 | "%%R -i clin_sarc_test\n", 1424 | "clin_sarc_test$OS=as.numeric(clin_sarc_test$OS)\n", 1425 | "clin_sarc_test$OS.time=as.numeric(clin_sarc_test$OS.time)\n", 1426 | "\n", 1427 | "clin_sarc_test$OS.time <- clin_sarc_test$OS.time / 365\n", 1428 | "\n", 1429 | "clin_sarc_test$OS[clin_sarc_test$OS.time>7] <- 0\n", 1430 | "clin_sarc_test$OS.time[clin_sarc_test$OS.time>7] <- 7\n", 1431 | "\n", 1432 | "clin_sarc_test$OS.use=clin_sarc_test$OS\n", 1433 | "clin_sarc_test$OS.time.use=clin_sarc_test$OS.time" 1434 | ] 1435 | }, 1436 | { 1437 | "cell_type": "code", 1438 | "execution_count": 78, 1439 | "id": "b2ab76f1-343d-47e8-be17-b0f96a81910d", 1440 | "metadata": {}, 1441 | "outputs": [], 1442 | "source": [ 1443 | "#%%R\n", 1444 | "#cox = coxph(Surv(OS.time.use,OS.use) ~ g1 + gender + age_at_index + ajcc_pathologic_stage, data=clin_sarc_test)" 1445 | ] 1446 | }, 1447 | { 1448 | "cell_type": "code", 1449 | "execution_count": 79, 1450 | "id": "b2092821-c1a9-4d1a-bebf-a61f6912a706", 1451 | "metadata": {}, 1452 | "outputs": [], 1453 | "source": [ 1454 | "%%R\n", 1455 | "fit = survfit(Surv(OS.time.use,OS.use) ~ g1g3, data=clin_sarc_test)" 1456 | ] 1457 | }, 1458 | { 1459 | "cell_type": "code", 1460 | "execution_count": 80, 1461 | "id": "141d3089-a904-44f5-b554-2f9919d92a1b", 1462 | "metadata": {}, 1463 | "outputs": [ 1464 | { 1465 | "name": "stdout", 1466 | "output_type": "stream", 1467 | "text": [ 1468 | "png \n", 1469 | " 2 \n" 1470 | ] 1471 | } 1472 | ], 1473 | "source": [ 1474 | "%%R\n", 1475 | "dir=\"\"\n", 1476 | "cancer='SARC_g1g3'\n", 1477 | "p = ggsurvplot(fit, clin_sarc_test, size=0.3, vlegend.labs=unique(clin_sarc_test$g1g3),\n", 1478 | " surv.median.line=\"none\", pval=T, conf.int=F,\n", 1479 | " #risk.table=T, risk.table.y.text.col=T,\n", 1480 | " palette=c(\"#CCCCCC\", \"#990066\"),title=cancer) + \n", 1481 | " xlab(\"Years\")\n", 1482 | " \n", 1483 | "pdf(file=sprintf(\"survival_%s.pdf\", cancer), width=3, height=3,onefile = FALSE)\n", 1484 | "print(p)\n", 1485 | "dev.off()" 1486 | ] 1487 | }, 1488 | { 1489 | "cell_type": "code", 1490 | "execution_count": null, 1491 | "id": "4efc8de6-2a32-4a5f-8623-06db71f7a1c1", 1492 | "metadata": {}, 1493 | "outputs": [], 1494 | "source": [] 1495 | }, 1496 | { 1497 | "cell_type": "code", 1498 | "execution_count": null, 1499 | "id": "fb80ca63-82b6-4df5-9d20-4114204bb002", 1500 | "metadata": {}, 1501 | "outputs": [], 1502 | "source": [] 1503 | }, 1504 | { 1505 | "cell_type": "code", 1506 | "execution_count": null, 1507 | "id": "83879ef4-f5b7-4cb7-b5af-abb0b944d9c1", 1508 | "metadata": {}, 1509 | "outputs": [], 1510 | "source": [] 1511 | }, 1512 | { 1513 | "cell_type": "code", 1514 | "execution_count": null, 1515 | "id": "9369a174-49f5-48b5-9cb3-967d04618bbf", 1516 | "metadata": {}, 1517 | "outputs": [], 1518 | "source": [] 1519 | } 1520 | ], 1521 | "metadata": { 1522 | "kernelspec": { 1523 | "display_name": "Python 3 (ipykernel)", 1524 | "language": "python", 1525 | "name": "python3" 1526 | }, 1527 | "language_info": { 1528 | "codemirror_mode": { 1529 | "name": "ipython", 1530 | "version": 3 1531 | }, 1532 | "file_extension": ".py", 1533 | "mimetype": "text/x-python", 1534 | "name": "python", 1535 | "nbconvert_exporter": "python", 1536 | "pygments_lexer": "ipython3", 1537 | "version": "3.9.16" 1538 | } 1539 | }, 1540 | "nbformat": 4, 1541 | "nbformat_minor": 5 1542 | } 1543 | --------------------------------------------------------------------------------