遇到bug不要慌,都是小場面。
1. 澄清
今天早上準備跑步,看到外面霧濛濛的,好像是下雨了。
也只是好像下雨了,不一定真下呢,畢竟眼見不一定為實,一定要親身實踐,小馬過河才可以。
所謂不淋雨不知道雨是真實的,不捱揍不知道鐵拳的味道
,等到下樓雨滴滴到臉上頭上的那一刻,我就慫了,上去,這天還去跑步就是一個鐵憨憨!
不跑步也不能去睡一個回籠覺
,就調bug吧。
2. 事情是這個樣子的
之前培訓GS課程時,有一個HBLUP使用asreml的結果,因為大家大部分都沒有asreml
這個軟體,所以僅僅是寫了程式碼,沒有執行。
然後在群裡面收到了報錯的資訊:
我一直都有別人的程式碼報錯不報錯我不在乎,我自己的程式碼報錯我一定解決
的態度。
初步判斷:
報錯是沒有報錯,但是方差組分估算為0,肯定是錯誤的:
所以,很有可能是H矩陣的ID定義不一致所致。
我看了一下之前培訓的程式碼,是手動構建H矩陣,然後使用asreml進行ssGBLUP的估算。當時的程式碼如下:
library(asreml)
library(learnasreml)
hinv = write_relation_matrix(Hmat,type="ginv")
hinv = as.matrix(hinv)
str(dd)
attr(hinv,"rowNames") = as.character(dd$ID)
attr(hinv,"INVERSE") = TRUE
3. asreml讀取外部矩陣的規則
-
- 將矩陣變為三元組的逆矩陣形式,這裡用的是我編寫的learnasreml包中的
write_relation_matrix
函式,將其轉化為廣義逆矩陣,然後變為三元組的稀疏矩陣,對應程式碼library(learnasreml);hinv = write_relation_matrix(Hmat,type="ginv")
- 將矩陣變為三元組的逆矩陣形式,這裡用的是我編寫的learnasreml包中的
-
- 將三元組轉化為矩陣的形式
hinv = as.matrix(hinv)
- 將三元組轉化為矩陣的形式
-
- 用
attr
函式,將其rowNames
變為實際的行名,attr(hinv,"rowNames") = as.character(dd$ID)
- 用
-
- 用
attr
函式,將其INVERSE
變為TRUE
- 用
4. 如何除錯?
問題出在哪裡?
第三步時,我的程式碼為:attr(hinv,"rowNames") = as.character(dd$ID)
,但是Hmat矩陣的行名不一定和dd$ID
的ID是一致的,如果不一致,那就是對應關係錯誤,評估方差組分時肯定報錯。
然後我比較一下兩者的異同:
> sum(dd$ID == idh)
[1] 610
> dim(dd)
[1] 2560 4
可以看到,原來共有2560個個體,只有610是對應的,結果不報錯才怪!
5. 更正後結果正常
更正如下:
# attr(hinv,"rowNames") = as.character(dd$ID)
attr(hinv,"rowNames") = as.character(rownames(Hmat))
這樣結果就正常了,執行結果如下:
> mod.as = asreml(phe ~ Sex+Generation, random = ~ vm(ID,hinv), residual = ~ idv(units),workspace="5Gb",data=dd)
Online License checked out Tue Nov 17 07:44:10 2020
Model fitted using the sigma parameterization.
ASReml 4.1.0 Tue Nov 17 07:44:11 2020
Allocating main workspace...done!
LogLik Sigma2 DF wall cpu
1 -23152.27 1.0 2554 07:44:47 34.5
2 -19423.25 1.0 2554 07:44:55 7.1
3 -15276.23 1.0 2554 07:45:02 7.0
4 -12315.15 1.0 2554 07:45:08 6.9
5 -10608.41 1.0 2554 07:45:15 7.0
6 -10008.30 1.0 2554 07:45:22 7.0
7 -9857.03 1.0 2554 07:45:29 7.0
8 -9840.99 1.0 2554 07:45:36 7.0
9 -9840.70 1.0 2554 07:45:43 7.0
10 -9840.70 1.0 2554 07:45:50 7.0
> summary(mod.as)$varcomp
component std.error z.ratio bound %ch
vm(ID, hinv) 53.27475 14.99226 3.553484 P 0
units!units 763.88704 23.60964 32.354877 P 0
units!R 1.00000 NA NA F 0
> vpredict(mod.as,h2 ~ V1/(V1+V2))
Estimate SE
h2 0.06519487 0.01786531
可以看到asreml執行了1分鐘
左右,而sommer執行了10分鐘
。
怎麼講?收費的就是香!
6. 調bug心得
- 先看資料有無問題
- 再看模型程式碼有無問題
- 最後看結果有無問題
要有資料敏感性,事出反常必有妖
,有時候結果沒有報錯不一定是真的沒有錯誤,要看結果是否正常,不正常肯定有問題。
當然,自己寫的bug,含著淚也要改好。遇到bug不要慌,都是小場面。
相關文章
- 遇到生產bug時,你會慌嘛?
- 遇到緊急問題,不要慌:抓包分析來救你(一)
- 遇到時間控制元件怎麼辦?不要慌,教你輕鬆拿下控制元件
- 遇到程式碼缺陷不要慌,馬上教你快速檢測和修復
- 系統壞了,不要慌,參考如下措施
- Nacos 爆重大 Bug!!不要升級,不要升級,不要升級
- 不要慌,我們談一談如何用好 ChatGPTChatGPT
- 面試題:Redis的應用場景核心設計,看完面試不在慌!面試題Redis
- Log4j 2.17.0 再曝漏洞,但不要驚慌!
- 分析表時遇到BUG
- 「前端 BUG 錄」遇到BUG應該如何排查前端
- Spring Boot 2.x(九):遇到跨域不再慌Spring Boot跨域
- 遇到網路問題?別慌!MTR來幫您
- 遇到ASM的兩個BUGASM
- 金九銀十要來了?不要慌,這些Android BAT高階面試題刷一刷AndroidBAT面試題
- AI告你侵權?別慌,都是人訓練出來的AI
- 不要慌,FastGPT 告訴我這是技術性調整,利好大 A!ASTGPT
- 面試官問:如果讓你寫一個配置中心,說說你的設計思路? 不要慌,看這個!面試
- 找回丟失的 commit 要記住不要慌 事情總有解決的方法MIT
- 年底不要慌,這個EXCEL模板幫你打贏Q4收官戰Excel
- .net打獨立執行環境遇到無法trim遇到的bug
- 不要現場程式設計程式設計
- 前端小bug記錄前端
- hive-3.0.0 版本中遇到的bug 彙總Hive
- 上手 WebRTC DTLS 遇到很多 BUG?淺談 DTLS FragmentWebTLSFragment
- 在專案中遇到的一些bug
- [BUG反饋]AdminController類的一個小bugController
- 深度理解SpringIOC,面試你根本不需要慌!Spring面試
- 操作失誤不要慌,這個命令給你的Git一次反悔的機會Git
- 小程式 遇到的坑
- 不要低估AI面臨的困境AI
- 初入職場的小夥伴請注意,這 8 個坑不要再踩了
- workman分散式部署遇到的bug以及修復方式分散式
- 特定頁面出現 BUG
- 進擊的Bug---那些年我遇到的大坑3
- 仔細想想SpringAOP也不難嘛,面試沒有必要慌Spring面試
- 不要總拿角色、場景談需求!
- 微信小程式 bug 集中營微信小程式