1. load libraries
#Differential Expression Analysis
2. load seurat object
#Load Seurat Object L7
load("../0-IMP-OBJECTS/Harmony_integrated_All_samples_Merged_with_PBMC10x_with_harmony_clustering.Robj")
Le chargement a nécessité le package : SeuratObject
Le chargement a nécessité le package : sp
Attachement du package : ‘SeuratObject’
Les objets suivants sont masqués depuis ‘package:base’:
intersect, t
All_samples_Merged
Le chargement a nécessité le package : Seurat
Registered S3 methods overwritten by 'htmltools':
method from
print.html tools:rstudio
print.shiny.tag tools:rstudio
print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
An object of class Seurat
64169 features across 59355 samples within 6 assays
Active assay: SCT (27417 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
6 dimensional reductions calculated: integrated_dr, ref.umap, pca, umap, harmony, umap.harmony
DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "cell_line",label = T, label.box = T)

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "Harmony_snn_res.0.9",label = T, label.box = T)

3. silhouette Score Test
library(Seurat)
library(cluster)
library(ggplot2)
# Assuming `All_samples_Merged` is already created and contains both PCA and Harmony embeddings
# Define the range of PCs used in SCTransform
pc_range <- 1:13
# Extract PCA and Harmony embeddings
pca_embedding <- Embeddings(All_samples_Merged, reduction = "pca")[, pc_range]
harmony_embedding <- Embeddings(All_samples_Merged, reduction = "harmony")[, pc_range]
# Retrieve cluster labels and batch labels
cluster_labels <- All_samples_Merged$seurat_clusters # Adjust based on actual cluster column
batch_labels <- All_samples_Merged$orig.ident # Adjust based on actual batch/condition column
# Ensure labels are numeric (for silhouette function)
cluster_labels <- as.numeric(as.factor(cluster_labels))
batch_labels <- as.numeric(as.factor(batch_labels))
# Compute silhouette scores for PCA embeddings
silhouette_pca_clusters <- silhouette(cluster_labels, dist(pca_embedding))
silhouette_pca_batches <- silhouette(batch_labels, dist(pca_embedding))
# Compute silhouette scores for Harmony embeddings
silhouette_harmony_clusters <- silhouette(cluster_labels, dist(harmony_embedding))
silhouette_harmony_batches <- silhouette(batch_labels, dist(harmony_embedding))
# Convert silhouette objects to data frames for visualization
silhouette_df <- data.frame(
method = rep(c("PCA", "Harmony"), each = length(cluster_labels) * 2),
group = c(rep("Cluster", length(cluster_labels)), rep("Batch", length(cluster_labels))),
silhouette_width = c(
silhouette_pca_clusters[, "sil_width"], silhouette_pca_batches[, "sil_width"],
silhouette_harmony_clusters[, "sil_width"], silhouette_harmony_batches[, "sil_width"]
)
)
# Plot silhouette scores for clusters and batches across PCA and Harmony
ggplot(silhouette_df, aes(x = method, y = silhouette_width, fill = group)) +
geom_boxplot() +
theme_minimal() +
labs(
title = "Comparison of Silhouette Scores for PCA and Harmony",
x = "Embedding Method",
y = "Silhouette Width"
) +
facet_wrap(~ group, scales = "free") +
theme(legend.position = "none")

