1. Load Libraries
2. load seurat object
#Load Seurat Object L7
load("../../0-robj/5-Harmony_Integrated_All_samples_Merged_CD4Tcells_final_Resolution_Selected_0.8_ADT_Normalized_cleaned_mt.robj")
All_samples_Merged
An object of class Seurat
62900 features across 49305 samples within 6 assays
Active assay: SCT (26176 features, 3000 variable features)
3 layers present: counts, data, scale.data
5 other assays present: RNA, ADT, prediction.score.celltype.l1, prediction.score.celltype.l2, prediction.score.celltype.l3
5 dimensional reductions calculated: integrated_dr, ref.umap, pca, umap, harmony
3. Load Data
3.1 Load CSV Files with Mean Expression
# Load the CSV files with mean expression data
P1_vs_P2 <- read.csv("comparison_P1_vs_P2.csv", row.names = 1)
4. Compute Mean Expression for Groups
library(Seurat)
library(dplyr)
# Define cell groups
group1_cells <- WhichCells(All_samples_Merged, idents = c("5", "1", "9")) # Malignant CD4+ T cells
group2_cells <- WhichCells(All_samples_Merged, idents = c("2", "6", "8")) # Normal CD4+ T cells
# Extract normalized expression values for both assays
expression_data_SCT <- GetAssayData(All_samples_Merged, assay = "SCT", layer = "data") # SCT-normalized counts (not Pearson residuals)
# Function to calculate mean expression for each group
calculate_mean_expression <- function(markers, group1_cells, group2_cells, expression_data) {
group1_mean <- rowMeans(expression_data[, group1_cells, drop = FALSE], na.rm = TRUE)
group2_mean <- rowMeans(expression_data[, group2_cells, drop = FALSE], na.rm = TRUE)
markers <- markers %>%
rownames_to_column("gene") %>%
mutate(mean_expr_group1 = group1_mean[gene],
mean_expr_group2 = group2_mean[gene])
return(markers)
}
# Compute mean expression P1_vs_P2
P1_vs_P2 <- calculate_mean_expression(P1_vs_P2, group1_cells, group2_cells, expression_data_SCT)
# Save updated results with mean expression
write.csv(P1_vs_P2, file = "comparison_P1_vs_P2_with_mean_expression.csv", row.names = TRUE)
5. Summarize Results
5.1 Summary Function
summarize_markers <- function(markers) {
num_pval0 <- sum(markers$p_val_adj == 0)
num_pval1 <- sum(markers$p_val_adj == 1)
num_significant <- sum(markers$p_val_adj < 0.05)
num_upregulated <- sum(markers$avg_log2FC > 1)
num_downregulated <- sum(markers$avg_log2FC < -1)
cat("Number of genes with p_val_adj = 0:", num_pval0, "\n")
cat("Number of genes with p_val_adj = 1:", num_pval1, "\n")
cat("Number of significant genes (p_val_adj < 0.05):", num_significant, "\n")
cat("Number of upregulated genes (avg_log2FC > 1):", num_upregulated, "\n")
cat("Number of downregulated genes (avg_log2FC < -1):", num_downregulated, "\n")
}
5.2 Summarize Markers1 (P1_vs_P2)
cat("Markers1 Summary (P1_vs_P2):\n")
Markers1 Summary (P1_vs_P2):
summarize_markers(P1_vs_P2)
Number of genes with p_val_adj = 0: 0
Number of genes with p_val_adj = 1: 5134
Number of significant genes (p_val_adj < 0.05): 7299
Number of upregulated genes (avg_log2FC > 1): 2486
Number of downregulated genes (avg_log2FC < -1): 2772
6. Filter and Summarize Results
6.1 Apply Expression Filter First
# Apply the expression filter first
P1_vs_P2 <- P1_vs_P2 %>%
filter(!(mean_expr_group1 < 0.2 & mean_expr_group2 < 0.2))
6.2 Summary Function
summarize_markers <- function(markers) {
num_pval0 <- sum(markers$p_val_adj == 0)
num_pval1 <- sum(markers$p_val_adj == 1)
num_significant <- sum(markers$p_val_adj < 0.05)
num_upregulated <- sum(markers$avg_log2FC > 1)
num_downregulated <- sum(markers$avg_log2FC < -1)
cat("Number of genes with p_val_adj = 0:", num_pval0, "\n")
cat("Number of genes with p_val_adj = 1:", num_pval1, "\n")
cat("Number of significant genes (p_val_adj < 0.05):", num_significant, "\n")
cat("Number of upregulated genes (avg_log2FC > 1):", num_upregulated, "\n")
cat("Number of downregulated genes (avg_log2FC < -1):", num_downregulated, "\n")
}
5.3 Summarize Markers1 (P1_vs_P2)
cat("Markers1 Summary (P1_vs_P2):\n")
Markers1 Summary (P1_vs_P2):
summarize_markers(P1_vs_P2)
Number of genes with p_val_adj = 0: 0
Number of genes with p_val_adj = 1: 1347
Number of significant genes (p_val_adj < 0.05): 4015
Number of upregulated genes (avg_log2FC > 1): 722
Number of downregulated genes (avg_log2FC < -1): 756
LS0tCnRpdGxlOiAiYWRkaW5nIE1lYW4gRXhwcmVzc2lvbl9QMV92c19QMiAtIEZpbHRlcmluZyBhbmQgVmlzdWFsaXphdGlvbl9QYXRpZW50cyIKYXV0aG9yOiBOYXNpciBNYWhtb29kIEFiYmFzaQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKLS0tCgojIDEuIExvYWQgTGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoRW5oYW5jZWRWb2xjYW5vKQpsaWJyYXJ5KHBoZWF0bWFwKQpsaWJyYXJ5KHRpYmJsZSkKYGBgCgojIDIuIGxvYWQgc2V1cmF0IG9iamVjdApgYGB7ciBsb2FkX3NldXJhdH0KI0xvYWQgU2V1cmF0IE9iamVjdCBMNwpsb2FkKCIuLi8uLi8wLXJvYmovNS1IYXJtb255X0ludGVncmF0ZWRfQWxsX3NhbXBsZXNfTWVyZ2VkX0NENFRjZWxsc19maW5hbF9SZXNvbHV0aW9uX1NlbGVjdGVkXzAuOF9BRFRfTm9ybWFsaXplZF9jbGVhbmVkX210LnJvYmoiKQoKCgpBbGxfc2FtcGxlc19NZXJnZWQKCgoKYGBgCgoKIyAzLiBMb2FkIERhdGEKIyMgMy4xIExvYWQgQ1NWIEZpbGVzIHdpdGggTWVhbiBFeHByZXNzaW9uCmBgYHtyfQoKIyBMb2FkIHRoZSBDU1YgZmlsZXMgd2l0aCBtZWFuIGV4cHJlc3Npb24gZGF0YQpQMV92c19QMiA8LSByZWFkLmNzdigiY29tcGFyaXNvbl9QMV92c19QMi5jc3YiLCByb3cubmFtZXMgPSAxKQoKCmBgYAoKIyA0LiBDb21wdXRlIE1lYW4gRXhwcmVzc2lvbiBmb3IgR3JvdXBzCmBgYHtyfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShkcGx5cikKCiMgRGVmaW5lIGNlbGwgZ3JvdXBzCmdyb3VwMV9jZWxscyA8LSBXaGljaENlbGxzKEFsbF9zYW1wbGVzX01lcmdlZCwgaWRlbnRzID0gYygiNSIsICIxIiwgIjkiKSkgICMgTWFsaWduYW50IENENCsgVCBjZWxscwpncm91cDJfY2VsbHMgPC0gV2hpY2hDZWxscyhBbGxfc2FtcGxlc19NZXJnZWQsIGlkZW50cyA9IGMoIjIiLCAiNiIsICI4IikpICAjIE5vcm1hbCBDRDQrIFQgY2VsbHMKCiMgRXh0cmFjdCBub3JtYWxpemVkIGV4cHJlc3Npb24gdmFsdWVzIGZvciBib3RoIGFzc2F5cwpleHByZXNzaW9uX2RhdGFfU0NUIDwtIEdldEFzc2F5RGF0YShBbGxfc2FtcGxlc19NZXJnZWQsIGFzc2F5ID0gIlNDVCIsIGxheWVyID0gImRhdGEiKSAgIyBTQ1Qtbm9ybWFsaXplZCBjb3VudHMgKG5vdCBQZWFyc29uIHJlc2lkdWFscykKCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG1lYW4gZXhwcmVzc2lvbiBmb3IgZWFjaCBncm91cApjYWxjdWxhdGVfbWVhbl9leHByZXNzaW9uIDwtIGZ1bmN0aW9uKG1hcmtlcnMsIGdyb3VwMV9jZWxscywgZ3JvdXAyX2NlbGxzLCBleHByZXNzaW9uX2RhdGEpIHsKICBncm91cDFfbWVhbiA8LSByb3dNZWFucyhleHByZXNzaW9uX2RhdGFbLCBncm91cDFfY2VsbHMsIGRyb3AgPSBGQUxTRV0sIG5hLnJtID0gVFJVRSkKICBncm91cDJfbWVhbiA8LSByb3dNZWFucyhleHByZXNzaW9uX2RhdGFbLCBncm91cDJfY2VsbHMsIGRyb3AgPSBGQUxTRV0sIG5hLnJtID0gVFJVRSkKICAKICBtYXJrZXJzIDwtIG1hcmtlcnMgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oImdlbmUiKSAlPiUKICAgIG11dGF0ZShtZWFuX2V4cHJfZ3JvdXAxID0gZ3JvdXAxX21lYW5bZ2VuZV0sCiAgICAgICAgICAgbWVhbl9leHByX2dyb3VwMiA9IGdyb3VwMl9tZWFuW2dlbmVdKQogIAogIHJldHVybihtYXJrZXJzKQp9CgojIENvbXB1dGUgbWVhbiBleHByZXNzaW9uIFAxX3ZzX1AyClAxX3ZzX1AyIDwtIGNhbGN1bGF0ZV9tZWFuX2V4cHJlc3Npb24oUDFfdnNfUDIsIGdyb3VwMV9jZWxscywgZ3JvdXAyX2NlbGxzLCBleHByZXNzaW9uX2RhdGFfU0NUKQoKIyBTYXZlIHVwZGF0ZWQgcmVzdWx0cyB3aXRoIG1lYW4gZXhwcmVzc2lvbgoKd3JpdGUuY3N2KFAxX3ZzX1AyLCBmaWxlID0gImNvbXBhcmlzb25fUDFfdnNfUDJfd2l0aF9tZWFuX2V4cHJlc3Npb24uY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKCmBgYAoKIyA1LiBTdW1tYXJpemUgUmVzdWx0cwojIyA1LjEgU3VtbWFyeSBGdW5jdGlvbgpgYGB7cn0Kc3VtbWFyaXplX21hcmtlcnMgPC0gZnVuY3Rpb24obWFya2VycykgewogIG51bV9wdmFsMCA8LSBzdW0obWFya2VycyRwX3ZhbF9hZGogPT0gMCkKICBudW1fcHZhbDEgPC0gc3VtKG1hcmtlcnMkcF92YWxfYWRqID09IDEpCiAgbnVtX3NpZ25pZmljYW50IDwtIHN1bShtYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDUpCiAgbnVtX3VwcmVndWxhdGVkIDwtIHN1bShtYXJrZXJzJGF2Z19sb2cyRkMgPiAxKQogIG51bV9kb3ducmVndWxhdGVkIDwtIHN1bShtYXJrZXJzJGF2Z19sb2cyRkMgPCAtMSkKICAKICBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDA6IiwgbnVtX3B2YWwwLCAiXG4iKQogIGNhdCgiTnVtYmVyIG9mIGdlbmVzIHdpdGggcF92YWxfYWRqID0gMToiLCBudW1fcHZhbDEsICJcbiIpCiAgY2F0KCJOdW1iZXIgb2Ygc2lnbmlmaWNhbnQgZ2VuZXMgKHBfdmFsX2FkaiA8IDAuMDUpOiIsIG51bV9zaWduaWZpY2FudCwgIlxuIikKICBjYXQoIk51bWJlciBvZiB1cHJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA+IDEpOiIsIG51bV91cHJlZ3VsYXRlZCwgIlxuIikKICBjYXQoIk51bWJlciBvZiBkb3ducmVndWxhdGVkIGdlbmVzIChhdmdfbG9nMkZDIDwgLTEpOiIsIG51bV9kb3ducmVndWxhdGVkLCAiXG4iKQp9CgpgYGAKCiMjIDUuMiBTdW1tYXJpemUgTWFya2VyczEgKFAxX3ZzX1AyKQpgYGB7cn0KY2F0KCJNYXJrZXJzMSBTdW1tYXJ5IChQMV92c19QMik6XG4iKQpzdW1tYXJpemVfbWFya2VycyhQMV92c19QMikKCmBgYAoKIyA2LiBGaWx0ZXIgYW5kIFN1bW1hcml6ZSBSZXN1bHRzCiMjIDYuMSBBcHBseSBFeHByZXNzaW9uIEZpbHRlciBGaXJzdApgYGB7cn0KIyBBcHBseSB0aGUgZXhwcmVzc2lvbiBmaWx0ZXIgZmlyc3QKUDFfdnNfUDIgPC0gUDFfdnNfUDIgJT4lCiAgZmlsdGVyKCEobWVhbl9leHByX2dyb3VwMSA8IDAuMiAmIG1lYW5fZXhwcl9ncm91cDIgPCAwLjIpKQoKCndyaXRlLmNzdihQMV92c19QMiwgZmlsZSA9ICJjb21wYXJpc29uX1AxX3ZzX1AyX3dpdGhfbWVhbl9leHByZXNzaW9uX2ZpbHRlcmVkLmNzdiIsIHJvdy5uYW1lcyA9IFRSVUUpCgpgYGAKCgoKIyMgNi4yIFN1bW1hcnkgRnVuY3Rpb24KYGBge3J9CnN1bW1hcml6ZV9tYXJrZXJzIDwtIGZ1bmN0aW9uKG1hcmtlcnMpIHsKICBudW1fcHZhbDAgPC0gc3VtKG1hcmtlcnMkcF92YWxfYWRqID09IDApCiAgbnVtX3B2YWwxIDwtIHN1bShtYXJrZXJzJHBfdmFsX2FkaiA9PSAxKQogIG51bV9zaWduaWZpY2FudCA8LSBzdW0obWFya2VycyRwX3ZhbF9hZGogPCAwLjA1KQogIG51bV91cHJlZ3VsYXRlZCA8LSBzdW0obWFya2VycyRhdmdfbG9nMkZDID4gMSkKICBudW1fZG93bnJlZ3VsYXRlZCA8LSBzdW0obWFya2VycyRhdmdfbG9nMkZDIDwgLTEpCiAgCiAgY2F0KCJOdW1iZXIgb2YgZ2VuZXMgd2l0aCBwX3ZhbF9hZGogPSAwOiIsIG51bV9wdmFsMCwgIlxuIikKICBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDE6IiwgbnVtX3B2YWwxLCAiXG4iKQogIGNhdCgiTnVtYmVyIG9mIHNpZ25pZmljYW50IGdlbmVzIChwX3ZhbF9hZGogPCAwLjA1KToiLCBudW1fc2lnbmlmaWNhbnQsICJcbiIpCiAgY2F0KCJOdW1iZXIgb2YgdXByZWd1bGF0ZWQgZ2VuZXMgKGF2Z19sb2cyRkMgPiAxKToiLCBudW1fdXByZWd1bGF0ZWQsICJcbiIpCiAgY2F0KCJOdW1iZXIgb2YgZG93bnJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA8IC0xKToiLCBudW1fZG93bnJlZ3VsYXRlZCwgIlxuIikKfQpgYGAKCiMjIDUuMyBTdW1tYXJpemUgTWFya2VyczEgKFAxX3ZzX1AyKQpgYGB7cn0KY2F0KCJNYXJrZXJzMSBTdW1tYXJ5IChQMV92c19QMik6XG4iKQpzdW1tYXJpemVfbWFya2VycyhQMV92c19QMikKYGBgCgoKCgo=