I have plotted my violin plots, but I am trying to find the mean and average expression at each of my time points.
Here is the code that I have used:
VlnPlot(spinalcord_neurons, features = c("Cx3cl1"), group.by= "time", pt.size = .5,) + theme (axis.text.x=element_text(angle=40, hjust=1)) + theme(legend.position = "right")
And here is the graph that I got:
I am new to using R and not familiar with all of the functions. Thank you for your help!
We can use some example data from the SeuratData
package. Generally for comparing expression between classes, we use the RNA
assay (or if you have used SCTransform
on your data, the SCT
assay)
Seurat
makes it easy to generate results, but it can be tricky to make sure results are valid. Sorry for the long-winded answer.
I assume by "mean and average expression" you want to get the mean expression of either your counts
or normalized data (which may be in the data
slot).
# Load library
library(Seurat)
# Load example data
library(SeuratData)
data("ifnb")
ifnb <- UpdateSeuratObject(ifnb)
# We have ident "stim" suitable for comparisons
colnames(ifnb@meta.data)
levels(factor(ifnb@meta.data$stim))
[1] "orig.ident" "nCount_RNA"
[3] "nFeature_RNA" "stim"
[5] "seurat_annotations"
[1] "CTRL" "STIM"
# VlnPlot using RNA assay
VlnPlot(ifnb, features = "CXCL10", group.by = "stim", assay = "RNA")
# Mean expression, returns values for each assay in your object
AverageExpression(ifnb, group.by = "stim", features = "CXCL10")
$RNA
CTRL STIM
[1,] 1.162095e+63 4.917149e+190
This gave us these crazy high numbers, but from the documentation for AverageExpression()
:
If slot is set to 'data', this function assumes that the data has been log normalized and therefore feature values are exponentiated prior to averaging so that averaging is done in non-log space. Otherwise, if slot is set to either 'counts' or 'scale.data', no exponentiation is performed prior to averaging
This example dataset is not an integrated object with any sort of workflow done to normalize the data, so the data
slot of the RNA
assay is currently just holding the counts, same as the counts
slot. We can either return average expression of the counts, or ensure that the data
slot is log-normalized. If it isn't already, you will want to ensure that your dataset is properly normalized, and integrated if need be.
These vignettes from the Seurat website are extremely helpful and practically required reading if you want to get acquainted with single cell analysis.
# Mean expression of the counts, with sane numbers
AverageExpression(ifnb, group.by = "stim", features = "CXCL10", slot = "counts")
# Mean expression, but we are acting on the `data` slot after normalization and
# log transformation. The default behavior of AverageExpression() exponentiates
# the log-transformed expression first before calculating means
# Since we have normalized the data in addition to log-transforming,
# the results are not exactly the same
ifnb_log <- NormalizeData(ifnb, normalization.method = "LogNormalize")
AverageExpression(ifnb_log, group.by = "stim", features = "CXCL10")
$RNA
CTRL STIM
[1,] 0.2965791 30.17246
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
$RNA
CTRL STIM
[1,] 1.141298 104.3836