ryought / dbgphmm

Probabilistic genome assembler based on de Bruijn Graph and profile HMM
https://ryought.github.io/dbgphmm/dbgphmm/
0 stars 0 forks source link

10月ぐらいのタスク #136

Closed ryought closed 10 months ago

ryought commented 1 year ago

仮説を立てて、検証する、を細かく繰り返す。方が精神に良い。

整数コピー数の列挙

「本当に真のコピー数が一番高いスコアを出すか?」を検証したい 今のコピー数に近いコピー数を発生させる部分を作る →そのスコアの可視化

実数コピー数のEMの分析

「不要なk-merを当てられるか?」を検証したい

現状の課題

全長リードの時

タスク

別の枠組みを考える

overlap graphから出発して、コピー数を割り当てる方法?

ryought commented 1 year ago

float-emで起きている(理論的な)問題

細かい実装的な問題

端点問題にどう対処するか? (A)そもそもdbg_rawを作るやり方を変えて、端点を入れないようにする。このときにtrans+initの方が良いかtransだけの方が良いか これが効果があるかは、端点のないdbgから始めることでできる(環状のゲノムだったら不要かもしれない) (B)尤度的には端点に重みを振った方が尤度が高いのか?真のモデルが一番高いのか? (C)nnnnAとかGnnnnとかを入れるdbgは大丈夫だろうか?

でも実際尤度はちゃんとしている。必要なノードを消すとガクッと尤度が下がる

(D)どのノードをzeroにするかで探索する。コピー数をzeroかzero以上かの値に置き換える (E)一番重いパスと、それ以外のパスの尤度の比。(このkmerがないと困る人たちはどのぐらいいる?)(0xになるとどのくらい困るかはわからない?)

MCMCの方に切り替えるか? 確率モデリングの教科書を参照した HMMの構造学習(edgeを切るかどうかをデータから判断する) GFlowNet、面白そう →MCMCのスコアの可視化 ・(一番単純なパターン) x軸に真のコピー数からの距離(ベクトルとした時のL1 distanceとか)、y軸にスコアをつける ・(dbgvizを使う) dbgvizで、スコア分布とその時のコピー数を可視化する コピー数をサンプリングするメリット ・各kmerがあるコピー数である確率、みたいなのも計算できる ・ とりあえずのタスク ・コピー数のiteratorを作る

ryought commented 1 year ago

(1)整数係数の探索を高速化するか、(2)実数化の良い近似方法を探す

(1) MCMC法の課題 ・こんなに全パターンを調べる必要はないのでは…?(overlapの候補を見つけさえすれば良いのでは、と思ってしまう) ・サイクルのパターン数が多すぎる。もうちょっと絞る…。意味のない列挙はしないようにする。simpleじゃないcycleも大量に含まれていそう、グラフを作ってcoefパターンを作るときにそこまで考慮したい。 ・周長k以下のサイクルの列挙、みたいな感じにできないか? ・MCMCで近似できるのか?ステップ数を試す

(2) とことん実数化して勾配法にする。評価関数を適当に設定する。あとは確率的降下法で頑張る。みたいな主流に乗る。

ryought commented 1 year ago

スコアの良さを検証する方法:P(G|R)の挙動について

スコアとして良いよね、という話をしたい。最適化する方針も示したい。

fixed-k 真のグラフでtrueになるか?(kが小さい時、kが大きい時) kが大きいときは、成り立ちそう?(ただし候補の数もめちゃくちゃ多い) variable-k 一つのノードだけresolveする、ということもできる

・良いグラフでmaxになる(kが小さいときはそうでもない…?0xを決めるのには役立つ…?) ・細かい部分から決めていく vs 大きい部分から決めて行く。variable k-merで、全体のスコアを最大化する。 ・大きい決めやすい部分を先に決める、みたいな処理も欲しいなあ…

◆候補のコピー数についての検証 列挙アルゴリズムによってどんなバリエーションが得られているか? →ユニークな候補の個数 →各k-merのコピー数の分散 →ゲノムサイズの分布 →端っこを変更した個数の割合、例えば端点が明らかになっている場合はもっと簡単なのか? →kへの依存性 →真のゲノムとの編集距離 全パターンを調べる必要がない、という話

◆周辺のコピー数のスコアについての分析 真のものより良いものがどの程度あるか

◆周辺のコピー数とそのスコアを高速に列挙する方法 ・無駄なコピー数があるか?

◆複雑な確率モデル?実数化した時の方法 deep learning的に解決する? 端っこ問題、

◆理論的な問題 ・k-merのkが小さいとコピー数を推定しにくいはず、ということ→ならばkが小さいところからやる必要はないのでは?説 ・kが小さいとき、長いリードを切ってemissiontとして使っても変わらないはず、ということ

ryought commented 1 year ago

tandem(20, 5)

k=8
n_kmers_with_null=16
n_dead_nodes=96
n_nodes=130
n_neighbors=1446

k=16
n_kmers_with_null=58
n_dead_nodes=193
n_nodes=243
n_neighbors=1910

k=32
n_kmers_with_null=190
n_dead_nodes=369
n_nodes=451
n_neighbors=605

simple(100)

k=8
n_kmers_with_null=16
n_dead_nodes=111
n_nodes=218
n_neighbors=6584

k=16
n_kmers_with_null=51
n_dead_nodes=215
n_nodes=330
n_neighbors=4640

k=32
n_kmers_with_null=168
n_dead_nodes=383
n_nodes=514
n_neighbors=341

そのままcircularにしたバージョンがないのはなんで?

L:ABCDABCD
nnA→nAB→ABC→BCD→CDA→DAB→ABC→BCD→CDn→Dnn(→nnA)
C:ABCDABCD
ABC→BCD→CDA→DAB(→ABC)

1回の操作で変換できそう… "nnA(-)→nAB(-)→DAB(+)→CDA(+)→CDn(-)→Dnn(-)"みたいなサイクルを採用すれば良い。