---
# System prepended metadata

title: R处理单细胞RNA测序 | 亞圖跨際

---

# R处理单细胞RNA测序
在R语言中进行单细胞RNA测序（scRNA-seq）数据分析时，**Seurat** 和 **SingleCellExperiment** 是常用的工具包。Seurat特别适合处理、分析和可视化scRNA-seq数据。下面将介绍如何使用这些R包进行单细胞RNA测序的基本分析，包括数据读取、预处理、降维、聚类和差异表达分析等步骤。

![单细胞RNA测序示例代码](https://hackmd.io/_uploads/Bkf9UDO-ke.svg)

### 1. 安装和加载所需的R包

如果还没有安装`Seurat`包，可以使用以下命令安装。还会用到`ggplot2`包用于可视化。

```R
install.packages("Seurat")
install.packages("ggplot2")
```

加载Seurat和ggplot2库：

```R
library(Seurat)
library(ggplot2)
```

### 2. 导入数据

Seurat支持多种格式的数据读取，例如10X Genomics的h5格式和CSV文件等。

```R
# 从10X Genomics的h5文件读取数据
data <- Read10X_h5("filtered_feature_bc_matrix.h5")

# 创建Seurat对象
seurat_obj <- CreateSeuratObject(counts = data, project = "scRNAseq", min.cells = 3, min.features = 200)
```

### 3. 数据预处理

预处理包括过滤低质量细胞和低表达基因、标准化、对数变换和高变基因的识别。

#### 3.1 过滤低质量细胞和基因

过滤出在200个以上基因中有表达的细胞，以及至少在3个细胞中表达的基因。

```R
seurat_obj <- subset(seurat_obj, subset = nFeature_RNA > 200 & nCount_RNA < 2500)
```

#### 3.2 计算线粒体基因比例

在过滤过程中，可以计算线粒体基因的比例以去除线粒体基因含量较高的细胞（可能为低质量或死亡细胞）。

```R
seurat_obj[["percent.mt"]] <- PercentageFeatureSet(seurat_obj, pattern = "^MT-")
seurat_obj <- subset(seurat_obj, subset = percent.mt < 5)
```

#### 3.3 数据标准化和对数变换

将数据进行标准化和对数变换，以便进行下游分析。

```R
seurat_obj <- NormalizeData(seurat_obj, normalization.method = "LogNormalize", scale.factor = 10000)
```

#### 3.4 识别高变基因

识别高变基因有助于在降维时关注于生物学上更重要的信息。

```R
seurat_obj <- FindVariableFeatures(seurat_obj, selection.method = "vst", nfeatures = 2000)
```

### 4. 数据降维

降维步骤将数据从高维空间映射到较低维度，以便于可视化和聚类。

#### 4.1 线性降维（PCA）

首先进行PCA分析，计算细胞之间的主成分。

```R
seurat_obj <- ScaleData(seurat_obj, features = rownames(seurat_obj))
seurat_obj <- RunPCA(seurat_obj, features = VariableFeatures(object = seurat_obj))
ElbowPlot(seurat_obj)  # 查看前几个主成分的解释程度
```

#### 4.2 非线性降维（UMAP或t-SNE）

使用UMAP或t-SNE方法进一步降维，以便可视化细胞簇。

```R
# 构建基于PCA的邻近图
seurat_obj <- FindNeighbors(seurat_obj, dims = 1:10)

# 使用UMAP降维
seurat_obj <- RunUMAP(seurat_obj, dims = 1:10)
DimPlot(seurat_obj, reduction = "umap", group.by = "orig.ident")  # 根据样本分组可视化
```

### 5. 聚类分析

聚类用于识别具有相似表达特征的细胞群体。Seurat支持基于图的Louvain或Leiden聚类算法。

```R
seurat_obj <- FindClusters(seurat_obj, resolution = 0.5)
DimPlot(seurat_obj, reduction = "umap", label = TRUE, pt.size = 0.5)  # 根据聚类结果标注
```

### 6. 差异表达分析

差异表达分析用于找到不同簇之间的特异性基因（标志基因）。

```R
# 对每个簇进行差异表达分析
cluster_markers <- FindAllMarkers(seurat_obj, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
head(cluster_markers)  # 查看每个簇的前几个差异表达基因

# 可视化标志基因
VlnPlot(seurat_obj, features = c("GeneA", "GeneB"), group.by = "seurat_clusters")
FeaturePlot(seurat_obj, features = c("GeneA", "GeneB"))
```

### 7. 可视化

Seurat提供多种可视化方法，可以展示聚类、UMAP/t-SNE降维结果、特定基因的表达分布等。

```R
# 展示UMAP降维和聚类结果
DimPlot(seurat_obj, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()

# 热图展示不同簇的差异表达基因
top10 <- cluster_markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_log2FC)
DoHeatmap(seurat_obj, features = top10$gene) + NoLegend()
```

### 8. 保存与导出数据

可以将Seurat对象或差异表达结果导出，以便后续分析或共享。

```R
# 保存Seurat对象
saveRDS(seurat_obj, file = "scRNA_seurat_obj.rds")

# 保存差异表达基因列表
write.csv(cluster_markers, file = "cluster_markers.csv")
```

### 完整代码示例

以下是从导入数据到聚类和差异表达分析的完整代码示例：

```R
library(Seurat)
library(ggplot2)

# 读取数据并创建Seurat对象
data <- Read10X_h5("filtered_feature_bc_matrix.h5")
seurat_obj <- CreateSeuratObject(counts = data, project = "scRNAseq", min.cells = 3, min.features = 200)

# 预处理
seurat_obj[["percent.mt"]] <- PercentageFeatureSet(seurat_obj, pattern = "^MT-")
seurat_obj <- subset(seurat_obj, subset = nFeature_RNA > 200 & nCount_RNA < 2500 & percent.mt < 5)
seurat_obj <- NormalizeData(seurat_obj)
seurat_obj <- FindVariableFeatures(seurat_obj, selection.method = "vst", nfeatures = 2000)

# 数据降维
seurat_obj <- ScaleData(seurat_obj, features = rownames(seurat_obj))
seurat_obj <- RunPCA(seurat_obj, features = VariableFeatures(object = seurat_obj))
seurat_obj <- FindNeighbors(seurat_obj, dims = 1:10)
seurat_obj <- RunUMAP(seurat_obj, dims = 1:10)

# 聚类分析
seurat_obj <- FindClusters(seurat_obj, resolution = 0.5)
DimPlot(seurat_obj, reduction = "umap", label = TRUE)

# 差异表达分析
cluster_markers <- FindAllMarkers(seurat_obj, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)

# 可视化
VlnPlot(seurat_obj, features = c("GeneA", "GeneB"), group.by = "seurat_clusters")
FeaturePlot(seurat_obj, features = c("GeneA", "GeneB"))

# 保存结果
saveRDS(seurat_obj, file = "scRNA_seurat_obj.rds")
write.csv(cluster_markers, file = "cluster_markers.csv")
```

### 总结

R语言中的**Seurat**包提供了强大的scRNA-seq数据分析功能，从数据预处理、降维、聚类到差异表达分析和可视化，适用于单细胞数据的全面分析。如果需要进行更加复杂的分析或整合不同数据集，Seurat也提供了许多高级功能。

### :point_right:[亞圖跨際-視角](https://viadean.notion.site/R-RNA-1361ae7b9a32808cb07ec42f433ea16b?pvs=4)