Closed ryought closed 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を作る
(1)整数係数の探索を高速化するか、(2)実数化の良い近似方法を探す
(1) MCMC法の課題 ・こんなに全パターンを調べる必要はないのでは…?(overlapの候補を見つけさえすれば良いのでは、と思ってしまう) ・サイクルのパターン数が多すぎる。もうちょっと絞る…。意味のない列挙はしないようにする。simpleじゃないcycleも大量に含まれていそう、グラフを作ってcoefパターンを作るときにそこまで考慮したい。 ・周長k以下のサイクルの列挙、みたいな感じにできないか? ・MCMCで近似できるのか?ステップ数を試す
(2) とことん実数化して勾配法にする。評価関数を適当に設定する。あとは確率的降下法で頑張る。みたいな主流に乗る。
スコアの良さを検証する方法: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として使っても変わらないはず、ということ
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(-)"みたいなサイクルを採用すれば良い。
仮説を立てて、検証する、を細かく繰り返す。方が精神に良い。
整数コピー数の列挙
「本当に真のコピー数が一番高いスコアを出すか?」を検証したい 今のコピー数に近いコピー数を発生させる部分を作る →そのスコアの可視化
実数コピー数のEMの分析
「不要なk-merを当てられるか?」を検証したい
現状の課題
全長リードの時
断片リードの時
タスク
別の枠組みを考える
overlap graphから出発して、コピー数を割り当てる方法?