• 【新闻报道】CIMMYT访问简要总结

      大家好,青年教师张敖在一万公里外的墨西哥,送来小小的问候——Buenos días(发音:波依no丝 地呀丝,译:早上好)。转瞬间,我已经在墨西哥进修了将近2年的时间,成果不多,只有一篇即将被Crop Journal接收的文章和申请的两个专利。成果少,源于自己的才疏学浅,尤其是英语,阻碍了我将数据转化成文章的效率。还有,对于统计学基本原理的缺失,让我在理解模型和解释数据的意义上,遇到了很大障碍。因此,远在大洋彼岸,我有意识的在逐渐提高这两方面的能力,希望通过日积月累,达到新的高度,对世界有更深层次的认识,更好的教导学生。

      国际玉米与小麦改良中心(CIMMYT)是个神奇的地方,在这里,我不仅收获了学术成果,还在其他很多方面有了提高。

      在CIMMYT,有一个叫Crossa的老先生,七十多岁,是国际顶级的数量遗传学家。他很喜欢跑到我的办公室,让我叫上国内来的学者们,听他讲统计学方面的知识。可惜,我的英文水平有限,理解的不是很透彻。

      2019年末,国内爆发了新冠疫情,墨西哥华人学者联谊会、CIMMYT的科学家和留学人员自发的向祖国捐款,用于购买抗疫物资寄回国内。此次活动,我毫不犹豫的捐款2000比索。随后,国内疫情好转,墨西哥成为重灾区,我开始了长达十几个月的居家生活。2021年3月,中国疫苗抵达墨西哥,大使馆组织墨西哥留学人员注射疫苗,让我深深的感受到了祖国的关怀。

      祖国不仅关心我们的身体健康,心理健康同样受到重视。大使馆为了排解我们长期闷在家里的压力,组织了“2020在墨留学人员征文大赛”和“2020墨西哥留学生/汉语教师微视频大赛”。我积极参与,借助CIMMYT这块神奇的地方,分别获得了征文大赛三等奖,微视频大赛团体一等奖和个人三等奖。

      可能由于在几次大赛中的突出表现,新华社记者找到我,先后拍摄了2021年新年十二个国家留学人员十二生肖拜年视频,2021中国青年的“国际范”视频,发布在新华社微信小程序和APP上,浏览量超过一百三十万。此外,我还参与了外交部#此心安处是吾乡-我在国外过大年活动,作品《CIMMYT过大年》在外交部微博播放。

      CIMMYT这个神奇的地方也给了我人脉上的巨大收获。在这里,我帮助四川农业大学、河南农业大学、中国农业科学院、黑龙江省农科院、扬州农科院、上海农科院、新疆农业大学等的访问学者和合作伙伴分析数据或提供程序代码,以第三作者至第八作者发表多篇SCI论文。

      此外,我在CIMMYT这个神奇的地方,用R语言编写了“基因型数据合并工具”、“GO数据多行合并工具”、“Tassel结果的曼哈顿图绘制工具”、“G矩阵画PCA图工具”、“遗传相似性计算工具”、“自交系亲本推测工具”、“基因组标记密度热图绘制工具”等程序,发布在https://datahold.cn网站上。方便自己和他人在今后的科研中使用。

      写诗是我的业余爱好,这两年,我写了十五首古诗词,大多写给回国临行前的访问学者们。2020年的10月1日恰逢国庆节和中秋节,借着双节的气氛,在墨西哥华人学者联谊会微信群与教授们斗诗也别有一番风趣。

      一提起诗,就勾起了我强烈的思乡之情。我已迫不及待的想回到学校尽一份力了。最后以我写的一首词做结尾:

    浣溪沙·秋夜

    2020.10.2 0:20

    低楼独窗寻月光,

    秋风无怨泪沾裳(cháng)。

    乡思萦绕故土芳。

    古昔玄奘越千荒,

    今朝学才渡海江。

    何人倚窗共月光。

    张敖    

    2021.5.25

  • R语言快速获取HMP文件SNP的等位基因信息

    该代码主要用到剪切板和不同软件的灵活运用。

    SNPs <- read.table("clipboard",header=F)
    
    refere <- read.table("clipboard",header=T)
    
    res <- refere[which(rownames(refere) %in% SNPs[,1]),]
    write.table(res,"clipboard",sep="\t",quote=F,col.names=F,row.names=F)
    

    运行步骤

    1. 复制需要获得等位基因信息的SNP名称列表。例如:

    S2_44435558
    S3_151630215
    S3_144885149
    S4_181062027
    S7_141142136
    S9_76535431
    S9_115952576
    S10_137204131

    2. 运行代码的第一行。

    3. 用EmEditor打开基因型文件(HMP格式),选择制表符分隔,复制前两列。

    4. 运行第三行到最后的代码。

    5. 在需要的地方粘贴皆可。

  • EXCEL获取SNP的bin物理位置

    前人的研究,已经将每条染色体分成了10个左右的bin区域,用于粗定位基因的物理位置。本工具用于将GWAS或QTL Mapping的位置信息转换成bin位置区域。

    【我写好的excel下载】

    https://dataholdcn.cn/excel/B73%20RefGen_v2%20bin%20physical%20position_tool_za.xlsx

    【使用方法】

    在 “Reslut”工作表中,替换SNP名称即可。

    【实现过程】

    首先,我们需要bin区域的物理信息,这里以B73 RefGen v2为例。将下表数据保存到excel文件的“Clean Table“工作表。Bin列表示物理位置bin区段,Chr是染色体号,Size是区段大小,Start是起始位置,End是结束位置,Index是用于查找的信息。

    BinChrSize (Mbp)StartEndIndex
    1.00Chr12.0412039901S1_1
    1.01Chr110.36203990112398949S1_2039901
    1.02Chr116.861239894929258944S1_12398949
    1.03Chr122.892925894452152777S1_29258944
    1.04Chr130.425215277782574898S1_52152777
    1.05Chr193.0982584786175670048S1_82584786
    1.06Chr123.22175670048198887570S1_175670048
    1.07Chr129.4198854443228254156S1_198854443
    1.08Chr121.84228254156250093155S1_228254156
    1.09Chr117.77250093155267860952S1_250093155
    1.10Chr115.33267860952283188047S1_267860952
    1.11Chr114.78283259156298039872S1_283259156
    1.12Chr13.39297960525301354135S1_297960525
    2.00Chr21.5511551442S2_1
    2.01Chr22.6415514424187615S2_1551442
    2.02Chr210.82418761515005045S2_4187615
    2.03Chr213.751501629028771109S2_15016290
    2.04Chr242.972877110971742767S2_28771109
    2.05Chr281.471742767153140073S2_71742767
    2.06Chr234.04153140073187179001S2_153140073
    2.07Chr217.72187179001204896812S2_187179001
    2.08Chr218.42204896812223320002S2_204896812
    2.09Chr212.15223320002235471439S2_223320002
    2.10Chr22.42234646685237068873S2_234646685
    3.00Chr31.7311729470S3_1
    3.01Chr32.1617294703888321S3_1729470
    3.02Chr34.7138883318599890S3_3888331
    3.03Chr34.5859877213102315S3_8598772
    3.04Chr3113.1513109892126255823S3_13109892
    3.05Chr342.15126255823168409685S3_126255823
    3.06Chr322.7168409685191113733S3_168409685
    3.07Chr314.26191113733205370271S3_191113733
    3.08Chr310.5205370271215869148S3_205370271
    3.09Chr316.29215846541232140174S3_215846541
    3.10Chr30.07232074985232140174S3_232074985
    4.00Chr40.691694004S4_1
    4.01Chr44.356940045045991S4_694004
    4.02Chr46.36504599111403953S4_5045991
    4.03Chr410.21140395321605708S4_11403953
    4.04Chr410.672160570832280422S4_21605708
    4.05Chr4118.8332251206151082840S4_32251206
    4.06Chr419.96151110020171066103S4_151110020
    4.07Chr48.77171066103179834540S4_171066103
    4.08Chr425.3179834540205136045S4_179834540
    4.09Chr432.11205136045237246237S4_205136045
    4.10Chr42.74237246237239987981S4_237246237
    4.11Chr42.04239987981242029974S4_239987981
    5.00Chr53.3213323880S5_1
    5.01Chr54.6733238807997002S5_3323880
    5.02Chr56.86800806014870573S5_8008060
    5.03Chr565.951485361980804839S5_14853619
    5.04Chr591.5980804839172395871S5_80804839
    5.05Chr522.92172438770195358319S5_172438770
    5.06Chr59.3195305700204605587S5_195305700
    5.07Chr57.12204659857211775643S5_204659857
    5.08Chr53.75211775643215521293S5_211775643
    5.09Chr52.41215465694217872852S5_215465694
    6.00Chr68.2718274025S6_1
    6.01Chr678.67827681386946680S6_8276813
    6.02Chr69.898694668096840186S6_86946680
    6.03Chr67.7896840186104619429S6_96840186
    6.04Chr616.41104619429121033444S6_104619429
    6.05Chr632.92121033444153956114S6_121033444
    6.06Chr67.37153762257161129826S6_153762257
    6.07Chr65.76161129826166892211S6_161129826
    6.08Chr62.29166885247169174353S6_166885247
    7.00Chr74.7114707470S7_1
    7.01Chr79.15471235313861507S7_4712353
    7.02Chr7114.3113861507128175453S7_13861507
    7.03Chr727.88128175453156050470S7_128175453
    7.04Chr712.28156050470168334968S7_156050470
    7.05Chr76.07168334968174407842S7_168334968
    7.06Chr72.4174362351176764762S7_174362351
    8.00Chr81.8311831964S8_1
    8.01Chr88.24183196410072434S8_1831964
    8.02Chr811.081007243421153183S8_10072434
    8.03Chr887.5421153183108690693S8_21153183
    8.04Chr813.79108690693122478285S8_108690693
    8.05Chr823.95122478285146426603S8_122478285
    8.06Chr818.84146426603165267974S8_146426603
    8.07Chr84.07165267974169336170S8_165267974
    8.08Chr83.63169336170172961960S8_169336170
    8.09Chr82.39172961960175347686S8_172961960
    9.00Chr93.3113312268S9_1
    9.01Chr98.47331226811781894S9_3312268
    9.02Chr911.491178189423268159S9_11781894
    9.03Chr978.4823268159101747879S9_23268159
    9.04Chr925.44101747879127192550S9_101747879
    9.05Chr99.61127192550136806801S9_127192550
    9.06Chr911.43136806801148241346S9_136806801
    9.07Chr96.63148241346154869700S9_148241346
    9.08Chr92.15154599322156750706S9_154599322
    10.00Chr102.6512650397S10_1
    10.01Chr102.3626503975008368S10_2650397
    10.02Chr108.55500836813559627S10_5008368
    10.03Chr1074.791355962788348445S10_13559627
    10.04Chr1039.6188348445127958713S10_88348445
    10.05Chr109.35127936624137286408S10_127936624
    10.06Chr105.5137311961142812228S10_137311961
    10.07Chr106.82142812228149627545S10_142812228

    新建“Reslut”工作表,第一行的前4列分别命名为:

    SNPChrPositionBin

    对应的公式为:

    S1_191524962=”Chr”&MID(A2,2,FIND(“_”,A2)-2)=MID(A2,FIND(“_”,A2)+1,LEN(A2))=XLOOKUP(A2,’Clean Table’!F:F,’Clean Table’!A:A,,-1,1)

    第一列用于填写SNP名称,第二列用于获得染色体信息,第三列获取物理位置信息,第四列通过查找获取bin位置。

    接下来只需要修改第一列的名称,其他列下拉就可获得每个SNP的bin位置。

    若要修改参考基因组,替换“Clean Table”工作表即可。

  • Word表格按照小数点对齐

    先选中数值部分,然后点击段落设置。

    选择制表位。

    在制表位位置输入:2字符,选择小数点对齐,再确定,完工。

    结果:

    若都是2位小数,可以直接使用右对齐功能,效果一样。

  • 墨西哥检车

    在墨西哥,一般半年检车一次。

    检车网站:https://citaverificacion.edomex.gob.mx/RegistroCitas/

    网站上会标识,车牌最后一位的检车期限。如图:

    检车预约选择第一个:

    选择第一个,新预约,并填写验证码,验证码区分大小写。

    需要填写车牌,行车卡上的NIV(第三个),第五个选汽油。几乎所有信息都在行车卡上。

    城市选TEXCOCO,里面有3个地点,917在市中心附近,比较近。

    最后,点那个日历,选择日期和时间。

    确认信息后,会有一个下载按钮,下载为PDF,打印出来,带着去检车。

    上面所选检车地址:

    若没有按时间检车,去检车时会给一个罚款单,去任何银行都可以缴费(OXXO不能缴费),缴费后3个工作日再预约检车。

    检车需要带行车卡、一个粉色头的单据、预约单和身份证件,下图为按顺序排列。

    大致流程为:

    1. 直接开车排队进入检车区。
    2. 将材料交给过来询问的工作人员。
    3. 根据提示将车开到指定地点。
    4. 接到检车工人召唤后,将车开进检车线,下车到交款处。
    5. 可能需要等一段时间,交款后在等候区等待。
    6. 工作人员带着去贴标,然后离开。
  • Powershell 文件操作

    创建文件夹,用到new-ite命令,-path参数用来指定位置,-itemtype用来指定类型,本例为目录。若已经同名目录会报错。

    new-item -path 'd:\temp' -itemtype directory
    

    同理,我们可以用以上命令新建一个TXT文本。

    new-item -path 'd:\temp\demo.txt' -itemtype file
    

    copy-item用于文件夹或文件夹的复制。

    new-item -path 'd:\temp\temp1' -itemtype directory
    new-item -path 'd:\temp\temp1\demo1.txt' -itemtype file
    copy-item 'd:\temp\temp1\demo1.txt' 'd:\temp\temp2\demo1.txt'
    

    把一个文件夹下的文件复制到另一个文件夹。

    copy-item 'd:\temp\temp1\' -recurse 'd:\temp\temp2\'
    

    把一个文件夹下的指定类型文件复制到另一个文件夹。

    copy-item -filter *.txt 'd:\temp\temp1' -recurse 'd:\temp\temp2'
    

    把一个文件夹及其内的文件复制到另一个文件夹下。

    copy-item 'd:\temp\temp1' -destination 'd:\temp\temp2'
    copy-item 'd:\temp\temp1' -destination 'd:\temp\temp2'-recurse
    

    删除一个文件夹包括里面的文件。

    remove-item 'd:\temp\temp2' -recurse
    

    删除文件。

    remove-item 'd:\temp\temp1\demo1.txt'
    

    文件夹的移动,文件夹里面的文件也会被移动。

    move-item d:\temp\temp1 d:\temp\temp2
    

    文件的移动,只能在已有的文件夹下才能移动,否则出错。

    new-item 'd:\temp\temp2' -itemtype directory
    move-item d:\temp\temp1\demo1.txt d:\temp\temp2\demo1.txt
    

    重命名文件或文件夹。

    rename-item d:\temp\temp2\demo1.txt d:\temp\temp2\demo3.txt
    rename-item d:\temp\temp2 d:\temp\temp3
    

    显示文档内容。

    get-content d:\temp\temp3\demo3.txt
    

    显示文件内容的行数。

    (get-content d:\temp\temp3\demo3.txt).length
    

    检查某文件或文件夹是否存在。

    test-path d:\temp\temp2
    test-path d:\temp\temp1\demo2.csv
    

    向文本文件写入内容。注意:原有内容会被抹掉。

     set-content d:\temp\temp3\demo3.txt 'Hello world!'
    

    创建CSV文件,并写入内容。

     new-item d:\temp\temp1\demo1.csv -itemtype file
     get-content D:\temp\temp1\demo1.csv
    

    清除文件内容。

    clear-content d:\temp\temp1\demo1.csv
    get-content d:\temp\temp1\demo1.csv
    

    添加多行数据。

    set-content d:\temp\temp1\demo1.csv 'Hello,world!'
    add-content d:\temp\temp1\demo1.csv 'A,b'
    

    数据去掉重复后写入文件。sort是排序(字符串按照字母顺序),get-unique是保留唯一值(去重复)。

    $list="one","two","two","three","four","five"
    $list|sort|get-unique
    add-content d:\temp\temp1\demo1.csv $list
    get-content d:\temp\temp1\demo1.csv
    

    查看文件对象的详细信息。-character统计字符,-line统计行,-word统计单词。

    add-content d:\temp\temp1\demo1.csv "good or bad"
    get-content d:\temp\temp1\demo1.csv
    get-content d:\temp\temp1\demo1.csv|measure-object -character -line -word
    

    文件或目录的对象查看操作。

    cd d:\temp\temp1\
    get-childitem
    get-childitem|measure-object
    

    两个文件的比较。-includeequal显示相同的部分。

    compare-object -referenceobject $(get-content d:\temp\temp1\demo1.csv) -differenceobject $(get-content d:\temp\temp1\demo2.csv)
    compare-object -referenceobject $(get-content d:\temp\temp1\demo1.csv) -differenceobject $(get-content d:\temp\temp1\demo2.csv) -IncludeEqual
    

  • 如何让word中一个空格占一个中文宽度

    有些人的word一个空格占一个英文字母的宽度,有些人的word可以占一个中文字的宽度。在写毕业论文时,通常我们需要一个空格表示1个中文字母的宽度,但在一些情况,我们又希望一个空格是一个英文字母宽。下面就来介绍一下如何修改这个值。

    以word2019为例,依次选择文件→选项→语言,在Office 创作语言和校对选项卡,将中文设置成默认,则一个空格占一个中文字符;若设置成英文默认,则一个空格占一个英文字符。

  • sommer包做全基因组预测

    (1)自交系预测

    模型:

    y = Xβ + Zu + ε

    代码:

    # sommer的GS预测
    library(sommer)   # 加载sommer包,第一次安装请先运行install.packages("sommer")
    data(DT_wheat)
    DT <- DT_wheat
    GT <- GT_wheat
    colnames(DT) <- paste0("X",1:ncol(DT))   # 列名为X1~X4
    DT <- as.data.frame(DT)   # 转换为数据框
    DT$id <- as.factor(rownames(DT))   # 把行号作为列并作为因子
    # select environment 1
    rownames(GT) <- rownames(DT)   # 给基因型赋值相同的行号(名称)
    K <- A.mat(GT) # additive relationship matrix
    colnames(K) <- rownames(K) <- rownames(DT)   # K的行列相同,都赋值名称
    # GBLUP pedigree-based approach
    set.seed(12345)
    y.trn <- DT
    vv <- sample(rownames(DT),round(nrow(DT)/5))   # 抽取20%作为验证群体(被预测)
    y.trn[vv,"X1"] <- NA
    head(y.trn)
    ## GBLUP
    ans <- mmer(X1~1,
                random=~vs(id,Gu=K),
                rcov=~units,
                data=y.trn, verbose = FALSE) # kinship based
    ans$U$`u:id`$X1 <- as.data.frame(ans$U$`u:id`$X1)
    rownames(ans$U$`u:id`$X1) <- gsub("id","",rownames(ans$U$`u:id`$X1))
    cor(ans$U$`u:id`$X1[vv,],DT[vv,"X1"], use="complete")
    ## rrBLUP
    ans2 <- mmer(X1~1,
                 random=~vs(list(GT)),
                 rcov=~units,
                 data=y.trn, verbose = FALSE) # kinship based
    u <- GT %*% as.matrix(ans2$U$`u:GT`$X1) # BLUPs for individuals
    rownames(u) <- rownames(GT)
    cor(u[vv,],DT[vv,"X1"]) # same correlation
    

    数据使用的是CIMMYT的全球小麦项目组提供的数据,共有599个个体。y.trn表示籽粒产量,每一列表示一个环境,共有4个环境,例子中只计算了80%预测20%的结果。

    (2)杂交种的预测

    杂交种的预测使用GCA效应和SCA效应。数据来自1254年测定的玉米单交试验。123个dent和86个flint,用测定的1254材料预测未测定的9324个材料。例子中只计算了第一个性状GY。

    模型:

    y = Xβ + Zu1 + Zu2 + ZuS + ε

    代码:

    library(sommer)
    data(DT_technow)
    DT <- DT_technow   # 表型数据
    Md <- Md_technow   # dent马齿基因型矩阵
    Mf <- Mf_technow   # flint硬粒基因型矩阵
    Ad <- Ad_technow   # dent的加性效应矩阵
    Af <- Af_technow   # flint的加性效应矩阵
    y.trn <- DT
    vv1 <- which(!is.na(DT$GY))   # 获得有数据的材料行号
    vv2 <- sample(vv1, 100)   # 在有数据的材料行号中随机选择100个材料
    y.trn[vv2,"GY"] <- NA   # 将抽取的100个材料设为NA
    anss2 <- mmer(GY~1,   # 固定效应
                  random=~vs(dent,Gu=Ad) + vs(flint,Gu=Af),   # 随机效应,并指定方差协方差矩阵
                  rcov=~units, 
                  data=y.trn, verbose = FALSE)
    summary(anss2)$varcomp
    zu1 <- model.matrix(~dent-1,y.trn) %*% anss2$U$`u:dent`$GY
    zu2 <- model.matrix(~flint-1,y.trn) %*% anss2$U$`u:flint`$GY
    u <- zu1+zu2+anss2$Beta[1,"Estimate"]
    cor(u[vv2,], DT$GY[vv2])
    
                   VarComp VarCompSE    Zratio Constraint
    u:dent.GY-GY  16.06423 2.5737578  6.241548   Positive
    u:flint.GY-GY 11.42070 2.1591718  5.289390   Positive
    units.GY-GY   16.81801 0.7689509 21.871368   Positive
    > cor(u[vv2,], DT$GY[vv2])
    [1] 0.922328

    预测时,所有有数据的个体作为建模群体,这里随机减去100个个体的测定值用于验证,即建模群体是有数据的个体-100。zu1是模型中的Zu1,Z是model.matrix(~dent-1,y.trn),即dent的设计矩阵;u1是anss2$U$u:dent$GY是GY性状dent的BLUP值。相应的,zu2是flint的设计矩阵×GY性状flint的BLUP。

    anns2$Beta[1,”Estimate”]是固定效应的BLUP。

    最后,100个个体的测定值和这100个个体的BLUP值的相关系数作为预测结果。

    上面的例子只使用了GCA进行预测,因为SCA在这里面没有对预测精度起到多大的影响,相反,由于使用了很大的矩阵,导致计算时间明显增加。