2.单细胞 RNA-seq:计数矩阵的生成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.单细胞 RNA-seq:计数矩阵的生成相关的知识,希望对你有一定的参考价值。

参考技术A

根据所使用的文库制备方法,RNA序列(也称为读序列或标签)将从转录本的3端(或5端)(10X Genomics, cell -seq2, Drop-seq, inDrops)或全长转录本(Smart-seq)中获得。

针对感兴趣的生物学问题选择不同的方法。下面列出了这些方法的优点:

3 \'端测序与全长测序需要进行许多相同的分析步骤,但 3\' 端测序来越受欢迎,在分析中包含更多步骤。因此,我们将详细分析来自这些 3\' 端测序的数据,主要是基于液滴的方法(inDrops、Drop-seq、10X Genomics)。

对于 scRNA-seq 数据的分析,了解 每个reads中存在哪些信息 以及我们如何在分析中使用它是很有帮助的。

对于3 \'端测序方法来说,从同一转录本的不同分子中读取的信息,只会从转录本的3 \'端读取,因此序列相同的可能性很大。然而,在文库制备过程中的PCR步骤也可以产生read 复制。为了确定一个reads是生物的还是技术上的重复,这些方法使用独特的分子标识符(UMIs)。

所以我们需要跟踪 UMI,但是我们还需要什么信息来正确量化我们样本中每个细胞中每个基因的表达呢? 无论液滴方法是什么,在细胞水平上进行适当的定量都需要以下条件:

例如,当使用 inDrops v3 文库制备方法时,以下表示如何在四次reads中获取所有信息:

对于不同的基于液滴的 scRNA-seq 方法,scRNA-seq 的分析工作流程是相似的,但它们之间的 UMI、细胞 ID 和样本索引会有所不同。例如,下面是 10X 序列读取的示意图,其中索引、UMI 和条形码的放置方式不同:

scRNA-seq 方法将确定如何从测序读数中解析条形码和 UMI。因此,尽管一些特定步骤会略有不同,但无论使用何种方法,整个工作流程通常都会遵循相同的步骤。一般工作流程如下图所示:

工作流程的步骤是:

无论进行何种分析,基于每个条件的单个样本得出的关于总体的结论都是不可信的。 仍然需要生物学重复! 也就是说,如果您想得出与总体相对应的结论,而不单是做单个样本。

我们首先讨论工作流程的第一部分,即从原始测序数据生成计数矩阵。我们将重点介绍基于液滴的方法使用的 3\' 端测序,例如 inDrops、10X Genomics 和 Drop-seq。

测序后,测序设备将以 BCL 或 FASTQ 格式 输出原始测序数据 或生成计数矩阵 。如果reads是 BCL 格式,那么我们需要转换为 FASTQ 格式。有一个有用的命令行工具 bcl2fastq 可以轻松执行此转换。

对于许多 scRNA-seq 方法,从原始测序数据生成计数矩阵将经历类似的步骤。

alevin 是一种命令行工具,用于估计对转录本 3\' 端进行测序的 scRNA-seq 数据的表达。 umi-tools zUMI 是可以执行这些过程的附加工具。这些工具结合了 UMI 的折叠以校正放大偏差。此过程中的步骤包括:

如果使用 10X Genomics 文库制备方法,上述所有步骤将通过 Cell Ranger 管道 完成。

可以使用 FASTQ 文件来解析细胞barcode、UMI 和样本barcode。对于基于液滴的方法,由于以下原因,许多细胞barcode将匹配少量reads(< 1000 次read):

这些多余的条形码需要在reads比对之前从序列数据中过滤掉。为了进行这种过滤,为每个细胞提取并保存“细胞条形码”和“分子条形码”。例如,如果使用“umis”工具,信息将添加到每次read的标题行,格式如下:

文库制备方法中使用的已知细胞条形码应该是已知的,未知条形码将被丢弃,同时允许与已知细胞条形码的不匹配数量可接受。