# Print average silhouette scores
cat("Average silhouette scores:\n")
Average silhouette scores:
cat("PCA (Cluster): ", mean(silhouette_pca_clusters[, "sil_width"]), "\n")
PCA (Cluster): 0.05326484
cat("PCA (Batch): ", mean(silhouette_pca_batches[, "sil_width"]), "\n")
PCA (Batch): 0.3232747
cat("Harmony (Cluster): ", mean(silhouette_harmony_clusters[, "sil_width"]), "\n")
Harmony (Cluster): 0.07464966
cat("Harmony (Batch): ", mean(silhouette_harmony_batches[, "sil_width"]), "\n")
Harmony (Batch): 0.05910068
LS0tCnRpdGxlOiAiU8OpemFyeSBTeW5kcm9tZSBzaWxob3VldHRlIFNjb3JlIFRlc3QiCmF1dGhvcjogTmFzaXIgTWFobW9vZCBBYmJhc2kKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgIyBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICAjIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICAjIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICAjcm1kZm9ybWF0czo6cmVhZHRoZWRvd24KICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKLS0tCgojIDEuIGxvYWQgbGlicmFyaWVzCmBgYHtyIHNldHVwMSwgaW5jbHVkZT1GQUxTRX0KIyMgaHR0cHM6Ly9lbmJsYWNhci5naXRodWIuaW8vU0NwdWJyLWJvb2stdjEvMDQtRmVhdHVyZVBsb3RzLmh0bWwKCgojIExvYWQgcmVxdWlyZWQgbGlicmFyaWVzCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHNjQ3VzdG9taXplKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGhlYXRtYXApCmxpYnJhcnkoU0NwdWJyKQpsaWJyYXJ5KFNldXJhdEludGVncmF0ZSkKCmBgYAojRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gQW5hbHlzaXMKCiMgMi4gbG9hZCBzZXVyYXQgb2JqZWN0CmBgYHtyIGxvYWRfc2V1cmF0fQojTG9hZCBTZXVyYXQgT2JqZWN0IEw3CmxvYWQoIi4uLzAtSU1QLU9CSkVDVFMvSGFybW9ueV9pbnRlZ3JhdGVkX0FsbF9zYW1wbGVzX01lcmdlZF93aXRoX1BCTUMxMHhfd2l0aF9oYXJtb255X2NsdXN0ZXJpbmcuUm9iaiIpCgoKQWxsX3NhbXBsZXNfTWVyZ2VkCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsIGdyb3VwLmJ5ID0gImNlbGxfbGluZSIsbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsIGdyb3VwLmJ5ID0gIkhhcm1vbnlfc25uX3Jlcy4wLjkiLGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCmBgYAoKIyAzLiBzaWxob3VldHRlIFNjb3JlIFRlc3QKYGBge3Igc2lsaG91ZXR0ZSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTJ9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGNsdXN0ZXIpCmxpYnJhcnkoZ2dwbG90MikKCiMgQXNzdW1pbmcgYEFsbF9zYW1wbGVzX01lcmdlZGAgaXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBjb250YWlucyBib3RoIFBDQSBhbmQgSGFybW9ueSBlbWJlZGRpbmdzCiMgRGVmaW5lIHRoZSByYW5nZSBvZiBQQ3MgdXNlZCBpbiBTQ1RyYW5zZm9ybQpwY19yYW5nZSA8LSAxOjEzCgojIEV4dHJhY3QgUENBIGFuZCBIYXJtb255IGVtYmVkZGluZ3MKcGNhX2VtYmVkZGluZyA8LSBFbWJlZGRpbmdzKEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInBjYSIpWywgcGNfcmFuZ2VdCmhhcm1vbnlfZW1iZWRkaW5nIDwtIEVtYmVkZGluZ3MoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAiaGFybW9ueSIpWywgcGNfcmFuZ2VdCgojIFJldHJpZXZlIGNsdXN0ZXIgbGFiZWxzIGFuZCBiYXRjaCBsYWJlbHMKY2x1c3Rlcl9sYWJlbHMgPC0gQWxsX3NhbXBsZXNfTWVyZ2VkJHNldXJhdF9jbHVzdGVycyAgIyBBZGp1c3QgYmFzZWQgb24gYWN0dWFsIGNsdXN0ZXIgY29sdW1uCmJhdGNoX2xhYmVscyA8LSBBbGxfc2FtcGxlc19NZXJnZWQkb3JpZy5pZGVudCAgICAgICAgIyBBZGp1c3QgYmFzZWQgb24gYWN0dWFsIGJhdGNoL2NvbmRpdGlvbiBjb2x1bW4KCiMgRW5zdXJlIGxhYmVscyBhcmUgbnVtZXJpYyAoZm9yIHNpbGhvdWV0dGUgZnVuY3Rpb24pCmNsdXN0ZXJfbGFiZWxzIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGNsdXN0ZXJfbGFiZWxzKSkKYmF0Y2hfbGFiZWxzIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGJhdGNoX2xhYmVscykpCgojIENvbXB1dGUgc2lsaG91ZXR0ZSBzY29yZXMgZm9yIFBDQSBlbWJlZGRpbmdzCnNpbGhvdWV0dGVfcGNhX2NsdXN0ZXJzIDwtIHNpbGhvdWV0dGUoY2x1c3Rlcl9sYWJlbHMsIGRpc3QocGNhX2VtYmVkZGluZykpCnNpbGhvdWV0dGVfcGNhX2JhdGNoZXMgPC0gc2lsaG91ZXR0ZShiYXRjaF9sYWJlbHMsIGRpc3QocGNhX2VtYmVkZGluZykpCgojIENvbXB1dGUgc2lsaG91ZXR0ZSBzY29yZXMgZm9yIEhhcm1vbnkgZW1iZWRkaW5ncwpzaWxob3VldHRlX2hhcm1vbnlfY2x1c3RlcnMgPC0gc2lsaG91ZXR0ZShjbHVzdGVyX2xhYmVscywgZGlzdChoYXJtb255X2VtYmVkZGluZykpCnNpbGhvdWV0dGVfaGFybW9ueV9iYXRjaGVzIDwtIHNpbGhvdWV0dGUoYmF0Y2hfbGFiZWxzLCBkaXN0KGhhcm1vbnlfZW1iZWRkaW5nKSkKCiMgQ29udmVydCBzaWxob3VldHRlIG9iamVjdHMgdG8gZGF0YSBmcmFtZXMgZm9yIHZpc3VhbGl6YXRpb24Kc2lsaG91ZXR0ZV9kZiA8LSBkYXRhLmZyYW1lKAogIG1ldGhvZCA9IHJlcChjKCJQQ0EiLCAiSGFybW9ueSIpLCBlYWNoID0gbGVuZ3RoKGNsdXN0ZXJfbGFiZWxzKSAqIDIpLAogIGdyb3VwID0gYyhyZXAoIkNsdXN0ZXIiLCBsZW5ndGgoY2x1c3Rlcl9sYWJlbHMpKSwgcmVwKCJCYXRjaCIsIGxlbmd0aChjbHVzdGVyX2xhYmVscykpKSwKICBzaWxob3VldHRlX3dpZHRoID0gYygKICAgIHNpbGhvdWV0dGVfcGNhX2NsdXN0ZXJzWywgInNpbF93aWR0aCJdLCBzaWxob3VldHRlX3BjYV9iYXRjaGVzWywgInNpbF93aWR0aCJdLAogICAgc2lsaG91ZXR0ZV9oYXJtb255X2NsdXN0ZXJzWywgInNpbF93aWR0aCJdLCBzaWxob3VldHRlX2hhcm1vbnlfYmF0Y2hlc1ssICJzaWxfd2lkdGgiXQogICkKKQoKIyBQbG90IHNpbGhvdWV0dGUgc2NvcmVzIGZvciBjbHVzdGVycyBhbmQgYmF0Y2hlcyBhY3Jvc3MgUENBIGFuZCBIYXJtb255CmdncGxvdChzaWxob3VldHRlX2RmLCBhZXMoeCA9IG1ldGhvZCwgeSA9IHNpbGhvdWV0dGVfd2lkdGgsIGZpbGwgPSBncm91cCkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKAogICAgdGl0bGUgPSAiQ29tcGFyaXNvbiBvZiBTaWxob3VldHRlIFNjb3JlcyBmb3IgUENBIGFuZCBIYXJtb255IiwKICAgIHggPSAiRW1iZWRkaW5nIE1ldGhvZCIsCiAgICB5ID0gIlNpbGhvdWV0dGUgV2lkdGgiCiAgKSArCiAgZmFjZXRfd3JhcCh+IGdyb3VwLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgojIFByaW50IGF2ZXJhZ2Ugc2lsaG91ZXR0ZSBzY29yZXMKY2F0KCJBdmVyYWdlIHNpbGhvdWV0dGUgc2NvcmVzOlxuIikKY2F0KCJQQ0EgKENsdXN0ZXIpOiAiLCBtZWFuKHNpbGhvdWV0dGVfcGNhX2NsdXN0ZXJzWywgInNpbF93aWR0aCJdKSwgIlxuIikKY2F0KCJQQ0EgKEJhdGNoKTogIiwgbWVhbihzaWxob3VldHRlX3BjYV9iYXRjaGVzWywgInNpbF93aWR0aCJdKSwgIlxuIikKY2F0KCJIYXJtb255IChDbHVzdGVyKTogIiwgbWVhbihzaWxob3VldHRlX2hhcm1vbnlfY2x1c3RlcnNbLCAic2lsX3dpZHRoIl0pLCAiXG4iKQpjYXQoIkhhcm1vbnkgKEJhdGNoKTogIiwgbWVhbihzaWxob3VldHRlX2hhcm1vbnlfYmF0Y2hlc1ssICJzaWxfd2lkdGgiXSksICJcbiIpCgoKYGBgCgo=