diff --git a/aio.html b/aio.html index 878504c..1287678 100644 --- a/aio.html +++ b/aio.html @@ -1036,7 +1036,7 @@
Whenever your code involves the generation of random numbers, it’s a good practice to set the random seed in R with @@ -1349,7 +1349,7 @@
Spike-ins are deliberately-introduced exogeneous RNA from an exotic or synthetic source at a known concentration. This provides a known @@ -1920,7 +1920,7 @@
Mathematically, this would require the data to fall on a two-dimensional plane (for linear methods like PCA) or a smooth 2D @@ -2090,7 +2090,7 @@
First subset the object to include only highly variable genes
(sce2 <- sce[hvg.sce.var,]
) and then apply the
@@ -2375,7 +2375,7 @@
We see in the help documentation for ?clusterCells
that
all of the clustering algorithm details are handled through the
@@ -2528,7 +2528,7 @@
One important reason why is because averages over all other clusters can be sensitive to the cell type composition. If a rare cell type shows @@ -2821,7 +2821,7 @@
Use BiocParallel
and the BPPARAM
argument!
This example will set it to use four cores on your laptop, but you can
@@ -3010,7 +3010,9 @@
-new.labels Allantois Blood progenitors 1
- Allantois 28 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 0 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 1 0
- Gut 0 0
- Haematoendothelial progenitors 1 0
- Intermediate mesoderm 0 0
- Mesenchyme 0 0
- Neural crest 11 4
- NMP 0 0
- Paraxial mesoderm 5 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 0
-
-new.labels Blood progenitors 2 Cardiomyocytes
- Allantois 0 0
- Cardiomyocytes 0 27
- Endothelium 0 0
- Erythroid2 1 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 0 0
- Gut 0 0
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 0
- Mesenchyme 0 0
- Neural crest 6 1
- NMP 0 0
- Paraxial mesoderm 0 4
- Pharyngeal mesoderm 0 6
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 0
-
-new.labels Caudal epiblast Caudal Mesoderm Def. endoderm
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 0 0
- Erythroid2 0 0 0
- Erythroid3 0 0 0
- ExE mesoderm 0 0 0
- Forebrain/Midbrain/Hindbrain 1 0 2
- Gut 0 0 0
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 0 0 0
- Mesenchyme 0 0 0
- Neural crest 0 0 1
- NMP 0 0 0
- Paraxial mesoderm 0 0 1
- Pharyngeal mesoderm 0 0 0
- Somitic mesoderm 0 1 1
- Spinal cord 0 0 0
- Surface ectoderm 0 0 0
-
-new.labels Doublet Endothelium Erythroid1 Erythroid2
- Allantois 0 0 0 0
- Cardiomyocytes 0 0 0 0
- Endothelium 0 13 0 0
- Erythroid2 0 0 14 21
- Erythroid3 0 0 6 5
- ExE mesoderm 0 0 0 0
- Forebrain/Midbrain/Hindbrain 6 0 0 0
- Gut 0 0 0 0
- Haematoendothelial progenitors 0 19 0 0
- Intermediate mesoderm 13 0 0 0
- Mesenchyme 0 0 0 0
- Neural crest 20 1 3 0
- NMP 0 0 0 0
- Paraxial mesoderm 5 0 0 0
- Pharyngeal mesoderm 1 0 0 0
- Somitic mesoderm 1 0 0 0
- Spinal cord 1 0 0 0
- Surface ectoderm 0 0 0 0
-
-new.labels Erythroid3 ExE mesoderm
- Allantois 0 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 51 0
- Erythroid3 49 0
- ExE mesoderm 0 23
- Forebrain/Midbrain/Hindbrain 0 1
- Gut 0 0
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 16
- Mesenchyme 0 0
- Neural crest 0 17
- NMP 0 0
- Paraxial mesoderm 0 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 0
+new.labels Allantois Blood progenitors 1 Blood progenitors 2
+ Allantois 28 0 0
+ Cardiomyocytes 0 0 0
+ Endothelium 0 0 0
+ Erythroid2 0 0 1
-new.labels Forebrain/Midbrain/Hindbrain Gut
- Allantois 0 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 0 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 83 4
- Gut 0 5
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 0
- Mesenchyme 0 0
- Neural crest 20 0
- NMP 0 0
- Paraxial mesoderm 0 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 12
-
-new.labels Haematoendothelial progenitors
- Allantois 0
- Cardiomyocytes 0
- Endothelium 0
- Erythroid2 0
- Erythroid3 0
- ExE mesoderm 0
- Forebrain/Midbrain/Hindbrain 0
- Gut 0
- Haematoendothelial progenitors 16
- Intermediate mesoderm 0
- Mesenchyme 0
- Neural crest 8
- NMP 0
- Paraxial mesoderm 2
- Pharyngeal mesoderm 0
- Somitic mesoderm 0
- Spinal cord 0
- Surface ectoderm 0
-
-new.labels Intermediate mesoderm Mesenchyme Neural crest
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 0 0
- Erythroid2 0 0 0
- Erythroid3 0 0 0
- ExE mesoderm 1 7 0
- Forebrain/Midbrain/Hindbrain 0 3 0
- Gut 0 0 0
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 9 15 0
- Mesenchyme 0 69 0
- Neural crest 4 4 10
- NMP 0 0 0
- Paraxial mesoderm 0 7 0
- Pharyngeal mesoderm 0 13 0
- Somitic mesoderm 2 0 0
- Spinal cord 0 0 0
- Surface ectoderm 0 0 0
-
-new.labels NMP Paraxial mesoderm Pharyngeal mesoderm
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 0 0
- Erythroid2 0 0 0
- Erythroid3 0 0 0
- ExE mesoderm 0 0 0
- Forebrain/Midbrain/Hindbrain 41 2 4
- Gut 0 0 0
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 0 1 5
- Mesenchyme 0 0 0
- Neural crest 5 20 10
- NMP 16 0 0
- Paraxial mesoderm 0 43 3
- Pharyngeal mesoderm 0 0 18
- Somitic mesoderm 0 0 0
- Spinal cord 0 0 0
- Surface ectoderm 0 0 0
-
-new.labels Rostral neurectoderm Somitic mesoderm
- Allantois 0 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 0 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 11 1
- Gut 0 0
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 2
- Mesenchyme 0 0
- Neural crest 0 7
- NMP 0 0
- Paraxial mesoderm 0 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 25
- Spinal cord 0 0
- Surface ectoderm 0 0
-
-new.labels Spinal cord Stripped Surface ectoderm
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 1 0
- Erythroid2 0 1 0
- Erythroid3 0 1 0
- ExE mesoderm 0 0 0
- Forebrain/Midbrain/Hindbrain 37 0 17
- Gut 0 0 2
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 0 0 0
- Mesenchyme 0 0 2
- Neural crest 3 5 6
- NMP 0 0 0
- Paraxial mesoderm 0 0 0
- Pharyngeal mesoderm 0 0 0
- Somitic mesoderm 0 0 0
- Spinal cord 9 0 0
- Surface ectoderm 0 0 20
+new.labels Cardiomyocytes
+ Allantois 0
+ Cardiomyocytes 27
+ Endothelium 0
+ Erythroid2 0
As a diagnostic measure, we examine the distribution of AUCs across cells for each label. In heterogeneous populations, the distribution for @@ -3287,7 +3081,7 @@
The example that jumps out most strongly to the eye is ExE endoderm, which doesn’t show clear separate modes. Simultaneously, Endothelium @@ -3436,7 +3230,7 @@
The NNGraphParam
constructor has an argument
cluster.args
. This allows to specify arguments passed on to
@@ -3453,7 +3247,7 @@
TODO
Use the goana()
function from the limma
package to identify GO BP terms that are overrepresented in the list of
@@ -3496,7 +3290,7 @@
TODO
TODO
Content from Multi-sample analyses
Last updated on 2024-09-06 | +
Last updated on 2024-09-08 | Edit this page
We start by loading the data and doing a quick exploratory analysis, essentially applying the normalization and visualization techniques that -we have seen in the previous lectures to all samples.
+we have seen in the previous lectures to all samples. Note that this +time we’re selecting samples 5 to 10, not just 5 by itself.
library(MouseGastrulationData)
-sce <- WTChimeraData(samples=5:10, type = "processed")
+library(batchelor)
+library(edgeR)
+library(scater)
+library(ggplot2)
+library(scran)
+library(pheatmap)
+library(scuttle)
+
+sce <- WTChimeraData(samples = 5:10, type = "processed")
+
sce
-library(scater)
-library(ggplot2)
-library(scran)
+drop <- sce$celltype.mapped %in% c("stripped", "Doublet")
-# remove doublets
-drop <- sce$celltype.mapped %in% c("stripped", "Doublet")
sce <- sce[,!drop]
set.seed(29482)
+
idx <- unlist(tapply(colnames(sce), sce$sample, function(x) {
perc <- round(0.50 * length(x))
sample(x, perc)
@@ -3752,23 +3553,24 @@ R
sce <- sce[,idx]
We now normalize the data and visualize them in a tSNE plot.
+We now normalize the data, run some dimensionality reduction steps, +and visualize them in a tSNE plot.
-# normalization
-sce <- logNormCounts(sce)
+sce <- logNormCounts(sce)
+
+dec <- modelGeneVar(sce, block = sce$sample)
-# identify highly variable genes
-dec <- modelGeneVar(sce, block=sce$sample)
chosen.hvgs <- dec$bio > 0
-# dimensionality reduction
sce <- runPCA(sce, subset_row = chosen.hvgs, ntop = 1000)
+
sce <- runTSNE(sce, dimred = "PCA")
sce$sample <- as.factor(sce$sample)
+
plotTSNE(sce, colour_by = "sample")
Samples 5 and 6 were from the same “pool” of cells. Looking at the
documentation for the dataset under ?WTChimeraData
we see
@@ -3816,7 +3618,7 @@
We correct the effect of samples by aid of the +
We “correct” the effect of samples with the
correctExperiment
function in the batchelor
-package and using the sample
colData
column as
-batch.
sample
column as batch.
-library(batchelor)
-set.seed(10102)
-merged <- correctExperiments(sce,
- batch=sce$sample,
- subset.row=chosen.hvgs,
- PARAM=FastMnnParam(
- merge.order=list(
+set.seed(10102)
+
+merged <- correctExperiments(
+ sce,
+ batch = sce$sample,
+ subset.row = chosen.hvgs,
+ PARAM = FastMnnParam(
+ merge.order = list(
list(1,3,5), # WT (3 replicates)
list(2,4,6) # td-Tomato (3 replicates)
)
)
)
-merged <- runTSNE(merged, dimred="corrected")
-plotTSNE(merged, colour_by="batch")
+merged <- runTSNE(merged, dimred = "corrected")
+
+plotTSNE(merged, colour_by = "batch")
Once we removed the sample batch effect, we can proceed with the Differential Expression Analysis.
@@ -3869,7 +3672,7 @@It’s important to have multiple samples within each experimental group because it helps the batch effect correction algorithm distinguish @@ -3892,7 +3695,7 @@
In order to perform a Differential Expression Analysis, we need to +
In order to perform a differential expression analysis, we need to identify groups of cells across samples/conditions (depending on the experimental design and the final aim of the experiment).
As previously seen, we have two ways of grouping cells, cell @@ -3920,9 +3723,12 @@
# Using 'label' and 'sample' as our two factors; each column of the output
# corresponds to one unique combination of these two factors.
-library(scuttle)
-summed <- aggregateAcrossCells(merged,
- id=colData(merged)[,c("celltype.mapped", "sample")])
+
+summed <- aggregateAcrossCells(
+ merged,
+ id = colData(merged)[,c("celltype.mapped", "sample")]
+)
+
summed
label <- "Mesenchyme"
-current <- summed[,label==summed$celltype.mapped]
-# Creating up a DGEList object for use in edgeR:
-library(edgeR)
-y <- DGEList(counts(current), samples=colData(current))
+current <- summed[,label == summed$celltype.mapped]
+
+y <- DGEList(counts(current), samples = colData(current))
+
y
discarded <- current$ncells < 10
+
y <- y[,!discarded]
+
summary(discarded)
-keep <- filterByExpr(y, group=current$tomato)
+keep <- filterByExpr(y, group = current$tomato)
+
y <- y[keep,]
+
summary(keep)
y <- calcNormFactors(y)
+
y$samples
-limma::plotMDS(cpm(y, log=TRUE),
- col=ifelse(y$samples$tomato, "red", "blue"))
+limma::plotMDS(cpm(y, log = TRUE),
+ col = ifelse(y$samples$tomato, "red", "blue"))
We then construct a design matrix by including both the pool and the tomato as factors. This design indicates which samples belong to which @@ -4147,6 +3958,7 @@
y <- estimateDisp(y, design)
+
summary(y$trended.dispersion)
We then fit a Quasi-Likelihood (QL) negative binomial generalized
-linear model for each gene. The robust=TRUE
parameter
+linear model for each gene. The robust = TRUE
parameter
avoids distortions from highly variable clusters. The QL method includes
an additional dispersion parameter, useful to handle the uncertainty and
variability of the per-gene variance, which is not well estimated by the
@@ -4176,7 +3988,8 @@
-fit <- glmQLFit(y, design, robust=TRUE)
+fit <- glmQLFit(y, design, robust = TRUE)
+
summary(fit$var.prior)
-res <- glmQLFTest(fit, coef=ncol(design))
+res <- glmQLFTest(fit, coef = ncol(design))
+
summary(decideTests(res))
-library(scran)
-summed.filt <- summed[,summed$ncells >= 10]
+summed.filt <- summed[,summed$ncells >= 10]
-de.results <- pseudoBulkDGE(summed.filt,
- label=summed.filt$celltype.mapped,
- design=~factor(pool) + tomato,
- coef="tomatoTRUE",
- condition=summed.filt$tomato
+de.results <- pseudoBulkDGE(
+ summed.filt,
+ label = summed.filt$celltype.mapped,
+ design = ~factor(pool) + tomato,
+ coef = "tomatoTRUE",
+ condition = summed.filt$tomato
)
The returned object is a list of DataFrame
s each with
@@ -4274,6 +4088,7 @@
cur.results <- de.results[["Allantois"]]
+
cur.results[order(cur.results$PValue),]
“logFC” stands for log fold-change. Rather than reporting e.g. a 5-fold increase, it’s better to report a logFC of log(5) = 1.61. @@ -4330,26 +4145,29 @@
With DA we look for differences in cluster abundance across conditions (the tomato injection in our case), rather than differences in gene expression.
-We first setup some code and variables for further analysis, like -quantifying the number of cells per each cell type and fit a model to -catch differences between the injected cells and the background.
-The steps are very similar to the ones for DEGs analysis, but this -time we start our analysis on the computed abundances and without +
Our first steps are quantifying the number of cells per each cell +type and fitting a model to catch differences between the injected cells +and the background.
+The process is very similar differential expression modeling, but +this time we start our analysis on the computed abundances and without normalizing the data with TMM.
-library(edgeR)
-abundances <- table(merged$celltype.mapped, merged$sample)
+abundances <- table(merged$celltype.mapped, merged$sample)
+
abundances <- unclass(abundances)
-# Attaching some column metadata.
+
extra.info <- colData(merged)[match(colnames(abundances), merged$sample),]
-y.ab <- DGEList(abundances, samples=extra.info)
+
+y.ab <- DGEList(abundances, samples = extra.info)
design <- model.matrix(~factor(pool) + factor(tomato), y.ab$samples)
-y.ab <- estimateDisp(y.ab, design, trend="none")
-fit.ab <- glmQLFit(y.ab, design, robust=TRUE, abundance.trend=FALSE)
+
+y.ab <- estimateDisp(y.ab, design, trend = "none")
+
+fit.ab <- glmQLFit(y.ab, design, robust = TRUE, abundance.trend = FALSE)
y.ab2 <- calcNormFactors(y.ab)
+
y.ab2$samples$norm.factors
-y.ab2 <- estimateDisp(y.ab2, design, trend="none")
+y.ab2 <- estimateDisp(y.ab2, design, trend = "none")
-fit.ab2 <- glmQLFit(y.ab2, design, robust=TRUE, abundance.trend=FALSE)
+fit.ab2 <- glmQLFit(y.ab2, design, robust = TRUE, abundance.trend = FALSE)
-res2 <- glmQLFTest(fit.ab2, coef=ncol(design))
+res2 <- glmQLFTest(fit.ab2, coef = ncol(design))
summary(decideTests(res2))
-topTags(res2, n=10)
+topTags(res2, n = 10)
-res.lfc <- glmTreat(fit.ab, coef=ncol(design), lfc=1)
+res.lfc <- glmTreat(fit.ab, coef = ncol(design), lfc = 1)
+
summary(decideTests(res.lfc))
Remember, you can subset SingleCellExperiments with logical indices, just like a matrix. You can also access their column data with the @@ -4644,7 +4466,7 @@
summed.filt.subset = summed.filt[,summed.filt$pool != 3]
-de.results <- pseudoBulkDGE(summed.filt.subset,
- label=summed.filt.subset$celltype.mapped,
- design=~factor(pool) + tomato,
- coef="tomatoTRUE",
- condition=summed.filt.subset$tomato
+de.results <- pseudoBulkDGE(
+ summed.filt.subset,
+ label = summed.filt.subset$celltype.mapped,
+ design = ~factor(pool) + tomato,
+ coef = "tomatoTRUE",
+ condition = summed.filt.subset$tomato
)
You can just hand pheatmap()
a matrix as its only
argument. It has a million options, but the defaults are usually pretty
@@ -4694,15 +4517,13 @@
-library(pheatmap)
-
-pheatmap(y.ab$counts)
+pheatmap(y.ab$counts)
The top DA result was a decrease in ExE ectoderm in the tomato condition, which you can sort of see, especially if you @@ -6462,7 +6283,7 @@
We see in the help documentation for ?clusterCells
that
all of the clustering algorithm details are handled through the
@@ -666,7 +666,7 @@
One important reason why is because averages over all other clusters can be sensitive to the cell type composition. If a rare cell type shows @@ -956,7 +956,7 @@
Use BiocParallel
and the BPPARAM
argument!
This example will set it to use four cores on your laptop, but you can
@@ -1144,7 +1144,9 @@
-new.labels Allantois Blood progenitors 1
- Allantois 28 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 0 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 1 0
- Gut 0 0
- Haematoendothelial progenitors 1 0
- Intermediate mesoderm 0 0
- Mesenchyme 0 0
- Neural crest 11 4
- NMP 0 0
- Paraxial mesoderm 5 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 0
-
-new.labels Blood progenitors 2 Cardiomyocytes
- Allantois 0 0
- Cardiomyocytes 0 27
- Endothelium 0 0
- Erythroid2 1 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 0 0
- Gut 0 0
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 0
- Mesenchyme 0 0
- Neural crest 6 1
- NMP 0 0
- Paraxial mesoderm 0 4
- Pharyngeal mesoderm 0 6
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 0
-
-new.labels Caudal epiblast Caudal Mesoderm Def. endoderm
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 0 0
- Erythroid2 0 0 0
- Erythroid3 0 0 0
- ExE mesoderm 0 0 0
- Forebrain/Midbrain/Hindbrain 1 0 2
- Gut 0 0 0
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 0 0 0
- Mesenchyme 0 0 0
- Neural crest 0 0 1
- NMP 0 0 0
- Paraxial mesoderm 0 0 1
- Pharyngeal mesoderm 0 0 0
- Somitic mesoderm 0 1 1
- Spinal cord 0 0 0
- Surface ectoderm 0 0 0
-
-new.labels Doublet Endothelium Erythroid1 Erythroid2
- Allantois 0 0 0 0
- Cardiomyocytes 0 0 0 0
- Endothelium 0 13 0 0
- Erythroid2 0 0 14 21
- Erythroid3 0 0 6 5
- ExE mesoderm 0 0 0 0
- Forebrain/Midbrain/Hindbrain 6 0 0 0
- Gut 0 0 0 0
- Haematoendothelial progenitors 0 19 0 0
- Intermediate mesoderm 13 0 0 0
- Mesenchyme 0 0 0 0
- Neural crest 20 1 3 0
- NMP 0 0 0 0
- Paraxial mesoderm 5 0 0 0
- Pharyngeal mesoderm 1 0 0 0
- Somitic mesoderm 1 0 0 0
- Spinal cord 1 0 0 0
- Surface ectoderm 0 0 0 0
-
-new.labels Erythroid3 ExE mesoderm
- Allantois 0 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 51 0
- Erythroid3 49 0
- ExE mesoderm 0 23
- Forebrain/Midbrain/Hindbrain 0 1
- Gut 0 0
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 16
- Mesenchyme 0 0
- Neural crest 0 17
- NMP 0 0
- Paraxial mesoderm 0 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 0
-
-new.labels Forebrain/Midbrain/Hindbrain Gut
- Allantois 0 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 0 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 83 4
- Gut 0 5
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 0
- Mesenchyme 0 0
- Neural crest 20 0
- NMP 0 0
- Paraxial mesoderm 0 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 12
-
-new.labels Haematoendothelial progenitors
- Allantois 0
- Cardiomyocytes 0
- Endothelium 0
- Erythroid2 0
- Erythroid3 0
- ExE mesoderm 0
- Forebrain/Midbrain/Hindbrain 0
- Gut 0
- Haematoendothelial progenitors 16
- Intermediate mesoderm 0
- Mesenchyme 0
- Neural crest 8
- NMP 0
- Paraxial mesoderm 2
- Pharyngeal mesoderm 0
- Somitic mesoderm 0
- Spinal cord 0
- Surface ectoderm 0
-
-new.labels Intermediate mesoderm Mesenchyme Neural crest
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 0 0
- Erythroid2 0 0 0
- Erythroid3 0 0 0
- ExE mesoderm 1 7 0
- Forebrain/Midbrain/Hindbrain 0 3 0
- Gut 0 0 0
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 9 15 0
- Mesenchyme 0 69 0
- Neural crest 4 4 10
- NMP 0 0 0
- Paraxial mesoderm 0 7 0
- Pharyngeal mesoderm 0 13 0
- Somitic mesoderm 2 0 0
- Spinal cord 0 0 0
- Surface ectoderm 0 0 0
-
-new.labels NMP Paraxial mesoderm Pharyngeal mesoderm
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 0 0
- Erythroid2 0 0 0
- Erythroid3 0 0 0
- ExE mesoderm 0 0 0
- Forebrain/Midbrain/Hindbrain 41 2 4
- Gut 0 0 0
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 0 1 5
- Mesenchyme 0 0 0
- Neural crest 5 20 10
- NMP 16 0 0
- Paraxial mesoderm 0 43 3
- Pharyngeal mesoderm 0 0 18
- Somitic mesoderm 0 0 0
- Spinal cord 0 0 0
- Surface ectoderm 0 0 0
-
-new.labels Rostral neurectoderm Somitic mesoderm
- Allantois 0 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 0 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 11 1
- Gut 0 0
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 2
- Mesenchyme 0 0
- Neural crest 0 7
- NMP 0 0
- Paraxial mesoderm 0 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 25
- Spinal cord 0 0
- Surface ectoderm 0 0
+new.labels Allantois Blood progenitors 1 Blood progenitors 2
+ Allantois 28 0 0
+ Cardiomyocytes 0 0 0
+ Endothelium 0 0 0
+ Erythroid2 0 0 1
-new.labels Spinal cord Stripped Surface ectoderm
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 1 0
- Erythroid2 0 1 0
- Erythroid3 0 1 0
- ExE mesoderm 0 0 0
- Forebrain/Midbrain/Hindbrain 37 0 17
- Gut 0 0 2
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 0 0 0
- Mesenchyme 0 0 2
- Neural crest 3 5 6
- NMP 0 0 0
- Paraxial mesoderm 0 0 0
- Pharyngeal mesoderm 0 0 0
- Somitic mesoderm 0 0 0
- Spinal cord 9 0 0
- Surface ectoderm 0 0 20
+new.labels Cardiomyocytes
+ Allantois 0
+ Cardiomyocytes 27
+ Endothelium 0
+ Erythroid2 0
As a diagnostic measure, we examine the distribution of AUCs across cells for each label. In heterogeneous populations, the distribution for @@ -1421,7 +1215,7 @@
The example that jumps out most strongly to the eye is ExE endoderm, which doesn’t show clear separate modes. Simultaneously, Endothelium @@ -1566,7 +1360,7 @@
The NNGraphParam
constructor has an argument
cluster.args
. This allows to specify arguments passed on to
@@ -1583,7 +1377,7 @@
TODO
Use the goana()
function from the limma
package to identify GO BP terms that are overrepresented in the list of
@@ -1626,7 +1420,7 @@
TODO
TODO
Whenever your code involves the generation of random numbers, it’s a good practice to set the random seed in R with @@ -791,7 +791,7 @@
Spike-ins are deliberately-introduced exogeneous RNA from an exotic or synthetic source at a known concentration. This provides a known @@ -1349,7 +1349,7 @@
Mathematically, this would require the data to fall on a two-dimensional plane (for linear methods like PCA) or a smooth 2D @@ -1512,7 +1512,7 @@
First subset the object to include only highly variable genes
(sce2 <- sce[hvg.sce.var,]
) and then apply the
diff --git a/hca.html b/hca.html
index 18576b9..071b6cc 100644
--- a/hca.html
+++ b/hca.html
@@ -788,7 +788,7 @@
.pkg
file for the latest R versionWhenever your code involves the generation of random numbers, it’s a good practice to set the random seed in R with @@ -1353,7 +1353,7 @@
Spike-ins are deliberately-introduced exogeneous RNA from an exotic or synthetic source at a known concentration. This provides a known @@ -1924,7 +1924,7 @@
Mathematically, this would require the data to fall on a two-dimensional plane (for linear methods like PCA) or a smooth 2D @@ -2094,7 +2094,7 @@
First subset the object to include only highly variable genes
(sce2 <- sce[hvg.sce.var,]
) and then apply the
@@ -2380,7 +2380,7 @@
We see in the help documentation for ?clusterCells
that
all of the clustering algorithm details are handled through the
@@ -2533,7 +2533,7 @@
One important reason why is because averages over all other clusters can be sensitive to the cell type composition. If a rare cell type shows @@ -2826,7 +2826,7 @@
Use BiocParallel
and the BPPARAM
argument!
This example will set it to use four cores on your laptop, but you can
@@ -3015,7 +3015,9 @@
-new.labels Allantois Blood progenitors 1
- Allantois 28 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 0 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 1 0
- Gut 0 0
- Haematoendothelial progenitors 1 0
- Intermediate mesoderm 0 0
- Mesenchyme 0 0
- Neural crest 11 4
- NMP 0 0
- Paraxial mesoderm 5 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 0
-
-new.labels Blood progenitors 2 Cardiomyocytes
- Allantois 0 0
- Cardiomyocytes 0 27
- Endothelium 0 0
- Erythroid2 1 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 0 0
- Gut 0 0
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 0
- Mesenchyme 0 0
- Neural crest 6 1
- NMP 0 0
- Paraxial mesoderm 0 4
- Pharyngeal mesoderm 0 6
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 0
-
-new.labels Caudal epiblast Caudal Mesoderm Def. endoderm
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 0 0
- Erythroid2 0 0 0
- Erythroid3 0 0 0
- ExE mesoderm 0 0 0
- Forebrain/Midbrain/Hindbrain 1 0 2
- Gut 0 0 0
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 0 0 0
- Mesenchyme 0 0 0
- Neural crest 0 0 1
- NMP 0 0 0
- Paraxial mesoderm 0 0 1
- Pharyngeal mesoderm 0 0 0
- Somitic mesoderm 0 1 1
- Spinal cord 0 0 0
- Surface ectoderm 0 0 0
-
-new.labels Doublet Endothelium Erythroid1 Erythroid2
- Allantois 0 0 0 0
- Cardiomyocytes 0 0 0 0
- Endothelium 0 13 0 0
- Erythroid2 0 0 14 21
- Erythroid3 0 0 6 5
- ExE mesoderm 0 0 0 0
- Forebrain/Midbrain/Hindbrain 6 0 0 0
- Gut 0 0 0 0
- Haematoendothelial progenitors 0 19 0 0
- Intermediate mesoderm 13 0 0 0
- Mesenchyme 0 0 0 0
- Neural crest 20 1 3 0
- NMP 0 0 0 0
- Paraxial mesoderm 5 0 0 0
- Pharyngeal mesoderm 1 0 0 0
- Somitic mesoderm 1 0 0 0
- Spinal cord 1 0 0 0
- Surface ectoderm 0 0 0 0
-
-new.labels Erythroid3 ExE mesoderm
- Allantois 0 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 51 0
- Erythroid3 49 0
- ExE mesoderm 0 23
- Forebrain/Midbrain/Hindbrain 0 1
- Gut 0 0
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 16
- Mesenchyme 0 0
- Neural crest 0 17
- NMP 0 0
- Paraxial mesoderm 0 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 0
+new.labels Allantois Blood progenitors 1 Blood progenitors 2
+ Allantois 28 0 0
+ Cardiomyocytes 0 0 0
+ Endothelium 0 0 0
+ Erythroid2 0 0 1
-new.labels Forebrain/Midbrain/Hindbrain Gut
- Allantois 0 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 0 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 83 4
- Gut 0 5
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 0
- Mesenchyme 0 0
- Neural crest 20 0
- NMP 0 0
- Paraxial mesoderm 0 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 0
- Spinal cord 0 0
- Surface ectoderm 0 12
-
-new.labels Haematoendothelial progenitors
- Allantois 0
- Cardiomyocytes 0
- Endothelium 0
- Erythroid2 0
- Erythroid3 0
- ExE mesoderm 0
- Forebrain/Midbrain/Hindbrain 0
- Gut 0
- Haematoendothelial progenitors 16
- Intermediate mesoderm 0
- Mesenchyme 0
- Neural crest 8
- NMP 0
- Paraxial mesoderm 2
- Pharyngeal mesoderm 0
- Somitic mesoderm 0
- Spinal cord 0
- Surface ectoderm 0
-
-new.labels Intermediate mesoderm Mesenchyme Neural crest
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 0 0
- Erythroid2 0 0 0
- Erythroid3 0 0 0
- ExE mesoderm 1 7 0
- Forebrain/Midbrain/Hindbrain 0 3 0
- Gut 0 0 0
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 9 15 0
- Mesenchyme 0 69 0
- Neural crest 4 4 10
- NMP 0 0 0
- Paraxial mesoderm 0 7 0
- Pharyngeal mesoderm 0 13 0
- Somitic mesoderm 2 0 0
- Spinal cord 0 0 0
- Surface ectoderm 0 0 0
-
-new.labels NMP Paraxial mesoderm Pharyngeal mesoderm
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 0 0
- Erythroid2 0 0 0
- Erythroid3 0 0 0
- ExE mesoderm 0 0 0
- Forebrain/Midbrain/Hindbrain 41 2 4
- Gut 0 0 0
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 0 1 5
- Mesenchyme 0 0 0
- Neural crest 5 20 10
- NMP 16 0 0
- Paraxial mesoderm 0 43 3
- Pharyngeal mesoderm 0 0 18
- Somitic mesoderm 0 0 0
- Spinal cord 0 0 0
- Surface ectoderm 0 0 0
-
-new.labels Rostral neurectoderm Somitic mesoderm
- Allantois 0 0
- Cardiomyocytes 0 0
- Endothelium 0 0
- Erythroid2 0 0
- Erythroid3 0 0
- ExE mesoderm 0 0
- Forebrain/Midbrain/Hindbrain 11 1
- Gut 0 0
- Haematoendothelial progenitors 0 0
- Intermediate mesoderm 0 2
- Mesenchyme 0 0
- Neural crest 0 7
- NMP 0 0
- Paraxial mesoderm 0 0
- Pharyngeal mesoderm 0 0
- Somitic mesoderm 0 25
- Spinal cord 0 0
- Surface ectoderm 0 0
-
-new.labels Spinal cord Stripped Surface ectoderm
- Allantois 0 0 0
- Cardiomyocytes 0 0 0
- Endothelium 0 1 0
- Erythroid2 0 1 0
- Erythroid3 0 1 0
- ExE mesoderm 0 0 0
- Forebrain/Midbrain/Hindbrain 37 0 17
- Gut 0 0 2
- Haematoendothelial progenitors 0 0 0
- Intermediate mesoderm 0 0 0
- Mesenchyme 0 0 2
- Neural crest 3 5 6
- NMP 0 0 0
- Paraxial mesoderm 0 0 0
- Pharyngeal mesoderm 0 0 0
- Somitic mesoderm 0 0 0
- Spinal cord 9 0 0
- Surface ectoderm 0 0 20
+new.labels Cardiomyocytes
+ Allantois 0
+ Cardiomyocytes 27
+ Endothelium 0
+ Erythroid2 0
As a diagnostic measure, we examine the distribution of AUCs across cells for each label. In heterogeneous populations, the distribution for @@ -3292,7 +3086,7 @@
The example that jumps out most strongly to the eye is ExE endoderm, which doesn’t show clear separate modes. Simultaneously, Endothelium @@ -3441,7 +3235,7 @@
The NNGraphParam
constructor has an argument
cluster.args
. This allows to specify arguments passed on to
@@ -3458,7 +3252,7 @@
TODO
Use the goana()
function from the limma
package to identify GO BP terms that are overrepresented in the list of
@@ -3501,7 +3295,7 @@
TODO
TODO
Content from Multi-sample analyses
Last updated on 2024-09-06 | +
Last updated on 2024-09-08 | Edit this page
Estimated time: 45 minutes
@@ -3661,13 +3455,23 @@We start by loading the data and doing a quick exploratory analysis, essentially applying the normalization and visualization techniques that -we have seen in the previous lectures to all samples.
+we have seen in the previous lectures to all samples. Note that this +time we’re selecting samples 5 to 10, not just 5 by itself.
library(MouseGastrulationData)
-sce <- WTChimeraData(samples=5:10, type = "processed")
+library(batchelor)
+library(edgeR)
+library(scater)
+library(ggplot2)
+library(scran)
+library(pheatmap)
+library(scuttle)
+
+sce <- WTChimeraData(samples = 5:10, type = "processed")
+
sce
-library(scater)
-library(ggplot2)
-library(scran)
+drop <- sce$celltype.mapped %in% c("stripped", "Doublet")
-# remove doublets
-drop <- sce$celltype.mapped %in% c("stripped", "Doublet")
sce <- sce[,!drop]
set.seed(29482)
+
idx <- unlist(tapply(colnames(sce), sce$sample, function(x) {
perc <- round(0.50 * length(x))
sample(x, perc)
@@ -3758,23 +3559,24 @@ R
sce <- sce[,idx]
We now normalize the data and visualize them in a tSNE plot.
+We now normalize the data, run some dimensionality reduction steps, +and visualize them in a tSNE plot.
-# normalization
-sce <- logNormCounts(sce)
+sce <- logNormCounts(sce)
+
+dec <- modelGeneVar(sce, block = sce$sample)
-# identify highly variable genes
-dec <- modelGeneVar(sce, block=sce$sample)
chosen.hvgs <- dec$bio > 0
-# dimensionality reduction
sce <- runPCA(sce, subset_row = chosen.hvgs, ntop = 1000)
+
sce <- runTSNE(sce, dimred = "PCA")
sce$sample <- as.factor(sce$sample)
+
plotTSNE(sce, colour_by = "sample")
Samples 5 and 6 were from the same “pool” of cells. Looking at the
documentation for the dataset under ?WTChimeraData
we see
@@ -3822,7 +3624,7 @@
We correct the effect of samples by aid of the +
We “correct” the effect of samples with the
correctExperiment
function in the batchelor
-package and using the sample
colData
column as
-batch.
sample
column as batch.
-library(batchelor)
-set.seed(10102)
-merged <- correctExperiments(sce,
- batch=sce$sample,
- subset.row=chosen.hvgs,
- PARAM=FastMnnParam(
- merge.order=list(
+set.seed(10102)
+
+merged <- correctExperiments(
+ sce,
+ batch = sce$sample,
+ subset.row = chosen.hvgs,
+ PARAM = FastMnnParam(
+ merge.order = list(
list(1,3,5), # WT (3 replicates)
list(2,4,6) # td-Tomato (3 replicates)
)
)
)
-merged <- runTSNE(merged, dimred="corrected")
-plotTSNE(merged, colour_by="batch")
+merged <- runTSNE(merged, dimred = "corrected")
+
+plotTSNE(merged, colour_by = "batch")
Once we removed the sample batch effect, we can proceed with the Differential Expression Analysis.
@@ -3875,7 +3678,7 @@It’s important to have multiple samples within each experimental group because it helps the batch effect correction algorithm distinguish @@ -3898,7 +3701,7 @@
In order to perform a Differential Expression Analysis, we need to +
In order to perform a differential expression analysis, we need to identify groups of cells across samples/conditions (depending on the experimental design and the final aim of the experiment).
As previously seen, we have two ways of grouping cells, cell @@ -3926,9 +3729,12 @@
# Using 'label' and 'sample' as our two factors; each column of the output
# corresponds to one unique combination of these two factors.
-library(scuttle)
-summed <- aggregateAcrossCells(merged,
- id=colData(merged)[,c("celltype.mapped", "sample")])
+
+summed <- aggregateAcrossCells(
+ merged,
+ id = colData(merged)[,c("celltype.mapped", "sample")]
+)
+
summed
label <- "Mesenchyme"
-current <- summed[,label==summed$celltype.mapped]
-# Creating up a DGEList object for use in edgeR:
-library(edgeR)
-y <- DGEList(counts(current), samples=colData(current))
+current <- summed[,label == summed$celltype.mapped]
+
+y <- DGEList(counts(current), samples = colData(current))
+
y
discarded <- current$ncells < 10
+
y <- y[,!discarded]
+
summary(discarded)
-keep <- filterByExpr(y, group=current$tomato)
+keep <- filterByExpr(y, group = current$tomato)
+
y <- y[keep,]
+
summary(keep)
y <- calcNormFactors(y)
+
y$samples
-limma::plotMDS(cpm(y, log=TRUE),
- col=ifelse(y$samples$tomato, "red", "blue"))
+limma::plotMDS(cpm(y, log = TRUE),
+ col = ifelse(y$samples$tomato, "red", "blue"))
We then construct a design matrix by including both the pool and the tomato as factors. This design indicates which samples belong to which @@ -4153,6 +3964,7 @@
y <- estimateDisp(y, design)
+
summary(y$trended.dispersion)
We then fit a Quasi-Likelihood (QL) negative binomial generalized
-linear model for each gene. The robust=TRUE
parameter
+linear model for each gene. The robust = TRUE
parameter
avoids distortions from highly variable clusters. The QL method includes
an additional dispersion parameter, useful to handle the uncertainty and
variability of the per-gene variance, which is not well estimated by the
@@ -4182,7 +3994,8 @@
-fit <- glmQLFit(y, design, robust=TRUE)
+fit <- glmQLFit(y, design, robust = TRUE)
+
summary(fit$var.prior)
-res <- glmQLFTest(fit, coef=ncol(design))
+res <- glmQLFTest(fit, coef = ncol(design))
+
summary(decideTests(res))
-library(scran)
-summed.filt <- summed[,summed$ncells >= 10]
+summed.filt <- summed[,summed$ncells >= 10]
-de.results <- pseudoBulkDGE(summed.filt,
- label=summed.filt$celltype.mapped,
- design=~factor(pool) + tomato,
- coef="tomatoTRUE",
- condition=summed.filt$tomato
+de.results <- pseudoBulkDGE(
+ summed.filt,
+ label = summed.filt$celltype.mapped,
+ design = ~factor(pool) + tomato,
+ coef = "tomatoTRUE",
+ condition = summed.filt$tomato
)
The returned object is a list of DataFrame
s each with
@@ -4280,6 +4094,7 @@
cur.results <- de.results[["Allantois"]]
+
cur.results[order(cur.results$PValue),]
“logFC” stands for log fold-change. Rather than reporting e.g. a 5-fold increase, it’s better to report a logFC of log(5) = 1.61. @@ -4336,26 +4151,29 @@
With DA we look for differences in cluster abundance across conditions (the tomato injection in our case), rather than differences in gene expression.
-We first setup some code and variables for further analysis, like -quantifying the number of cells per each cell type and fit a model to -catch differences between the injected cells and the background.
-The steps are very similar to the ones for DEGs analysis, but this -time we start our analysis on the computed abundances and without +
Our first steps are quantifying the number of cells per each cell +type and fitting a model to catch differences between the injected cells +and the background.
+The process is very similar differential expression modeling, but +this time we start our analysis on the computed abundances and without normalizing the data with TMM.
-library(edgeR)
-abundances <- table(merged$celltype.mapped, merged$sample)
+abundances <- table(merged$celltype.mapped, merged$sample)
+
abundances <- unclass(abundances)
-# Attaching some column metadata.
+
extra.info <- colData(merged)[match(colnames(abundances), merged$sample),]
-y.ab <- DGEList(abundances, samples=extra.info)
+
+y.ab <- DGEList(abundances, samples = extra.info)
design <- model.matrix(~factor(pool) + factor(tomato), y.ab$samples)
-y.ab <- estimateDisp(y.ab, design, trend="none")
-fit.ab <- glmQLFit(y.ab, design, robust=TRUE, abundance.trend=FALSE)
+
+y.ab <- estimateDisp(y.ab, design, trend = "none")
+
+fit.ab <- glmQLFit(y.ab, design, robust = TRUE, abundance.trend = FALSE)
y.ab2 <- calcNormFactors(y.ab)
+
y.ab2$samples$norm.factors
-y.ab2 <- estimateDisp(y.ab2, design, trend="none")
+y.ab2 <- estimateDisp(y.ab2, design, trend = "none")
-fit.ab2 <- glmQLFit(y.ab2, design, robust=TRUE, abundance.trend=FALSE)
+fit.ab2 <- glmQLFit(y.ab2, design, robust = TRUE, abundance.trend = FALSE)
-res2 <- glmQLFTest(fit.ab2, coef=ncol(design))
+res2 <- glmQLFTest(fit.ab2, coef = ncol(design))
summary(decideTests(res2))
-topTags(res2, n=10)
+topTags(res2, n = 10)
-res.lfc <- glmTreat(fit.ab, coef=ncol(design), lfc=1)
+res.lfc <- glmTreat(fit.ab, coef = ncol(design), lfc = 1)
+
summary(decideTests(res.lfc))
Remember, you can subset SingleCellExperiments with logical indices, just like a matrix. You can also access their column data with the @@ -4650,7 +4472,7 @@
summed.filt.subset = summed.filt[,summed.filt$pool != 3]
-de.results <- pseudoBulkDGE(summed.filt.subset,
- label=summed.filt.subset$celltype.mapped,
- design=~factor(pool) + tomato,
- coef="tomatoTRUE",
- condition=summed.filt.subset$tomato
+de.results <- pseudoBulkDGE(
+ summed.filt.subset,
+ label = summed.filt.subset$celltype.mapped,
+ design = ~factor(pool) + tomato,
+ coef = "tomatoTRUE",
+ condition = summed.filt.subset$tomato
)
You can just hand pheatmap()
a matrix as its only
argument. It has a million options, but the defaults are usually pretty
@@ -4700,15 +4523,13 @@
-library(pheatmap)
-
-pheatmap(y.ab$counts)
+pheatmap(y.ab$counts)
The top DA result was a decrease in ExE ectoderm in the tomato condition, which you can sort of see, especially if you @@ -6470,7 +6291,7 @@