寫在前面
很久以前,參考NG86計算邏輯提出的文章,我在TBtools中寫了Simple Ka/Ks Calculator,旨在理解算法,具體可見 《批量計算dn/ds,粗略篩選正選擇?所有人-技能Get !》。近期,不時有人在 TBtools 群提出,TBtools 的 Simple Ka/Ks Calculator 計算出來的有一堆 NaN。Emmm,這是一個比較有趣的事情。有趣之處有二:
- TBtools中幾乎每一個功能,我都會在從頭實現(xiàn)算法之后,拿一些軟件的運行結(jié)果進行比較。針對 Ka/Ks 的計算,我拿了 DNAsp 和 KaKs_Calculator2 的結(jié)果與TBtools的結(jié)果進行比較,無出入。
- 曾經(jīng)有人提出 TBtools 的計算存在問題,經(jīng)過一堆比較,TBtools的結(jié)果反而是對的。具體可見推文《Ks值用TBtools計算不出來?講一個故事》。
但是今天的情況有所不同。一般十來個基因?qū)Γ敲从袃扇齻€NaN可以理解。如果全部都是 NaN,那就要引起重視。如

不是用戶使用問題
我要來數(shù)據(jù),隨后自己使用 TBtools 最新版本進行計算,結(jié)果與該用戶的結(jié)果一致。

說明不是用戶使用問題。
不是 TBtools 實現(xiàn)邏輯問題
既然如何,那么就有可能是 TBtools 的算法實現(xiàn)邏輯問題。為此,我直接讓 TBtools 輸出 AXT 格式的比對結(jié)果。隨后使用 章張老師 的 KaKs_Calculator 計算,結(jié)果如下。

換句話說,至少在 Ka/Ks 的計算上,TBtools 完全沒問題。
那么還存在一個可能,是不是 Codon Alignment 出現(xiàn)了問題?于是我拿了一個基因?qū)?,使?Mega 進行 Codon Alignment,隨后導(dǎo)出結(jié)果。再使用 KaKs_Calculator 進行結(jié)算,

結(jié)果與前述一致。

序列距離(差異)太大,導(dǎo)致計算出錯
回到 TBtools 計算源碼,在 Java 的數(shù)值計算中,除非是NaN參與運算,才會得到 NaN。那是咋回事?
重新過了一遍,發(fā)現(xiàn)問題應(yīng)該是在 JC69 模型應(yīng)用上。

當(dāng) pS 大于等于 3/4 的時候,計算結(jié)果就會得到負(fù)值。換成生物學(xué)角度,那就是...絕大部分可發(fā)生同義突變位點都發(fā)生了同義突變,亦即,序列分歧度太大,進化距離很遠。
為此.... 我繼續(xù)對 TBtools 做個改進,當(dāng)計算出來的 pS>=3/4,補充一個信息,說明原因...那就不會有用戶問我了。
寫在后面
Emmm,有時候我覺得,之所以總是有用戶提出問題,是因為大家能直接接觸到我。畢竟為什么同樣的問題,似乎沒有人會去問其他軟件開發(fā)的人呢?還是因為我不知道?
或者說,我太貼心了?哈哈哈哈哈哈哈啊哈哈哈啊哈