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=