如果是对多个样本测序,则该过程的下一步是对对样本进行拆分。这是此过程的一个步骤,不是由“umis”工具处理的,而是由“zUMI”完成的。我们需要解析reads以确定与每个细胞相关的样本barcode。

为了确定read源自哪个基因,reads使用传统 (STAR) 或轻量级方法 (Kallisto/RapMap) 进行比对。

重复的 UMI 被折叠,并且只有唯一的 UMI 使用 Kallisto 或 featureCounts 等工具进行量化。结果输出是一个按基因计数矩阵的单元格:

矩阵中的每个值代表源自相应基因的细胞中的read数。使用计数矩阵,我们可以探索和过滤数据,只保留更高质量的细胞。

无向图生成树计数 基尔霍夫矩阵 SPOJ Highways

基尔霍夫矩阵

https://blog.csdn.net/w4149/article/details/77387045

https://blog.csdn.net/qq_29963431/article/details/51236064

题目链接  https://vjudge.net/problem/SPOJ-HIGH

AC代码

 1 #include <bits/stdc++.h>
 2 #define pb push_back
 3 #define mp make_pair
 4 #define fi first
 5 #define se second
 6 #define all(a) (a).begin(), (a).end()
 7 #define fillchar(a, x) memset(a, x, sizeof(a))
 8 #define huan printf("
");
 9 #define debug(a,b) cout<<a<<" "<<b<<" ";
10 using namespace std;
11 typedef long long ll;
12 const int maxn=1e3+100,maxm=100,inf=0x3f3f3f3f;
13 const ll mod=998244353;
14 ll a[maxn][maxn],du[maxn];
15 ll det(int n)
16 {
17     ll ans = 1;
18     for (int i = 2; i <= n; i++)
19     {
20         for (int j = i + 1; j <= n; j++)
21         {
22             while (a[j][i] != 0)
23             {
24                 ll u = a[i][i] / a[j][i];
25                 for (int k = i; k <= n; k++)
26                 {
27                     ll t = (a[i][k] - (ll)a[j][k] * u);// % mod + mod) % mod;
28                     a[i][k] = a[j][k];
29                     a[j][k] = t;
30                 }
31                 ans = -ans;
32             }
33         }
34         ans = ans * a[i][i] ;//% mod;
35     }
36     if (ans < 0)
37     {
38         ans=-ans;
39         //ans += mod;
40     }
41     return ans;
42 }
43 int main()
44 {
45     int t,n,m;
46     scanf("%d",&t);
47     while(t--)
48     {
49         fillchar(a,0);
50         fillchar(du,0);
51         scanf("%d%d",&n,&m);
52         for(int i=0;i<m;i++)
53         {
54             int u,v;
55             scanf("%d%d",&u,&v);
56             du[u]++,du[v]++;
57             a[v][u]=-1,a[u][v]=-1;
58         }
59         for(int i=1;i<=n;i++)
60             a[i][i]=du[i];
61         printf("%lld
",det(n));
62     }
63 }

 行列式求值模板

int a[maxn][maxn];
ll det(int n)
{
    ll ans = 1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            while (a[j][i] != 0)
            {
                ll u = a[i][i] / a[j][i];
                for (int k = i; k <= n; k++)
                {
                    int t = (a[i][k] - (ll)a[j][k] * u % mod + mod) % mod;
                    a[i][k] = a[j][k];
                    a[j][k] = t;
                }
                ans = -ans;
            }
        }
        ans = ans * a[i][i] % mod;
    }
    if (ans < 0)
    {
        ans += mod;
    }
    return ans;
}

 

以上是关于2.单细胞 RNA-seq:计数矩阵的生成的主要内容,如果未能解决你的问题,请参考以下文章

上传RNA-seq数据到NCBI GEO数据库 | 单细胞RNA数据上传

8种特殊建库测序

单细胞RNA-seq比对定量用什么工具好?使用哪个版本的基因组?数据来说话

单细胞RNA-seq比对定量用什么工具好?使用哪个版本的基因组?数据来说话

简单理解RNA-seq

RNA-seq原理