-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPCA_plot_for_similarity_analysis.R
More file actions
318 lines (227 loc) · 14.6 KB
/
Copy pathPCA_plot_for_similarity_analysis.R
File metadata and controls
318 lines (227 loc) · 14.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
library(Seurat)
library(dplyr)
library(ggplot2)
# Assuming you have two Seurat objects: seurat_obj_your_data and seurat_obj_fetal_brain
load("~/Desktop/wk4_map2_slc32a1_only_mito10_stress_filt_CC_regressed_w_pyscenicAUC_GW20_annotation_20231114.RData")
load("~/Desktop/GW14_all_regions_merged_w_celltype_20231115.RData")
load("~/Documents/Ruiqi_scRNAseq/RData_files/GW20_brain_regions_combined_cells_filtered_integrated_w_celltype_neurons_only_badhuri_060802023.RData")
GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons <- subset(GW20_brain_regions_combined_cells_filtered_neurons, subset = GAD1 > 0 & GAD2 > 0)
GW14_neurons <- subset(x = GW14, subset = (celltype == "Neuron" | celltype == "Interneuron" ))
save(GW14_neurons, file = "~/Desktop/GW14_all_regions_merged_w_celltype_neurons_only_20231117.RData")
GW14_neurons_GADexp_neurons_interneurons <- subset(GW14_neurons, subset = GAD1 > 0 & GAD2 > 0)
wk4_fetal_brain_seurat_integrated_noGW14 <- subset(wk4_fetal_brain_seurat_integrated, subset = dataset == "GW14", invert = TRUE)
fetal_brain_seurat_integrated <- subset(wk4_fetal_brain_seurat_integrated, subset = dataset == "wk4", invert = TRUE)
fetal_brain_seurat_integrated_GW20_34_only <- subset(wk4_fetal_brain_seurat_integrated, subset = dataset == "GW20_34")
fetal_brain_seurat_integrated_GW20_new_only <- subset(wk4_fetal_brain_seurat_integrated, subset = dataset == "GW20")
wk4_fetal_brain_seurat_integrated_GW20_34_wk4_only <- subset(wk4_fetal_brain_seurat_integrated, subset = dataset == "GW20_34" | dataset == "wk4")
wk4_fetal_brain_seurat_integrated_GW20_new_wk4_only <- subset(wk4_fetal_brain_seurat_integrated, subset = dataset == "GW20" | dataset == "wk4")
wk4_fetal_brain_seurat_integrated_wk4_only <- subset(wk4_fetal_brain_seurat_integrated, subset = dataset == "wk4")
load("~/Desktop/GW20_new_individual_merged_regions_w_celltype_neurons_only_20231117.RData")
GW20_new_indvidual_neurons_GADexp_neurons_interneurons <- subset(GW20, subset = GAD1 > 0 & GAD2 > 0)
# Average expression for each gene across all cells in a cluster
wk4_pseudobulk <- AverageExpression(wk4_map2_slc32a1_only, assay = "RNA", group.by = "seurat_clusters")
# Convert to matrix
wk4_pseudobulk <- as.matrix(wk4_pseudobulk$RNA)
write.csv(wk4_pseudobulk, file="wk4_pseudobulk.csv")
# Average expression for each gene across all cells in a cluster
GW20_new_indiv_pseudobulk <- AverageExpression(fetal_brain_seurat_integrated_GW20_new_only, assay = "RNA", group.by = "structure")
GW20_new_indiv_pseudobulk <- as.matrix(GW20_new_indiv_pseudobulk$RNA)
GW20_34_indiv_pseudobulk <- AverageExpression(GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons, assay = "RNA", group.by = "structure")
GW20_34_indiv_pseudobulk <- as.matrix(GW20_34_indiv_pseudobulk$RNA)
wk4_fetal_brain_seurat_integrated_pseudobulk <- AverageExpression(wk4_fetal_brain_seurat_integrated_GW20_new_wk4_only, assay = "RNA", group.by = "structure")
wk4_fetal_brain_integrated_pseudobulk_pseudobulk <- as.matrix(wk4_fetal_brain_seurat_integrated_pseudobulk$RNA)
wk4_rows <- rownames(wk4_pseudobulk)
GW20_34_rows <- rownames(GW20_34_indiv_pseudobulk)
GW20_rows <- rownames(GW20_new_indiv_pseudobulk)
wk4_fetal_brain_integrated_pseudobulk_pseudobulk_rows <- rownames(wk4_fetal_brain_integrated_pseudobulk_pseudobulk)
common_genes <- intersect(wk4_fetal_brain_integrated_pseudobulk_pseudobulk_rows, GW20_34_rows)
common_genes_all <- intersect(common_genes, GW20_rows)
dim(common_genes_all)
var_genes <- wk4_fetal_brain_seurat_integrated@assays$integrated@var.features
wk4_fetal_brain_seurat_integrated_GW20_new_wk4_only <- FindVariableFeatures(wk4_fetal_brain_seurat_integrated_GW20_new_wk4_only, nfeatures = 2000)
var_genes <- wk4_fetal_brain_seurat_integrated_GW20_new_wk4_only@assays$RNA@var.features
DefaultAssay(wk4_fetal_brain_seurat_integrated) <- "RNA"
# Subset datasets
wk4_sub <- wk4_pseudobulk[var_genes,]
GW20_34_sub <- GW20_34_indiv_pseudobulk[var_genes,]
GW20_sub <- GW20_new_indiv_pseudobulk[var_genes,]
wk4_fetal_brain_integrated_pseudobulk_sub <- wk4_fetal_brain_integrated_pseudobulk_pseudobulk[var_genes,]
# Combine datasets
combined_data <- cbind(wk4_fetal_brain_integrated_pseudobulk_sub, GW20_34_sub)
# Normalize
combined_matrix_norm <- apply(wk4_fetal_brain_integrated_pseudobulk_sub, 2, function(x) (x - mean(x)) / sd(x))
# Scale
combined_matrix_scaled <- scale(combined_matrix_norm)
# Run PCA
pca <- prcomp(combined_matrix_scaled, scale = FALSE)
# Extract PC vectors
#pca_data <- pca$x
pca_rotation <- pca$rotation
# Convert to data frame
pca_rotation_df <- as.data.frame(pca_rotation)
library(ggfortify)
library(ggrepel)
ggbiplot(pca_rotation_df, obs.scale = 1, var.scale = 1,
groups = colnames(combined_matrix_scaled), ellipse = TRUE) +
ggrepel::geom_label_repel(
aes(x=PC1, y=PC2, label=rownames(pca_rotation_df))
)
# Make scatter plot
#plot(pca_loadings[,1], pca_loadings[,2],
# col=c(rep("blue", nrow(GW20_34_pseudobulk)), rep("blue", nrow(wk4_pseudobulk))),
# xlab = "PC1", ylab = "PC2")
#method 2
# For Seurat object 1
wk4_pseudobulk <- AverageExpression(wk4_map2_slc32a1_only, assay = "RNA", group.by = "seurat_clusters")
wk4_pseudobulk_data <- as.data.frame(wk4_pseudobulk$RNA)
# For Seurat object 2
GW20_34_pseudobulk <- AverageExpression(GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons, assay = "RNA", group.by = "structure")
GW20_34_pseudobulk_data <- as.data.frame(GW20_34_pseudobulk$RNA)
GW14_pseudobulk <- AverageExpression(GW14_neurons_GADexp_neurons_interneurons, assay = "RNA", group.by = "structure")
GW14_pseudobulk_data <- as.data.frame(GW14_pseudobulk$RNA)
GW20_new_pseudobulk <- AverageExpression(GW20_new_indvidual_neurons_GADexp_neurons_interneurons, assay = "RNA", group.by = "structure")
GW20_new_pseudobulk_data <- as.data.frame(GW20_new_pseudobulk$RNA)
#merge
wk4_pseudobulk_data$dataset <- "Wk4"
GW20_34_pseudobulk_data$dataset <- "GW20_34"
GW20_new_pseudobulk_data$dataset <- "GW20_new"
GW14_pseudobulk_data$dataset <- "GW14"
# Assuming df1 and df2 are your data frames
wk4_pseudobulk_data$genes <- rownames(wk4_pseudobulk_data)
GW20_34_pseudobulk_data$genes <- rownames(GW20_34_pseudobulk_data)
GW20_new_pseudobulk_data$genes <- rownames(GW20_new_pseudobulk_data)
GW14_pseudobulk_data$genes <- rownames(GW14_pseudobulk_data)
library(dplyr)
combined_df <- wk4_pseudobulk_data %>%
full_join(GW20_34_pseudobulk_data, by = "dataset") %>%
full_join(GW20_new_pseudobulk_data, by = "dataset") %>%
full_join(GW14_pseudobulk_data, by = "dataset")
combined_df <- merge(wk4_pseudobulk_data, GW20_34_pseudobulk_data, by = "genes")
# Ensure that the data is numeric for PCA
combined_pseudobulk_numeric <- combined_df[, sapply(combined_df, is.numeric)]
# Perform PCA
pca_result <- prcomp(combined_pseudobulk_numeric, center = TRUE, scale. = TRUE)
library(ggplot2)
pca_rotation <- pca_result$rotation
# Convert to data frame
pca_rotation_df <- as.data.frame(pca_rotation)
library(ggfortify)
library(ggrepel)
ggbiplot(pca_rotation_df, obs.scale = 1, var.scale = 1,
groups = colnames(combined_matrix_scaled), ellipse = TRUE) +
ggrepel::geom_label_repel(
aes(x=PC1, y=PC2, label=rownames(pca_rotation_df))
)
#############
#chnage headings of seurat objects prior to merge to include age for PCA plot
# Assuming your Seurat object is named 'seurat_obj'
# And the column you want to modify is named 'your_column_name'
# Access and modify the column
metadata <- GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons@meta.data
structure <- metadata$structure
test <- paste0("GW20_", structure)
GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons <- AddMetaData(GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons, metadata = test, col.name = "structure")
GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons <- AddMetaData(GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons, metadata = "GW20_34", col.name = "dataset")
head(GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons)
metadata <- GW20_new_indvidual_neurons_GADexp_neurons_interneurons@meta.data
structure <- metadata$structure
test <- paste0("GW20_", structure)
GW20_new_indvidual_neurons_GADexp_neurons_interneurons <- AddMetaData(GW20_new_indvidual_neurons_GADexp_neurons_interneurons, metadata = test, col.name = "structure")
GW20_new_indvidual_neurons_GADexp_neurons_interneurons <- AddMetaData(GW20_new_indvidual_neurons_GADexp_neurons_interneurons, metadata = "GW20", col.name = "dataset")
head(GW20_new_indvidual_neurons_GADexp_neurons_interneurons)
metadata <- wk4_map2_slc32a1_only@meta.data
structure <- metadata$seurat_clusters
test <- paste0("Wk4", structure)
wk4_map2_slc32a1_only <- AddMetaData(wk4_map2_slc32a1_only, metadata = structure, col.name = "structure")
wk4_map2_slc32a1_only <- AddMetaData(wk4_map2_slc32a1_only, metadata = "wk4", col.name = "dataset")
head(wk4_map2_slc32a1_only)
metadata <- GW14_neurons_GADexp_neurons_interneurons@meta.data
structure <- metadata$structure
test <- paste0("GW14", structure)
GW14_neurons_GADexp_neurons_interneurons <- AddMetaData(GW14_neurons_GADexp_neurons_interneurons, metadata = test, col.name = "structure")
GW14_neurons_GADexp_neurons_interneurons <- AddMetaData(GW14_neurons_GADexp_neurons_interneurons, metadata = "GW14", col.name = "dataset")
head(GW14_neurons_GADexp_neurons_interneurons)
objects <- ls(pat = "GW14")
object <- objects[-c(1,3,8)]
cell_ids <- c("CGE", "hypo", "LGE", "MGE", "motor", "occipital", "somato", "striatum", "thalamus")
#merge
combined <- merge(wk4_map2_slc32a1_only, y = c(GW14_neurons_GADexp_neurons_interneurons, GW20_new_indvidual_neurons_GADexp_neurons_interneurons, GW20_brain_regions_combined_cells_filtered_GADexp_neurons_interneurons), add.cell.ids = c("wk4", "GW14", "GW20_34", "GW20"), project = "brain_similarity")
combined <- NormalizeData(combined)
combined <- FindVariableFeatures(combined, selection.method = "vst", nfeatures = 2000)
combined <- ScaleData(combined, verbose = FALSE)
combined <- RunPCA(combined, npcs = 30, verbose = FALSE)
combined <- RunUMAP(combined, reduction = "pca", dims = 1:30)
combined <- FindNeighbors(combined, reduction = "pca", dims = 1:30)
combined <- FindClusters(combined, resolution = 0.5)
save(combined, file = "~/Desktop/wk4_merged_w_GW14_GW20_GW20_34_fetal_brain_regions_20231117.RData")
#integration of striatum and hypo datasets
# split the merged dataset into a list seurat objects
ifnb.list <- SplitObject(combined, split.by = "dataset")
# normalize and identify variable features for each dataset independently
ifnb.list <- c(GW20_caudate, GW20_hypo, GW20_NA, GW20_putamen)
ifnb.list <- lapply(X = ifnb.list, FUN = function(x) {
x <- NormalizeData(x)
x <- FindVariableFeatures(x, selection.method = "vst", nfeatures = 2000)
})
# select features that are repeatedly variable across datasets for integration
features <- SelectIntegrationFeatures(object.list = ifnb.list, dims = 1:30)
#perform integration
immune.anchors <- FindIntegrationAnchors(object.list = ifnb.list, anchor.features = features)
# this command creates an 'integrated' data assay
wk4_fetal_brain_seurat_integrated <- IntegrateData(anchorset = immune.anchors)
# specify that we will perform downstream analysis on the corrected data note that the
# original unmodified data still resides in the 'RNA' assay
DefaultAssay(wk4_fetal_brain_seurat_integrated) <- "integrated"
# Run the standard workflow for visualization and clustering
wk4_fetal_brain_seurat_integrated <- ScaleData(wk4_fetal_brain_seurat_integrated, verbose = FALSE)
wk4_fetal_brain_seurat_integrated <- FindVariableFeatures(wk4_fetal_brain_seurat_integrated, nfeatures = 2000)
wk4_fetal_brain_seurat_integrated <- RunPCA(wk4_fetal_brain_seurat_integrated, npcs = 30, dims = 1:30)
wk4_fetal_brain_seurat_integrated <- RunUMAP(wk4_fetal_brain_seurat_integrated, reduction = "pca", dims = 1:30)
wk4_fetal_brain_seurat_integrated <- RunUMAP(wk4_fetal_brain_seurat_integrated, dims = 1:30)
wk4_fetal_brain_seurat_integrated <- FindNeighbors(wk4_fetal_brain_seurat_integrated)
wk4_fetal_brain_seurat_integrated <- FindClusters(wk4_fetal_brain_seurat_integrated, resolution = 0.6)
# Visualization
DimPlot(wk4_fetal_brain_seurat_integrated_noGW14, reduction = "pca", group.by = "structure")
DimPlot(wk4_fetal_brain_seurat_integrated_noGW14, reduction = "umap", group.by = "structure", pt.size = .001)
p2 <- DimPlot(gcdata_seurat_integrated, reduction = "umap", label = TRUE, repel = TRUE)
p1 + p2
DimPlot(object = wk4_fetal_brain_seurat_integrated_noGW14, dims = c(2, 5), reduction = "pca", group.by = "structure")
save(wk4_fetal_brain_seurat_integrated, file = "~/Desktop/wk4_fetal_brain_seurat_integrated_20231117.RData")
# To visualize the two conditions side-by-side, we can use the split.by argument to show each condition colored by cluster.
DimPlot(GW20_hypo_stri_regions_combined, reduction = "umap", split.by = "stim")
#from chatGPT for pearson/spearman correlation
library(Seurat)
library(dplyr)
library(ggplot2)
library(pheatmap)
# Identify clusters or cell types - assuming this is already done
# seurat_object1 <- FindClusters(seurat_object1, resolution = 0.5)
# seurat_object2 <- FindClusters(seurat_object2, resolution = 0.5)
wk4_from_integration <- subset(wk4_fetal_brain_seurat_integrated, subset = dataset == "wk4")
wk4_fetal_brain_seurat_integrated_GW20_34_only <- subset(wk4_fetal_brain_seurat_integrated_noGW14, subset = dataset == "GW20_34")
# Pseudobulk approach - aggregate data by cluster
pseudo_bulk1 <- AverageExpression(wk4_from_integration, group.by = 'structure', return.seurat = TRUE)
pseudo_bulk2 <- AverageExpression(wk4_fetal_brain_seurat_integrated_GW20_34_only, group.by = "structure", return.seurat = TRUE)
# Extract averaged data
avg_expr1 <- pseudo_bulk1@assays$RNA@data
avg_expr2 <- pseudo_bulk2@assays$RNA@data
# Ensure same set of genes in both matrices for correlation
common_genes <- intersect(rownames(avg_expr1), rownames(avg_expr2))
use_genes <- intersect(common_genes, var_genes)
avg_expr1 <- avg_expr1[var_genes, ]
avg_expr2 <- avg_expr2[var_genes, ]
# Calculate Pearson correlation
pearson_corr <- cor(avg_expr1, avg_expr2, method = "pearson")
write.csv(pearson_corr, file = "~/Documents/Ruiqi_scRNAseq/wk4_GW20_perason_correlation_values_for_heatmap_20231122.csv")
# Calculate Spearman correlation
spearman_corr <- cor(avg_expr1, avg_expr2, method = "spearman")
# Heatmap Visualization for Pearson Correlation
pheatmap(pearson_corr,
cluster_rows = TRUE,
cluster_cols = TRUE,
main = "Pearson Correlation Heatmap")
# Heatmap Visualization for Spearman Correlation
pheatmap(spearman_corr,
cluster_rows = TRUE,
cluster_cols = TRUE,
main = "Spearman Correlation Heatmap")