分类: 内部讨论

  • DeepGS中文说明

    原版更新:2018.06.08 翻译更新:2022.05.11

    翻译 刘翼宁、张敖

    题目 使用深度学习从表型预测基因型

    版本 1.2(注:最新版本为1.2)

    作者 Chuang Ma, Zhixu Qiu, Qian Cheng and Wenlong Ma

    维护 Zhixu Qiu zhixuqiu2015@gmail.com, Chuang Ma

    chuangma2006@gmail.com

    描述 名为‘DeepGS’的R包可以执行全基因组选择(Genomic selection,GS),GS在动植物育种中前途光明。 DeepGS使用整个基因组的全部分子标记结合先进的机器学习技术(深度学习)预测表型。DeepGS用国际玉米小麦改良中心(CIMMYT)基因库的2000个伊朗面包小麦的8个表型预测完成了有效性验证。此外,基于粒子群优化(ELBPSO)的集成学习,可以用于不同GS模型的预测的线性整合。

    依赖 R(>=3.0.0)

    建议 mxnet

    许可 GPL-2 | GPL-3

    编码 UTF-8

    集成数据 true

    RoxygenNote 6.0.1

    需要编译 no

    R主题文档

    ‘DeepGS’包的中文说明R主题文档cvSampleIndexELBPSOmeanNDCGpredict_GSModeltrain_deepGSModelwheat_example

    cvSampleIndex

    生成建模集和测试集的索引。

    描述

    该函数为建模和测试集中的样本生成索引,以执行N倍交叉验证实验。

    使用

    cvSampleIndex(sampleNum, cross = 5, seed = 1, randomSeed = FALSE)

    参数

    参数描述
    sampleNum需要划分为建模集和测试集的样本数。
    cross交叉验证的倍数(折叠数)。
    seed一个整数种子,用于重复结果,默认为1。
    randomSeed逻辑变量。默认值为FALSE。

    值

    每个元素的列表,包括$trainIdx、$testIdx和$cvIdx。

    $trainIdx 建模样本的索引。

    $testIdx 测试样本的索引。

    $cvIdx 交叉验证的索引。

    值描述
    $trainIdx建模样本的索引。
    $testIdx测试样本的索引。
    $cvIdx交叉验证的索引。

    作者

    Chuang Ma, Zhixu Qiu, Qian Cheng and Wenlong Ma

    例子

    #' ## 读取数据 ##
    data(wheat_example)
    ## 5倍交叉验证
    b <- cvSampleIndex(sampleNum = 2000, cross = 5, seed = 1)
    ## 提取其中一次验证的数据集
    b$cv1

    ELBPSO

    基于粒子群优化的集成学习(Ensemble Learning Based on Particle Swarm Optimization)。

    描述

    该算法结合了不同GS模型的预测表型值,并返回这些模型的最佳权重。

    使用

    ELBPSO(rep_times = 100, interation_times, weight_dimension, weight_min, weight_max, rate_min, rate_max, paticle_number, pred_matrix, IW = 1, AF1 = 2, AF2 = 2)

    参数

    参数描述
    rep_timesELBPSO重复次数,默认是100。
    interation_times每次ELBPSO优化迭代次数。
    weight_dimension权重维度。
    weight_min最小权重。
    weight_max最大权重。
    rate_min最小更新率。
    rate_max最大更新率。
    paticle_number帕特里克数量。
    pred_matrix第一列代表真实值,其他列代表其他GS模型的预测值。
    IW惯性(惰性)权重。默认为1。
    AF1加速因子1。默认是2。
    AF2加速因子2。默认是2。

    例子1.2

    # # Not run
    # library(DeepGS)
    # library(rrBLUP)
    # data("wheat_example")
    # Markers <- wheat_example$Markers
    # y <- wheat_example$y
    # cvSampleList <- cvSampleIndex(length(y),10,1)
    # # select one fold
    # cvIdx <- 1
    # trainIdx <- cvSampleList[[cvIdx]]$trainIdx
    # testIdx <- cvSampleList[[cvIdx]]$testIdx
    # trainMat = Markers[trainIdx,]
    # trainPheno = y[trainIdx]
    # validIdx <- sample(1:length(trainIdx),floor(length(trainIdx)*0.1))
    # validMat <- trainMat[validIdx,]
    # validPheno <- trainPheno[validIdx]
    # testMat = Markers[testIdx,]
    # testPheno = y[testIdx]
    # # design DeepGS architecture
    # conv_kernel <- c("1*18") # convolution kernels (fileter shape)
    # conv_stride <- c("1*1")
    # conv_num_filter <- c(8) # number of filters
    # pool_act_type <- c("relu") # active function for next pool
    # pool_type <- c("max") # max pooling shape
    # pool_kernel <- c("1*4") # pooling shape
    # pool_stride <- c("1*4") # number of pool kernerls
    # fullayer_num_hidden <- c(32,1)
    # fullayer_act_type <- c("sigmoid")
    # drop_float <- c(0.2,0.1,0.05)
    # cnnFrame <- list(conv_kernel =conv_kernel,conv_num_filter = conv_num_filter,
    # conv_stride = conv_stride,pool_act_type = pool_act_type,
    # pool_type = pool_type,pool_kernel =pool_kernel,
    # pool_stride = pool_stride,fullayer_num_hidden= fullayer_num_hidden,
    # fullayer_act_type = fullayer_act_type,drop_float = drop_float)
    # markerImage = paste0("1*",ncol(trainMat))
    # # train DeepGS model
    # DeepGS_obj <- train_deepGSModel(trainMat = trainMat,trainPheno = trainPheno,
    # validMat = validMat,validPheno = validPheno, markerImage = markerImage,
    # cnnFrame = cnnFrame,device_type = "cpu",gpuNum = 1, eval_metric = "mae",
    # num_round = 6000,array_batch_size= 30,learning_rate = 0.01,
    # momentum = 0.5,wd = 0.00001, randomseeds = 0,initializer_idx = 0.01,
    # verbose =TRUE)
    # # make predictions based on the trained model
    # DeepGS_pred <- predict_GSModel(GSModel = DeepGS_obj,testMat = Markers[testIdx,],
    # markerImage = markerImage )
    # # train RR-BLUP model#'
    # rrBLUP_obj <-mixed.solve(trainPheno, Z=trainMat, K=NULL, SE = FALSE, return.Hinv=FALSE)
    # # make predictions based on the trained model
    # rrBLUP_pred <- testMat %*% rrBLUP_obj$u + as.numeric(rrBLUP_obj$beta )
    # # prepare the prediction matrix
    # test_predMat <- cbind(t(DeepGS_pred), rrBLUP_pred)
    # train_predMat <- cbind(testPheno, t(DeepGS_pred), rrBLUP_pred)
    # colnames(train_predMat) <- c("real", "DeepGS", "RR-BLUP")
    ## End not run

    例子1.1

    ## 不运行
    # rrBLUP例子
    # library(DeepGS)
    # library(rrBLUP)
    # data("wheat_example")
    # Markers <- wheat_example$Markers
    # y <- wheat_example$y
    # cvSampleList <- cvSampleIndex(length(y),10,1)
    ## 选择第N倍(折)
    # cvIdx <- 1
    # trainIdx <- cvSampleList[[cvIdx]]$trainIdx
    # testIdx <- cvSampleList[[cvIdx]]$testIdx
    # trainMat = Markers[trainIdx,]
    # trainPheno = y[trainIdx]
    # testMat = Markers[testIdx,]
    # testPheno = y[testIdx]
    # rrBLUP_obj <-mixed.solve(trainPheno, Z=trainMat, K=NULL, SE = FALSE, return.Hinv=FALSE)
    # rrBLUP_pred <- testMat %*% rrBLUP_obj$u + as.numeric(rrBLUP_obj$beta)
    ## 不运行结束
    # 使用他们的预测得分计算不同模型的权重
    test_datapath <- system.file("exdata", "test_ELBPSO.RData", package = "DeepGS")
    load(test_datapath)
    weight <- ELBPSO(rep_times = 100,interation_times = 25,weight_dimension = 2, weight_min = 0,weight_max=1,rate_min = -0.01,rate_max = 0.01, paticle_number = 10, pred_matrix = train_predMat,IW = 1, AF1 = 2, AF2 = 2)
    new_pre <- (test_predMat %*% weight)/sum(weight)
    # calculating the weight of different training model by using their predict socres
    test_datapath <- system.file("exdata", "test_ELBPSO.RData",
    package = "DeepGS")
    load(test_datapath)
    weight <- ELBPSO(rep_times = 100,interation_times = 25,weight_dimension = 2, weight_min = 0,weight_max=1,rate_min = -0.01,rate_max = 0.01, paticle_number = 10, pred_matrix = train_predMat,IW = 1, AF1 = 2, AF2 = 2)
    ensemble_pred <- (test_predMat %*% weight)/sum(weight)
    predMat <- cbind(testPheno, t(DeepGS_pred), rrBLUP_pred, ensemble_pred)
    colnames(predMat) <- c("real", "DeepGS", "RR-BLUP", "ensemble")
    cor(predMat)

    meanNDCG

    计算平均归一化折扣累积增益。

    描述

    该函数是在选择育种值高的前k个个体时,用平均归一化折扣累积增益评估全基因组选择预测模型表现的。

    使用

    meanNDCG(realScores, predScores, topAlpha = c(10))

    参数

    参数描述
    realScores一个数值化向量,一个性状验证个体的育种值。
    predScores一个数值化向量或矩阵,用全基因组选择预测模型预测的个体的预测育种值。
    topAlpha一个数值化的向量(一个或多个参数),优良个体百分比,默认是10。

    作者

    Chuang Ma, Zhixu Qiu, Qian Cheng and Wenlong Ma

    例子

    ## Not run
    refer_value <- runif(100)
    pred_value <- sin(refer_value) + cos(refer_value)
    meanNDCG(realScores = refer_value,predScores = pred_value, topAlpha = c(10,20,30))
    ## End not run

    predict_GSModel

    预测GS模型。

    描述

    使用经过训练的深度学习全基因组选择预测模型预测性状值。

    使用

    predict_GSModel(GSModel, testMat, markerImage)

    参数

    GSModel 从DeepGSModel函数获得的经过训练的预测模型。

    testMat 基因型矩阵(T×M;T是个体,M是标记)。

    markerImage (字符串)给出“i×j”的图像格式,每个个体的标记信息(M×1)将被编码。

    作者

    Chuang Ma, Qian Cheng, Zhixu Qiu and Wenlong Ma

    train_deepGSModel

    利用深度学习技术建立全基因组选择预测模型。

    描述

    该函数应用深度卷积神经网络建立全基因组选择的预测模型。

    使用

    train_deepGSModel(trainMat, trainPheno, validMat, validPheno, markerImage, cnnFrame, device_type = "cpu", gpuNum = "max", eval_metric = "mae", num_round = 6000, array_batch_size = 30, learning_rate = 0.01, momentum = 0.5, wd = 1e-05, randomseeds = NULL, initializer_idx = 0.01, verbose = TRUE...)

    参数

    trainMat 建模群体的基因型矩阵(N×M,N是个体,M是标记)。

    trainPheno 建模群体表型的向量(N×1)。

    validMat 验证群体的基因型矩阵。

    validPheno 验证群体的表型向量(N*1)。

    markerImage (字符串)这个给出“i×j”的图像格式,每个个体用标记信息编码(M×1)。如果图像大小超过SNP标记数,用0修改缺失的部分,如果图像大小小于SNP标记数,多余的标记被去除。

    cnnFrame 包含卷积神经网络(CNN)框架的以下元素的列表:

    trainMat建模群体的基因型矩阵(N×M,N是个体,M是标记)。
    trainPheno建模群体表型的向量(N×1)。
    validMat验证群体的基因型矩阵。
    validPheno验证群体的表型向量(N*1)。
    markerImage(字符串)这个给出“i×j”的图像格式,每个个体用标记信息编码(M×1)。如果图像大小超过SNP标记数,用0修改缺失的部分,如果图像大小小于SNP标记数,多余的标记被去除。
    cnnFrame包含卷积神经网络(CNN)框架的以下元素的列表: – conv_kernel:向量(K×1)给出卷积核大小(宽度x高度),分别用于过滤K个卷积层的图像矩阵。 – conv_num_filter:向量(K×1)分别给出K个卷积层的卷积核数。 – pool_act_type:给出活动函数的类型的向量(K×1),将定义K个卷积层的输出,这将分别作为相应池层的输入。它包括“relu”、“sigmoid”、“softrelu”和“tanh”。 – conv_stride:K个卷积核的一个特征(K×1)步长。 – pool_type:分别从“avg”、“max”、“sum”中选择的一个特征(K×1)类型的K个池层。 – pool_kernel:一个特征(K×1)K个池层的K池核大小(宽×高)。 – pool_stride:一个特征(K×1)K池核的步长。 – fullayer_number-hidden:一个数值化(H×1),H完全连接层分别隐藏神经元的数量,最后一个完全连接层的隐藏神经元数量必须是1。 – fullayer_act_type:一个数值型((H-1)×1),从所有连接层的“relu”,“sigmoid”,“softrelu”和“tanh”的选择活动函数的类别。 – drop_float:数值型。
    device_type选择”cpu“或”gpu“设备去构建预测模型。
    gpuNum(数值型)GPU设备的数量,如果使用多GPU(gpuNum>1),momentum参数必须大于0。
    eval_metric(字符串)一种估计建模过程表现的方法,包括”mae“、”rmse“和”accuracy“,默认为”mae“。
    num_round(数值型)超过建模数据去建模的迭代次数,默认=10。
    array_batch_size(数值型)它为每个更新权重定义将通过网络传播的样本数,默认为128。
    learning_rate建模过程的学习率。
    momentum(浮点,0~1)移动平均线动量,平均为0.9。
    wd(浮点,0~1)权重衰减,默认为0。
    randomseeds设置mxnet设备特定随机数使用的种子。
    initializer_idx参数的初始化主题。
    verbose逻辑值(默认true)指定是否在建模期间的迭代时输出信息。
    …用于构造包“mxnet”中使用的神经网络的参数(http://mxnet.io/)。

    作者

    Chuang Ma , Zhixu Qiu, Qian Cheng and Wenlong Ma

    例子

    data(wheat_example)
    Markers <- wheat_example$Markers
    y <- wheat_example$y
    cvSampleList <- cvSampleIndex(length(y),10,1)
    # cross validation set
    cvIdx <- 1
    trainIdx <- cvSampleList[[cvIdx]]$trainIdx
    testIdx <- cvSampleList[[cvIdx]]$testIdx
    trainMat <- Markers[trainIdx,]
    trainPheno <- y[trainIdx]
    validIdx <- sample(1:length(trainIdx),floor(length(trainIdx)*0.1))
    validMat <- trainMat[validIdx,]
    validPheno <- trainPheno[validIdx]
    trainMat <- trainMat[-validIdx,]
    trainPheno <- trainPheno[-validIdx]
    conv_kernel <- c("1*18") ## convolution kernels (fileter shape)
    conv_stride <- c("1*1")
    conv_num_filter <- c(8) ## number of filters
    pool_act_type <- c("relu") ## active function for next pool
    pool_type <- c("max") ## max pooling shape
    pool_kernel <- c("1*4") ## pooling shape
    pool_stride <- c("1*4") ## number of pool kernerls
    fullayer_num_hidden <- c(32,1)
    fullayer_act_type <- c("sigmoid")
    drop_float <- c(0.2,0.1,0.05)
    cnnFrame <- list(conv_kernel =conv_kernel,conv_num_filter = conv_num_filter,
    conv_stride = conv_stride,pool_act_type = pool_act_type,
    pool_type = pool_type,pool_kernel =pool_kernel,
    pool_stride = pool_stride,fullayer_num_hidden= fullayer_num_hidden,
    fullayer_act_type = fullayer_act_type,drop_float = drop_float)
    markerImage = paste0("1*",ncol(trainMat))
    trainGSmodel <- train_deepGSModel(trainMat = trainMat,trainPheno = trainPheno, validMat = validMat,validPheno = validPheno, markerImage = markerImage, cnnFrame = cnnFrame,device_type = "cpu",gpuNum = 1, eval_metric = "mae", num_round = 6000,array_batch_size= 30,learning_rate = 0.01,momentum = 0.5,wd = 0.00001, randomseeds = 0,initializer_idx = 0.01, verbose =TRUE)
    predscores <- predict_GSModel(GSModel = trainGSmodel,testMat = Markers[testIdx,], markerImage = markerImage )

    wheat_example

    在开发功能中运行的例子。

    描述

    列表:

    - 标记:矩阵(599×1225),每行代表一个个体的1225个标记。
    - y:每个个体的真实表型值。

    使用

    data(wheat_example)
  • 芯片测序的DQC值

    在样品的基因分型前,需要先确定每个被测样品的质量。DQC(dish quanlity control)检测基因组上没有多态性的若干位点,也就是芯片上通常会设置一些本来没有多态性的位点,这些位点的作用是确定芯片设计的好坏或者样本测定的准确性。如果一个样品的DQC值小于阈值(通常是0.82),说明该样品的测序有问题,应该重新检测或在分析中去除。

  • 【讨论】没有狂犬病的墨西哥,要打狂犬疫苗吗?

      一旦被狗咬伤,中国人的第一反应是打狂犬疫苗。然而,有一个国度,很少有人会想到为自己注射狂犬疫苗。

      墨西哥,一个爱狗的国家,狗通常被视为家人。大街小巷,随处都能见到各式各样的狗,无论白天还是夜晚,犬吠总是萦绕耳畔。在这样一个狗的天堂,应该有很多被狗咬伤的病例吧?这不,一位访问学者的母亲,不幸成为了被狗咬伤的病例。

      若是在国内,估计每个人的第一反应都是打狂犬疫苗。然而,墨西哥医院的大夫只是简单处理了一下伤口,并未提及任何有关注射疫苗的事情,仅仅要求患者在家观察,观察狗是否有异样。不幸的是,这条狗不是家养犬,而是一条流浪狗,咬人之后就再也找不到了。我的天,狂犬病发作可不是闹着玩的,要出人命的,恐惧的气氛越发凝重。

      咨询了一位四十多岁的墨西哥老哥,得到的答复是,狂犬疫苗是给狗打的,没听说要给人打。

      什么?狂犬疫苗是给狗打的!!!真是一个惊人的消息。在网上查了查,墨西哥居然在2019年成为世界卫生组织认证的首个消除了由犬类传播狂犬病造成的人类死亡的国家(https://www.who.int/zh/news-room/fact-sheets/detail/rabies)。

      即便这样,好像总是觉得不放心,不怕一万就怕万一,再怎样也得吃颗定心丸。几经周折,国内的某个帖子提及了墨西哥城的一家私人诊所可以注射狂犬疫苗。一连五针,这件事终于告一段落。

      神奇的是,这么多狗,墨西哥是如何消灭狂犬病的呢?

      原来,墨西哥官方会要求家养犬需要定期到指定地点免费注射狂犬疫苗。贴心的墨西哥政府还会组织人员给流浪犬注射,久而久之,狂犬病就消失了。

      墨西哥已经从发达国家滑落到发展中国家,很多地方比中国差得远。但是,在注射狂犬疫苗这件事上,墨西哥的做法很值得提倡。免费为狗注射狂犬疫苗,既消灭了狂犬病,也避免了疫苗可能对人体造成的副作用,点个赞。

  • 玉米突变体订购方法


    该方法由沈阳农业大学生物科学技术学院植物学专业2020级金月婷提供。

    玉米突变体的订购一般使用两个网站:MaizeGDB和中国农科院突变体库(MEMD)。

    MaizeGDB

    1. 登录网站https://maizegdb.org/。

    2. 在右上角的搜索框搜索目的基因。

    3. 若搜索得到了至少一个结果,选择搜索到的目的基因。

    4. 选择GENE MODEL并且下拉列表点击种子库。

    5. 选择订购种子。

    6. 若无需其他突变体,则可直接提交,还需要其他如变体,重复上面的步骤。

    7. 填写收货地址等信息。

    中国农科院突变体库(MEMD)

    1. 登录网站http://www.elabcaas.cn/memd/index.php。查看整个流程,并下载空白突变体信息表。

    2. 首页搜索基因。可以根据基因ID、基因名称、染色体位置和表型搜索。

    3. 这里以基因名为例,填写基因名称,选择参考基因组序列,勾选突变类型,即可搜索。

    3.1 非同义突变是比较常见的突变类型的选择。
    • 突变位置偏后,可能不会对原蛋白造成较大影响;
    • 突变后的氨基酸与原氨基酸结构相似,可能影响也较小。
    • 因此,在保守结构域的氨基酸结构变化较大的突变对蛋白影响更大。
    3.1.2 复制步骤3结构里面的GeneID。
    3.1.2 打开maizeGDB.org,在右侧的搜索栏填入GeneID并搜索。
    3.1.3 在搜索的结果中点击GeneID。
    3.1.4 选择序列,并复制最下方的蛋白序列。
    3.1.5 使用Smart预测结构域。登录网站http://smart.embl-heidelberg.de/,选择一般模式。
    3.1.6 输入基因名或蛋白质(氨基酸)序列。
    3.1.7 获得保守结构域的位置信息。
    3.1.8 回到3.1.4的位置,查找cDNA序列,找到第一个ATG(起始密码子)的位置,记为起始位置x,x+380×3的位置为第一个关键氨基酸位置的密码子起始位置,记作y。同理,最后一个关键氨基酸位置的起始密码子的位置=x+440×3+2,加2的目的是补齐到该密码子的最后一位,记作z。复制y到z之间的序列,该序列为编码关键蛋白的外显子序列。
    3.1.9 将该序列比对到原基因序列上(包括内含子),比对可以使用BLAST方法。比对后,得到cDNA在整个基因上的相对位置。最后,再根据相对位置计算出最终物理位置。按照最终物理位置选择突变体。有些基因有多个转录本,需要对每个转录本分别执行上面步骤,获得多个关键物理位置。

  • 如何组织好一个科研项目?

    完成一个项目并非易事。

    仅仅靠一个人是很难完成比较大的项目的,这就要求组建一个团队来共同完成任务。既然有了团队,就需要良好的协作能力,分工合理完善,最终达成目标。

    要获取良好的协作能力,沟通必须高效而顺畅,没有良好的沟通,就没有办法协同作战。良好的沟通建立在相似的知识结构基础之上,知识结构差异越大,沟通越容易受阻,这也是很多导师和学生交流不顺的原因,而具有相同知识背景的人之间可无障碍交流。

    对于我们科研人员而言,做项目在绝大多数情况下等同于做科学研究。科学研究需要严谨的态度,需要将可能的干扰因素尽量去除,如此才能得到最有效的数据,做最准确的分析,最终接近真理。

    做科研,并非只是埋头苦干,科学研究需要交流,要有所贡献,这贡献包括对世界、对社会也包括对自己。贡献的形式可以很多,比如开发出一个新的工具,发明一个新的专利,即使所有的新发现不足以用实物、产品体现出来,最起码也得用论文将自己发现告诉世人,让其他人可以站在自己的肩膀上继续前行……这就要求,科研至少要以发文章为最基本的前提。

    对于一个团队来说,任何成员甚至领导者都可能会更换,但是,不能也不应该出现领导或关键人物的离开导致项目搁浅。一个卓越的项目团队,无论谁离开,其他人都可以很快接替并继续进行研究才是正道。这需要的是传承。

    还有一个非常重要的点是互助。团队内,团队间,齐心则万事可破。就拿表型鉴定来说,像关联群体这样的规模,不可能靠一个人将所有的性状都调查完,授粉也是如此。互相帮忙,方为要义。

    最后一点,是非常重要的一点,也是我有时都做不到的一点——谦逊。每个人都有闪光点,都有值得尊敬和学习的地方,无论年龄大小,位置高低。有时,需要克制自己的情绪,换个角度审视对方,学习对方的优点,避免做出自己眼里别人令人厌烦的举动,不断地完善和提高自己,是谓修行。

    以上是我总结出来的做项目的十二字箴言:协作、严谨、贡献、传承、互助、谦逊。希望我的学生可以牢记,并将其运用在今后的学习、生活和工作中。

    团队要形成合力,避免各自为战,需要每个成员的共同努力。每个个体最容易犯的错误是——熊瞎子劈包米,劈一穗扔一穗,最后,连自己都忘记了自己当初要做什么了。要解决这个问题,必须养成写实验记录的习惯,事先规划好每一步,经过充分的讨论和论证,然后按照规划好的流程图逐条实施。

    流程图的规划需要以整个项目为出发点,像一个根系,将每一步延展开来。每一步最好是能够想到的最好的解决方案。所有人围绕着一个中心共同努力,最终才能把项目完成的比较完美。

    沟通交流非常重要。团队间比较常见的交流形式有:面对面交谈、QQ/微信聊天、网上论坛、协做文档、云盘、E-mail等。在这些形式中,很难理清哪些是最高效的。但一些基本的原则是要有的。

    前面说过,传承很重要。传承靠的不是口口相传,而是前人留下来的资料。这就要求交流的形式中必须有文字记载,这些记载必须稳定存在,因此面对面交谈、QQ/微信聊天被pass掉。

    网上论坛目前也没有非常适合作为研究交流的版本,而且除了付费的都不太稳定,经常出现“该页无法显示”等现象,也pass掉。

    协作文档是个新兴的形式,但是在手机端的表现并不是很好,兼容性有待提高,暂时也pass掉。

    最终选择的形式为E-mail+可靠的云盘的形式。

    E-mail虽然有些陈旧甚至老掉牙,但是不可否认,它的稳定性和对各种设备、各种系统的支持都是最好的,邮箱内的信息一般可以长期保存。很多国外的大学也都采用E-mail进行沟通,多人同时使用时,通过“回复全部”功能,所有人都可以参与讨论,发表意见。

    云盘的作用是存储word文件。E-mail中的交流信息一般比较零散,经过一段时间就需要进行整理和总结,把重要信息整理到一个可以协作的云盘上是一个比较适合的方案。

    另外,在使用邮件交流时,推荐使用英文。只有真正写下来,才会发现很多词汇很多句型甚至介词应该用哪一个都不知道。通过经常性的写作,将不会的地方通过查词典一点一滴积累,通过实践逐渐适应英语,对未来的发展也是非常有益的。

    任何事物没有完美,以上我的理解也可能不准确、不完善,欢迎发表个人看法和补充。

  • 密码保护:第一篇博文

    密码保护:第一篇博文

    此内容受密码保护。如需查阅,请在下方输入密码。