https://github.com/sudoms/freqpcr
Interval estimation of population allele frequency based on quantitative PCR double-Delta Cq measures from bulk samples
https://github.com/sudoms/freqpcr
bioinformatics frequency-estimation pcr r statistics
Last synced: 3 months ago
JSON representation
Interval estimation of population allele frequency based on quantitative PCR double-Delta Cq measures from bulk samples
- Host: GitHub
- URL: https://github.com/sudoms/freqpcr
- Owner: sudoms
- Created: 2020-11-22T21:12:27.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2022-01-31T05:12:00.000Z (over 4 years ago)
- Last Synced: 2026-01-26T12:26:26.190Z (4 months ago)
- Topics: bioinformatics, frequency-estimation, pcr, r, statistics
- Language: R
- Homepage:
- Size: 501 KB
- Stars: 1
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.jp.html
Awesome Lists containing this project
README
README.jp
/**
* prism.js Github theme based on GitHub's theme.
* @author Sam Clarke
*/
code[class*="language-"],
pre[class*="language-"] {
color: #333;
background: none;
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.4;
-moz-tab-size: 8;
-o-tab-size: 8;
tab-size: 8;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*="language-"] {
padding: .8em;
overflow: auto;
/* border: 1px solid #ddd; */
border-radius: 3px;
/* background: #fff; */
background: #f5f5f5;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
background: #f5f5f5;
}
.token.comment,
.token.blockquote {
color: #969896;
}
.token.cdata {
color: #183691;
}
.token.doctype,
.token.punctuation,
.token.variable,
.token.macro.property {
color: #333;
}
.token.operator,
.token.important,
.token.keyword,
.token.rule,
.token.builtin {
color: #a71d5d;
}
.token.string,
.token.url,
.token.regex,
.token.attr-value {
color: #183691;
}
.token.property,
.token.number,
.token.boolean,
.token.entity,
.token.atrule,
.token.constant,
.token.symbol,
.token.command,
.token.code {
color: #0086b3;
}
.token.tag,
.token.selector,
.token.prolog {
color: #63a35c;
}
.token.function,
.token.namespace,
.token.pseudo-element,
.token.class,
.token.class-name,
.token.pseudo-class,
.token.id,
.token.url-reference .token.variable,
.token.attr-name {
color: #795da3;
}
.token.entity {
cursor: help;
}
.token.title,
.token.title .token.punctuation {
font-weight: bold;
color: #1d3e81;
}
.token.list {
color: #ed6a43;
}
.token.inserted {
background-color: #eaffea;
color: #55a532;
}
.token.deleted {
background-color: #ffecec;
color: #bd2c00;
}
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
/* JSON */
.language-json .token.property {
color: #183691;
}
.language-markup .token.tag .token.punctuation {
color: #333;
}
/* CSS */
code.language-css,
.language-css .token.function {
color: #0086b3;
}
/* YAML */
.language-yaml .token.atrule {
color: #63a35c;
}
code.language-yaml {
color: #183691;
}
/* Ruby */
.language-ruby .token.function {
color: #333;
}
/* Markdown */
.language-markdown .token.url {
color: #795da3;
}
/* Makefile */
.language-makefile .token.symbol {
color: #795da3;
}
.language-makefile .token.variable {
color: #183691;
}
.language-makefile .token.builtin {
color: #0086b3;
}
/* Bash */
.language-bash .token.keyword {
color: #0086b3;
}
/* highlight */
pre[data-line] {
position: relative;
padding: 1em 0 1em 3em;
}
pre[data-line] .line-highlight-wrapper {
position: absolute;
top: 0;
left: 0;
background-color: transparent;
display: block;
width: 100%;
}
pre[data-line] .line-highlight {
position: absolute;
left: 0;
right: 0;
padding: inherit 0;
margin-top: 1em;
background: hsla(24, 20%, 50%,.08);
background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
pointer-events: none;
line-height: inherit;
white-space: pre;
}
pre[data-line] .line-highlight:before,
pre[data-line] .line-highlight[data-end]:after {
content: attr(data-start);
position: absolute;
top: .4em;
left: .6em;
min-width: 1em;
padding: 0 .5em;
background-color: hsla(24, 20%, 50%,.4);
color: hsl(24, 20%, 95%);
font: bold 65%/1.5 sans-serif;
text-align: center;
vertical-align: .3em;
border-radius: 999px;
text-shadow: none;
box-shadow: 0 1px white;
}
pre[data-line] .line-highlight[data-end]:after {
content: attr(data-end);
top: auto;
bottom: .4em;
}html body{font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6;color:#333;background-color:#fff;overflow:initial;box-sizing:border-box;word-wrap:break-word}html body>:first-child{margin-top:0}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{line-height:1.2;margin-top:1em;margin-bottom:16px;color:#000}html body h1{font-size:2.25em;font-weight:300;padding-bottom:.3em}html body h2{font-size:1.75em;font-weight:400;padding-bottom:.3em}html body h3{font-size:1.5em;font-weight:500}html body h4{font-size:1.25em;font-weight:600}html body h5{font-size:1.1em;font-weight:600}html body h6{font-size:1em;font-weight:600}html body h1,html body h2,html body h3,html body h4,html body h5{font-weight:600}html body h5{font-size:1em}html body h6{color:#5c5c5c}html body strong{color:#000}html body del{color:#5c5c5c}html body a:not([href]){color:inherit;text-decoration:none}html body a{color:#08c;text-decoration:none}html body a:hover{color:#00a3f5;text-decoration:none}html body img{max-width:100%}html body>p{margin-top:0;margin-bottom:16px;word-wrap:break-word}html body>ul,html body>ol{margin-bottom:16px}html body ul,html body ol{padding-left:2em}html body ul.no-list,html body ol.no-list{padding:0;list-style-type:none}html body ul ul,html body ul ol,html body ol ol,html body ol ul{margin-top:0;margin-bottom:0}html body li{margin-bottom:0}html body li.task-list-item{list-style:none}html body li>p{margin-top:0;margin-bottom:0}html body .task-list-item-checkbox{margin:0 .2em .25em -1.8em;vertical-align:middle}html body .task-list-item-checkbox:hover{cursor:pointer}html body blockquote{margin:16px 0;font-size:inherit;padding:0 15px;color:#5c5c5c;background-color:#f0f0f0;border-left:4px solid #d6d6d6}html body blockquote>:first-child{margin-top:0}html body blockquote>:last-child{margin-bottom:0}html body hr{height:4px;margin:32px 0;background-color:#d6d6d6;border:0 none}html body table{margin:10px 0 15px 0;border-collapse:collapse;border-spacing:0;display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}html body table th{font-weight:bold;color:#000}html body table td,html body table th{border:1px solid #d6d6d6;padding:6px 13px}html body dl{padding:0}html body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:bold}html body dl dd{padding:0 16px;margin-bottom:16px}html body code{font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:.85em !important;color:#000;background-color:#f0f0f0;border-radius:3px;padding:.2em 0}html body code::before,html body code::after{letter-spacing:-0.2em;content:"\00a0"}html body pre>code{padding:0;margin:0;font-size:.85em !important;word-break:normal;white-space:pre;background:transparent;border:0}html body .highlight{margin-bottom:16px}html body .highlight pre,html body pre{padding:1em;overflow:auto;font-size:.85em !important;line-height:1.45;border:#d6d6d6;border-radius:3px}html body .highlight pre{margin-bottom:0;word-break:normal}html body pre code,html body pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}html body pre code:before,html body pre tt:before,html body pre code:after,html body pre tt:after{content:normal}html body p,html body blockquote,html body ul,html body ol,html body dl,html body pre{margin-top:0;margin-bottom:16px}html body kbd{color:#000;border:1px solid #d6d6d6;border-bottom:2px solid #c7c7c7;padding:2px 4px;background-color:#f0f0f0;border-radius:3px}@media print{html body{background-color:#fff}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{color:#000;page-break-after:avoid}html body blockquote{color:#5c5c5c}html body pre{page-break-inside:avoid}html body table{display:table}html body img{display:block;max-width:100%;max-height:100%}html body pre,html body code{word-wrap:break-word;white-space:pre}}.markdown-preview{width:100%;height:100%;box-sizing:border-box}.markdown-preview .pagebreak,.markdown-preview .newpage{page-break-before:always}.markdown-preview pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}.markdown-preview pre.line-numbers>code{position:relative}.markdown-preview pre.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:1em;font-size:100%;left:0;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.markdown-preview pre.line-numbers .line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.markdown-preview pre.line-numbers .line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}.markdown-preview .mathjax-exps .MathJax_Display{text-align:center !important}.markdown-preview:not([for="preview"]) .code-chunk .btn-group{display:none}.markdown-preview:not([for="preview"]) .code-chunk .status{display:none}.markdown-preview:not([for="preview"]) .code-chunk .output-div{margin-bottom:16px}.scrollbar-style::-webkit-scrollbar{width:8px}.scrollbar-style::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}.scrollbar-style::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,0.66);border:4px solid rgba(150,150,150,0.66);background-clip:content-box}html body[for="html-export"]:not([data-presentation-mode]){position:relative;width:100%;height:100%;top:0;left:0;margin:0;padding:0;overflow:auto}html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{position:relative;top:0}@media screen and (min-width:914px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{padding:2em calc(50% - 457px + 2em)}}@media screen and (max-width:914px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{font-size:14px !important;padding:1em}}@media print{html body[for="html-export"]:not([data-presentation-mode]) #sidebar-toc-btn{display:none}}html body[for="html-export"]:not([data-presentation-mode]) #sidebar-toc-btn{position:fixed;bottom:8px;left:8px;font-size:28px;cursor:pointer;color:inherit;z-index:99;width:32px;text-align:center;opacity:.4}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] #sidebar-toc-btn{opacity:1}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc{position:fixed;top:0;left:0;width:300px;height:100%;padding:32px 0 48px 0;font-size:14px;box-shadow:0 0 4px rgba(150,150,150,0.33);box-sizing:border-box;overflow:auto;background-color:inherit}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar{width:8px}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,0.66);border:4px solid rgba(150,150,150,0.66);background-clip:content-box}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc a{text-decoration:none}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc ul{padding:0 1.6em;margin-top:.8em}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc li{margin-bottom:.8em}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc ul{list-style-type:none}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{left:300px;width:calc(100% - 300px);padding:2em calc(50% - 457px - 150px);margin:0;box-sizing:border-box}@media screen and (max-width:1274px){html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{width:100%}}html body[for="html-export"]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .markdown-preview{left:50%;transform:translateX(-50%)}html body[for="html-export"]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .md-sidebar-toc{display:none}
/* Please visit the URL below for more information: */
/* https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css */
freqpcr
R package author: Masaaki Sudo (https://orcid.org/0000-0001-9834-9857)
複数個体から一括で抽出された DNA サンプル(バルク DNA サンプル)に対する定量 PCR 分析の ΔΔCq 値に基づき、個体群のアリル(対立遺伝子)頻度を区間推定する。
- (Github) Releases and PDF help
- Paper: Sudo and Osakabe (2021) Molecular Ecology Resources. doi:10.1111/1755-0998.13554 (Open Access)
- (Preprint)
- README in English
しばらく freqpcr の原理説明なので、とりあえず動かしてみたい人は インストール へ進んでください。
特徴
ΔΔCq 法に準拠した定量 PCR 分析に基づき、個体群アリル頻度(population allele frequency)を区間推定する R パッケージ。
- 動物や植物の特定の遺伝子座について、問題とする特定のアリル(対立遺伝子)がそれ以外のアリルに対して、個体群レベルでどの程度の割合で存在しているかを知りたい。
- 対象の個体群について、複数の個体を一括して抽出された DNA サンプル(バルク DNA サンプル)が複数得られている。
- 各バルクサンプルについてリアルタイム PCR に基づく定量 PCR 分析が行われ、Cq 値の組が利用可能である。
- バルクサンプルごとに、Cq 値の組を用いて計算された ΔΔCq 値が、そのバルクサンプルにおけるアリル頻度の指標となるような PCR 分析手法(ΔΔCq 法)が用いられている。
上記の要件で、各バルクサンプルに何個体分の DNA が含まれているか(N)と、各バルクサンプルについて測定された Cq 値の組(ΔΔCq 法なので 4 つずつある※)を入力データに取り、個体群レベルのアリル頻度の最尤推定値、およびその漸近信頼区間を推定するツール(freqpcr() 関数)を提供する。
推定に先立ってリアルタイム PCR 時の増幅効率などの、補助的パラメータが必要である。検出対象アリルを持つ個体と、それ以外のアリルを持つ個体に由来する DNA 抽出物を、既知頻度で混合したサンプル溶液を使って、補助的な実験パラメータを事前に推定しておく関数(knownqpcr() および knownqpcr_unpaired() 関数)も含まれている。
※バージョン 0.4.0 以降では 2 つの Cq 測定値の組(ΔCq 法)でも動作するようになった。
動作原理
複数個体の混合 DNA 溶液に含まれるアリル存在比のモデル化
前提として、ターゲットとする遺伝子座について未知頻度 p : (1 - p) で 2 種類のアリルを含む個体群から、複数の個体をランダムサンプリングしたとする。なお「2 種類のアリル」は「検出対象とそれ以外の全種類」でもいい。PCR 分析に用いるプライマーは、検出対象のアリルを特異的に増幅するか、あるいは後述する制限酵素処理により、検出対象のアリル以外が分解されるように設計しておく。
たとえばフェロモンを誘引源としたトラップで、n 個体の害虫(ただし単数体を仮定している)を採集し、うち m 個体が薬剤抵抗性遺伝子(R アリル)を、残り n - m 個体が感受性遺伝子(S アリル)を持つ状況を考える(Figure 1)。このサンプリング過程は二項分布 m ~ Bin(n, p) で表される。
Figure 1. バルクサンプルの生成過程。未知頻度 p : (1 - p) で 2 種類のアリル、たとえば R(薬剤抵抗性)と S(感受性)を含む個体群を対象に、トラップを仕掛けて個体を採集する。あるトラップで n 個体が得られたとき、これに含まれる R 個体の数は m ~ Bin(n, p) という確率変数で表現される。個体単位ではなくトラップ単位で DNA を一括抽出して定量 PCR 分析を行うと、個体の分離比 m : (n - m) ではなく、バルクサンプルにおけるアリル DNA の含有量である X_R, X_S がデータとして観測される。そこで freqpcr では p と X_R, X_S の関係を、m を潜在変数として介しつつモデル化する。
仮に個体別に遺伝子診断すれば m の値が直接求まるため、頻度 p の推定値や信頼区間を二項分布から計算できる。これが労力的に可能ならば、定量 PCR 分析を行って freqpcr を使う必要は特段ない。
しかし p が極めて小さいことが想定される場合、たとえば殺虫剤抵抗性の発達初期段階における R アリルの検出や、穀物の輸入検疫における遺伝子組換え種子の混入率調査などでは、十分に大きな採集数 n を確保しないと、サンプルに全く検出対象のアリルが含まれない(有効な推定値が得られない)可能性が高くなる。必要なサンプルサイズが数百に及ぶ場合、個体別に DNA を抽出して PCR で遺伝子診断を行う手間が増大する。
多数のサンプルから簡易に低頻度のアリルを検出するために、グループテスト(group testing)と呼ばれる統計手法が従来から用いられてきた。まず複数個体から一括で DNA を抽出して、バルクサンプル(bulk sample)と呼ばれるサンプル溶液を作る。通常のグループテストでは、検出対象のアリルを増幅する PCR 反応を行い、各バルクサンプルに少なくとも 1 個体は検出対象が含まれている(陽性)か、全く含まれず PCR 増幅されない(陰性)かを判定した結果を用いる。複数のバルクサンプルについて陽性/陰性である割合を求め、アリル頻度 p の信頼区間の上限を計算する統計手法が、幾つかの先行研究において提唱されている(たとえば Yamamura and Hino 2007)。
一方 freqpcr では、各バルクサンプルについて定量 PCR 分析を行い、アリルごとに含まれる DNA 量(Figure 1:変数 X_R, X_S)を定量する。アリル DNA 含有比の指標として、従来より定量 PCR 分析で用いられてきた ΔΔCq 値の概念を用い、それらのバルクサンプルが由来する個体群のアリル頻度の推定値、および信頼区間の上限と下限を最尤推定する。個体群アリル頻度が p であるときに Cq 値の観測結果を得る確率が、生成モデルとして書き下され、このときバルクサンプルごとに含まれるであろう陽性個体の数(m)は、直接観測できない潜在変数として扱われる。
個体あたり DNA 収量のばらつき:ガンマ分布およびベータ分布による近似
体サイズの変異や(トラップ上での)死後の DNA 分解といった要因により、バルクサンプルに含まれる個体あたりの DNA 収量は大きくばらつくことがある。freqpcr では、バルクサンプルに含まれる陽性個体数の不確実性(二項分布に従う)に加え、バルクサンプルに含まれるアリルごとの DNA 収量(Figure 1 および 2:変数 X_R, X_S)の不確実性を、ガンマ分布という確率分布で近似する手法を採用した。このアイデアについては Sudo et al. (2021) Journal of Pesticide Science に詳しい。
ガンマ分布は形状パラメータの設定次第で、生物遺体等において DNA がランダムに分解しており、個体あたり収量が大きくばらつく場合(指数分布)から、生体において DNA 収量が平均値の周りにほぼ正規分布する場合までを、統一的にモデルで表現できる。本パッケージに含まれる freqpcr() 関数を用いれば、ガンマ分布の形状パラメータ(k)もアリル頻度 p と同時に推定される。ユーザーは個体ごとの DNA 量のばらつき度合いを知らなくても、アリル頻度の頑健な推定値を得られる。
ガンマ分布が持つ好ましい性質の 1 つが「再生性」である。あるアリルに着目して、各個体が持つ DNA 量が独立にガンマ分布(等しい尺度パラメータを持つ)に従うならば、複数個体まとめたバルクサンプルに含まれる当該アリルの DNA 量もまた、単一のガンマ分布に従う(Figure 2 左)。
Figure 2.(左)バルクサンプルに含まれる R ないし S アリルの量は、1 個体 1 遺伝子座あたりの DNA 収量を、各アリルを持つ個体数分だけ足し合わせた量になる。図は単数体生物 6 個体から DNA 抽出したバルクサンプルにおいて、2 個体が R と仮定した場合である。個体あたりの DNA 収量がガンマ分布 Ga(k = 1, θ = 10^(-6)) に従う確率変数ならば、2 個体分に相当する R アリルの量は Ga(k = 2, θ = 10^(-6)) で表される。一方、4 個体分に相当する S アリルの量は Ga(k = 4, θ = 10^(-6)) に従う。(右)このときバルクサンプルに占める R アリルの割合、すなわち Y_R = X_R / (X_R + X_S) に相当する量は、ベータ分布 Beta(shape1 = 2, shape2 = 4) に従う。
さらにガンマ分布の性質から、バルクサンプル中に含まれる 2 種類のアリル量の比は、ベータ分布という確率分布に従う(Figure 2 右)。freqpcr() 関数の標準設定では 2 つのガンマ分布の代わりに、1 つのベータ分布を利用してアリルの含有比を表現する。これは推定の高速化(数秒以内に計算が完了する)に寄与する。
なお Figure 2 に示した DNA 収量(X_R, X_S)やアリル含有比(Y_R)は、各遺伝子型に該当する個体数 m が固定されたときの値であることに注意を要する。実際には m も確率変数なので m = (1, 2, …, n-1) のそれぞれについて、Beta(m, n - m) の下で実際の Cq 値が観測される確率を求め、尤度関数を定義するのが freqpcr の仕様である。以下、Cq 値の組がどのような実験デザインで得られるかを述べてゆく。
定量 PCR 分析を用いたアリル頻度推定の原理:ΔΔCq 法と RED-ΔΔCq 法
1 つ 1 つのバルクサンプルに含まれる 2 種類のアリルの含有比、すなわちサンプルアリル頻度(sample allele frequency)を測定する実験手法として、現在の freqpcr パッケージでは
- RED-ΔΔCq 法:制限酵素によるサンプル前処理を伴う定量 PCR(Osakabe et al. 2017)
- アリル特異的なプライマーセットを用いた定量 PCR による ΔΔCq 法(Maeoka et al. 2020)
の 2 種類の定量 PCR 分析手法(Figures 3, 4)が公式にサポートされている。その他の ΔΔCq や ΔCq に準拠した分析プロトコルでも適用可能なものは多いと思われるので、共同研究のオファーがあれば歓迎する。
RED-ΔΔCq 法
RED-ΔΔCq 法(ΔΔCq Method with Restriction Enzyme Digestion)では、ターゲット遺伝子座について未知頻度でアリルが混合されている DNA 溶液から、4 本のサンプルを分注する。異なる処理条件・プライマーセットでリアルタイム PCR を行い、ΔΔCq を計算して当該溶液のアリル混合比を求める(Figure 3)。Cq 値や ΔΔCq 値の定義自体は、一般的なリアルタイム PCR のそれら(e.g. Livak & Schmittgen 2001; Vandesompele et al. 2002)と同様である。
RED-ΔΔCq 法の PCR ではターゲット遺伝子座を、アリルとは無関係に増幅するプライマーセットが用いられる。よって DNA 抽出して得たバルクサンプル溶液をそのまま PCR に掛けるならば、(X_R + X_S) の和に相当する量の鋳型 DNA が含まれる。これが control sample である。
一方、分注した溶液の半分については PCR の前に制限酵素で処理し、ターゲット遺伝子座において片方のアリルだけを消去しておく。こちらが digested test sample である。S アリルのごく一部(z)だけが残るように制限酵素で切断すると、ターゲット遺伝子の鋳型量は (X_R + zX_S) 相当となる。従って digested test sample と control sample の鋳型量の商である (X_R + zX_S) / (X_R + X_S) が、z が小さければ R アリルのおよその存在頻度となる。
注:制限酵素で切断するアリルは R でも S でもよい。ただし推定精度を上げるためには、個体群において稀であると考えられるアリルを残す(多い方を分解する)とよい。たとえば地域に稀に存在する抵抗性を検出したければ、感受性遺伝子を制限酵素処理する。そのほうが実験処理間で Cq 値に大きな差が現れるようになり、定量 PCR の測定誤差にマスクされにくくなる。
たとえば Osakabe et al. (2017) は、ナミハダニの殺ダニ剤(エトキサゾール)抵抗性遺伝子を定量するために、サンプル溶液を 3 時間、Taq1 酵素で事前処理した。Taq1 は DNA 上の TCGA という塩基配列がある箇所を認識して切断する。エトキサゾール抵抗性はキチン合成酵素遺伝子(CHS1)の塩基配列 TCG A TT が TCG T TT に変異して生じるので、酵素処理するとターゲット遺伝子座について、感受性個体由来の DNA が切断されたサンプルを得る。
Figure 3. 定量 PCR 分析に基づくバルクサンプル中のアリル含有比の測定 (1) RED-ΔΔCq 法。異なる事前処理(制限酵素処理)を受けたサンプル間で鋳型 DNA 量を比較するための補正基準として、生物体内に一定量が存在する遺伝子(ハウスキーピング遺伝子)を対象とした PCR 増幅を並行して実施している。
ターゲットの遺伝子座についてもハウスキーピング遺伝子座についても、プライマーセットはアリルを問わずに増幅するものを用いる。ただし制限酵素処理を受けたサンプルでは、ターゲット遺伝子座に S アリルを持つ DNA 分子のみ、サイトが途中で切断されているため増幅対象から外れる。この鋳型 DNA 量の違いが R アリルの頻度、厳密には (X_R + zX_S) / (X_R + X_S) = Y_R + z(1−Y_R) として測定される。
この (X_R + zX_S) / (X_R + X_S) という値は図中で (X^TD / X^HD) として計算される Cq 値の差分に含まれるが、余計な係数 δ_T が入っている。これは (X^TD / X^HD) / (X^TW / X^HW) という指標を計算することでキャンセルされる。これを対数スケール(PCR のサイクル数)で表現すると Cq 値の「差分の差分」となり、すなわち ΔΔCq 値に他ならない。
ただし、digested test sample と control sample をそれぞれターゲット遺伝子について増幅した結果を、単純に割り算するだけ(Figure 3 の鋳型量でいうと (X^TD / X^TW) に相当する量)では上手く行かない。制限酵素処理に伴って、溶液の量や性質が不随意に変化しうるためだ(Figure 3 で係数 δ_B として表されている量である)。
そこで内部標準、典型的にはハウスキーピング遺伝子(Osakabe et al. 2017 では GAPDH)について増幅した結果(X^HD と X^HW に相当)を用いて、先に各サンプルの鋳型量を補正しておく。鋳型 DNA 量の比は Cq 値(サイクル数。対数スケールである)の差として表現されるので、digested test sample と control sample の各々について、(ターゲット遺伝子の Cq 値)−(ハウスキーピング遺伝子の Cq 値) を計算する。こうした Cq 値の差分(digested test sample では X^TD / X^HD、control sample では X^TW / X^HW に相当する量)のことを ΔCq という。
同じ処理を受けたサンプルでも、生体内での DNA コピー数は遺伝子座によって異なるかもしれない。それぞれ求めた ΔCq 値には、この差が係数 δ_T として残っている。余分な係数を含まない (X_R + zX_S) / (X_R + X_S) に相当する量を得るには、制限酵素あり・なしの条件間で ΔCq 値同士の差分を取ればよい。こうして得られる ΔΔCq 値すなわち (X^TD / X^HD) / (X^TW / X^HW) では、δ_B も δ_T もキャンセルされる。よって RED-ΔΔCq 法は検量線を必要とせず、検査対象である未知溶液のアリル含有比を測定できる。
なお (X_R + zX_S) / (X_R + X_S) は、z が未知な場合はバルクサンプル中のアリル頻度 Y_R = X_R / (X_R + X_S) そのものではなく、近似値である。そこで Osakabe et al. (2017) では、制限酵素処理を長時間行って z を極力小さくすることを推奨した。一方 freqpcr() を用いてアリル頻度を推定する場合、z のサイズが多少大きくても既知でさえあれば推定が可能である。むしろ z が小さすぎる(10^{-5} 以下)と、サンプルに R アリルが含まれていない際に「制限酵素処理あり、ターゲット遺伝子」の qPCR に要するサイクルが長すぎて、反応が立ち上がってこない恐れがある。
アリル特異的プライマーセットを用いた ΔΔCq 法
Osakabe et al. (2017) の RED-ΔΔCq 法を適用するには、ターゲット遺伝子座について片方のアリルに作用する制限酵素を見つけることが要件である。この制約を取り除くため Maeoka et al. (2020) において、アリル特異的なプライマーセットを用いた ΔΔCq 法による、アリル頻度の測定手法が提案された(Figure 4)。
Figure 4. 定量 PCR 分析に基づくバルクサンプル中のアリル含有比の測定:(2) アリル特異的プライマーセットを用いた ΔΔCq 法(Maeoka et al. 2020)。
こちらも (X^TD / X^HD) / (X^TW / X^HW) = Y_R + z(1 − Y_R) で抵抗性アリル頻度を近似する。ただし RED-ΔΔCq 法と異なり、テストサンプルと control sample では由来がそもそも異なるため δ_B は定義せず、代わりに control sample の鋳型 DNA 量を X’_R として記号自体を変えている。
アリル含有比が不明な test sample(制限酵素処理は不要である)の DNA 溶液から、2 本ほど分注してターゲット遺伝子とハウスキーピング遺伝子でリアルタイム PCR 増幅し、Cq 値を測定する。ただし今度は、ターゲット遺伝子を増幅するためのプライマーを、R アリルだけ特異的に増幅するように設計しておく。従ってハウスキーピング遺伝子では X^HD = (X_R + X_S) に相当する量が増幅対象だが、ターゲット遺伝子では X^TD = δ_T(X_R + zX_S) が増幅される。本法における z は、僅かに生じる非特異的な増幅の対象となる S アリルの割合である。
(X^TD / X^HD) には遺伝子座の間での鋳型 DNA 量の比、すなわち δ_T が未だ係数として掛かったままである。これを RED-ΔΔCq 法と同様、control sample を用いてキャンセルする。
アリル特異的プライマーセットを用いた ΔΔCq 法では、RED-ΔΔCq 法で用いられたコントロール、すなわち制限酵素処理を伴わないサンプル溶液自体の代わりに、確実に R と分かっている個体からの DNA 抽出液を control sample に用いる。典型的には、室内飼育で選抜した純系の R 個体を使う。
Control sample において、ハウスキーピング遺伝子では X^HW = X’_R 、ターゲット遺伝子では X^TW = δ_T X’_R が増幅される(反応液の由来が異なるので X ではなく X’ としている)。つまり ΔCq 値を計算すれば、そのまま δ_T に相当する量が求められる。最終的に ΔΔCq の形に持ち込むことで、 (X^TD / X^HD) / (X^TW / X^HW) = (X_R + zX_S) / (X_R + X_S) に相当する量を得る。
ΔCq 法によるアリル頻度の推定
なお δ_T のサイズが既知であれば、test sample だけをターゲット遺伝子とハウスキーピング遺伝子で増幅して X^TD と X^HD を得てから、δ_T に相当する量を差し引くことでもアリル頻度を推定できる。つまり ΔCq 法である。バージョン 0.4.0 において、X^TW と X^HW を欠いたデータセットも受け入れられる仕様に freqpcr() 関数が拡張された。
この場合 δ_T(引数 targetScale)および、測定された Cq 値が従う正規誤差の標準偏差 σ_c(sdMeasure)は、事前に既知頻度のサンプル溶液で推定しておく。下のセクションにある knownqpcr() もしくは knownqpcr_unpaired() 関数が使える。バルクサンプルの個数が極めて多ければ、未知数として freqpcr() 関数内部で推定することは不可能ではないが、よほどの理由がない限り固定値として代入すべきである。ただでさえ X^TW、 X^HW が無いことは推定時のデータ点が半分になることを意味しており、未知パラメータが多いと推定結果に大きなバイアスが生じる。
Figure 5. 定量 PCR 分析に基づくバルクサンプル中のアリル含有比の測定:(3) ΔCq 法。
複数バルクサンプルを用いたアリル頻度の区間推定
Osakabe et al. (2017) と Maeoka et al. (2020) の各論文では、各バルクサンプルに様々な条件でリアルタイム PCR を行い、計算した ΔΔCq 値を、そのバルクサンプルに占める当該アリルの含有比(点推定値)としている。一方 freqpcr パッケージは Cq 値に基づく個体群アリル頻度の区間推定を目指しているが、そのためには 1 個体群から取られたバルクサンプルが複数(N)必要である。
一箇所にトラップを複数設置して、トラップごとに DNA 抽出したものを 1 つのバルクサンプルとしてもよいし、あるいは多数の捕獲個体を n 個体ずつまとめて DNA 抽出してもよい。freqpcr ではバルクサンプルごとに個体数 n_h (h = 1, 2, …, N) が異なってもよいが、各バルクサンプルに何個体含まれるかの記録は必須である。
捕獲した総個体数が等しければ、サンプルを多く分割する(バルクサンプルあたりの個体数を少なくする)ほど信頼区間の幅は狭くなり、高い推定精度を得られる。しかし定量 PCR の検査数が増えるのでコストは増大する。バルクサンプルの分割数に応じた推定精度のシミュレーション結果は、原著論文の Figure 4 および ESM1 に示されている。
2 倍体の取扱いについて
freqpcr のモデル構造は、基本的には単数体生物を仮定している。すなわち各個体を構成する各細胞が 1 本の染色体を持ち、1 つのアリル DNA を含む。アリル頻度推定を行う freqpcr() 関数は diploid というオプション変数を持ち、初期設定は diploid = FALSE すなわち単数体であるとして、各個体の DNA 量をモデリングする。
通常の昆虫や脊椎動物は 2倍体、すなわち各細胞が 2 本の染色体を持つ。この場合、diploid = TRUE を設定して freqpcr() 関数を実行すれば、簡易的に 2 倍体生物を取り扱うことができる。
freqpcr() 関数では N という変数ベクトルを用いて、バルクサンプルを構成する個体の数を代入する。diploid = TRUE でも diploid = FALSE でも、N は染色体数ではなく個体数として代入する仕様である。たとえば N = c(8, 8, 8, 6) と代入すると、単数体であっても 2 倍体であっても合計 30 個体が採集され、これを 8 個体ずつ DNA 抽出したバルクサンプル溶液 3 本と、残る 6 個体を DNA 抽出した溶液 1 本という構成で分析されたことを意味する。
2 倍体生物における個体あたり DNA 収量のモデル表現を、現行の freqpcr() では簡略化していることに注意が必要である。詳細は元論文の Appendix S1 に記述されているが、端的にいうと同一個体が持つ 2 セットのアリルの定量が厳密ではない。
本来、2 倍体の 1 個体から得られるアリル DNA 量は、単数体当量のちょうど 2 倍である。とりわけヘテロ個体が持つ R アリルと S アリルの DNA 量は同一であるべきだが、この制約条件を置くとプログラムの計算量が著しく増大する。そこで「2 倍体生物を n 個体採集する」代わりに、「単数体生物を 2n 個体採集したことにする」トリックを用いた。これにより、同一個体から得られた 2 セット分のアリルの DNA 量が、それぞれのセットについて独立同時なガンマ分布に従うようになり、単数体と同じモデルを適用できる。本簡易推定法を用いることで、アリル頻度 p の最尤推定値(点推定値)には影響しないと考えられるが、信頼区間が本来の範囲よりも僅かに広く推定される。
連続な DNA 量を仮定した freqpcr モデルについて
(執筆中)
依存パッケージ
- R (>= 3.6)
- cubature (https://cran.r-project.org/package=cubature)
開発環境は Windows 10 上の R 3.6 だが、R 4.1.2 でも動作したとのこと。
インストール
install.packages("freqpcr", dependencies=TRUE)
library(freqpcr)
packageVersion("freqpcr")
もしくは
library(remotes)
install_github("sudoms/freqpcr")
library(freqpcr)
packageVersion("freqpcr")
以下のようなエラーメッセージが出て、インストールに失敗することがある。
** byte-compile and prepare package for lazy loading
Error: (converted from warning) package 'cubature' was built under R version 3.6.3
依存パッケージ ‘cubature’ が、ユーザーの環境よりも新しいバージョンの R でコンパイルされている場合に、このエラーが出る。
R のバージョンを素直に最新版にする、もしくは環境変数 R_REMOTES_NO_ERRORS_FROM_WARNINGS="true" を設定後、install_github() を再度走らせることで解消する。
Sys.setenv(R_REMOTES_NO_ERRORS_FROM_WARNINGS="true")
install_github("sudoms/freqpcr")
使用法
library(freqpcr)
変数・パラメータの一覧
P:
- 推定対象であるアリルの個体群に占める頻度
K:
- 対象個体群において、1 個体(単数体当量)あたりのアリル DNA 収量を近似するために用いられるガンマ分布の形状パラメータ
以下はリアルタイム PCR の実験系に依存するパラメータである。次に説明する knownqpcr() および knownqpcr_unpaired() 関数のいずれかを用いて、予め推定しておく。なお 太字 は freqpcr() の動作時にユーザーによる値の指定が必須のパラメータ、 太字かつ斜体 は必須ではないが、可能な限り指定すべきパラメータである。特にバルクサンプルの数が少ない時に、sdMeasure を指定しないと推定結果が大きくずれる。
EPCR:
- PCR サイクルごとの増幅効率を表す正の実数。
- EPCR = 1 であるとき、鋳型 DNA が PCR 1 サイクルあたり 2 倍ずつ増える(リアルタイム PCR の慣習に従い、EPCR + 1 = 2 なので 2 倍と定義している)。
zeroAmount:
-
(RED-ΔΔCq 法)ターゲットとする遺伝子座において、検出対象でない方のアリルを分解する制限酵素反応で、反応後もなお分解されなかったアリル DNA の残存率。
-
(一般的な ΔΔCq 法において)アリル特異的な PCR プライマーセットを用いた PCR 反応で、極僅かに増幅されてしまう検出対象でない方のアリルの割合(検出対象アリルの鋳型量を 1 とした、鋳型値の相対値)。
-
freqpcr() 関数の実行時には 0 以上 1 以下の実数として、ユーザーが指定する必要がある。
sdMeasure:
- 定量 PCR 分析における各 Cq (Ct) 値が従うランダム誤差(標準偏差の大きさ)。元論文で σ_c として表されている変数。リアルタイム PCR の実験誤差は Cq 値のスケールで概ね正規分布するようである(本研究の原著論文の実験 1 を参照せよ)。
targetScale:
- 同一サンプルから分注した等量の DNA 溶液において、ターゲットとする遺伝子座の DNA が(アリルに関係なく)、ハウスキーピング遺伝子の何倍存在するか。元論文で δ_T として表されている変数。
scaleDNA:
- 1 個体に含まれる(単数体当量の)ハウスキーピング遺伝子の平均的な DNA 量が、PCR 反応のスレッシュホールドに比べて何倍存在するか。PCR 1 サイクルでちょうど 2 倍に増える(
EPCR = 1)ならば、scaleDNA = 0.5 のとき 1 サイクルの PCR でスレッシュホールドに達する。2^{10} = 1024 から類推できるように、scaleDNA = 10^{-6} であれば約 20 の Cq 値に相当する。
- なお
EPCR が決まれば自ずと固定するため、freqpcr() 関数の引数には含まれない。
baseChange:
-
RED-ΔΔCq 法において制限酵素処理を行う前後で、増幅可能なハウスキーピング遺伝子の鋳型量が何倍に変化するか(実験操作に伴う不随意な変化として)。元論文で δ_B として表されている変数。
-
Maeoka et al. (2020) の方法や、その他のよくある ΔΔCq 法では、この変数は存在しない(※)。いずれの場合でも freqpcr() 関数の実行には不要であり、引数に含まれない(なぜ不要かというと、freqpcr() 関数は 4 つの Cq 値を 2 つの ΔCq に換算してから尤度関数に投入するためである。詳しくは論文の数式 11 を見てほしい)。
※これは、RED-ΔΔCq 法以外のあらゆる ΔΔCq 分析において baseChange が存在しないという意味ではない。制限酵素処理でなくても、実験水準間でハウスキーピング遺伝子の鋳型 DNA 量に、何らかの系統誤差を与えるような実験操作はあり得るので、そのような実験系の中には RED-ΔΔCq 法と同様の発想で knownqpcr() および knownqpcr_unpaired() 関数を使うべきものもあるだろう。
knownqpcr() ないし knownqpcr_unpaired() 関数による実験パラメータの推定
原著論文の実験 1 に相当する。
用いるサーマルサイクラーや実験プロトコルごとにパラメータの値は変わるため、同じ生物の同じ遺伝子を検査する場合も各ラボで予め調べておく必要がある。まず「厳密にアリルの混合比が分かっている DNA 溶液」を複数の混合比で用意する。定量 PCR の一般的なプロトコルに従い、検出したいアリル(R)をもう 1 つのアリル(S)で、想定レンジの上限から下限に向けて段階希釈した系列を作ると良い。なお R 頻度 Y_R = 0 および Y_R = 1 の組み合わせを含めておくと、推定結果が安定しやすい。
注:ここで使う混合 DNA 溶液は本番のサンプルと同様、ターゲット遺伝子だけでなくハウスキーピング遺伝子を含んでいる必要がある。確実な方法としてはたとえば R 系統と S 系統の各