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

    完成一个项目并非易事。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 纪念那年的可乐插件

    从拿到ipad的爱不释手,到对经典卡牌游戏《三国来了》的痴迷,再到从羊驼插件那里获得的启发,自己独立开发游戏辅助工具——可乐插件。

    一遍一遍的测试,不厌其烦地修改。直到官方封杀为止~

    很可惜,我在百度帖吧发布插件的帖子已被隐藏,只能在自己的共享云盘中找到最后一版代码。

    那段时间,磨练了意志,增长了技术,提高了对编程的理解,也是难忘的一段回忆!

    可乐插件 for ipad 11.28

    可乐插件 for iphone 11.28

  • 纪念那年的魔术社团网站

    是否还记得当年辉煌的魔术社团,那时,我们曾经努力过。

    在那个时候,我们是全校最杰出的社团之一!

    在那个时候,我们已经有自己的网站!

    在那个时候,我们已经有自己的论坛!

    在那个时候,一起筹备大型汇报演出!

    一起参与沈阳电视台和华商晨报的采访,活动的报道占据华商晨报网站首页黄金位一周!

    我们发行了内部和外部版本的活动纪念光盘!内部版包含全部准备过程花絮以及全部宣传视频内容!

    虽然网站已经无法访问,但一起努力的幸福感,永远挥之不去……

    纪念那个充满神奇的魔幻校园……

     

    【遗址都找不到的纪念图片】——其实源码还在我硬盘的角落里,只是暂时寻不见踪迹。

    Magic Web

     

    Magic bbs

     

    magic tongji

    【久未更新的遗迹】

    微博:https://www.weibo.com/syaumagic

    博客:http://blog.sina.com.cn/syaumagic

    魔术嘉年华完整视频:https://v.youku.com/v_show/id_XMTc1Njk1MjY4.html

    药科魔术社的祝福与沈农魔术搞笑桥段:https://v.youku.com/v_show/id_XMTY5MTg1NDk2.html

    海外魔术社团对沈农魔术社的祝福(经典):https://v.youku.com/v_show/id_XMTY4MzY2MDk2.html

    奇迹嘉年华开场完整视频:https://v.youku.com/v_show/id_XMTY3NDY0OTc2.html

    魔术社团演出宣传视频:https://v.youku.com/v_show/id_XMTYyOTIxMTQ0.html

    魔术社团二周年纪念:https://v.youku.com/v_show/id_XMTMxNjU2MjMy.html

    《奇迹嘉年华》准备过程花絮——官方首发:https://v.youku.com/v_show/id_XMTg0Mjk2MzIw.html

  • 神奇的植物

    在地球上数千种可食用植物中,玉米和小麦携手为人类健康提供了丰富的营养,它们共同占据了全球作物产量的四分之一。这两种植物作为各个国家烹饪的主要原料已有几千年的历史。

    小麦是最先被驯化的作物,它是欧洲、西亚和北美的主粮。与其他主粮相比,小麦可以在更多的区域种植,是人类摄入蛋白的主要来源,也拥有大量的矿质元素。

    玉米最早由古代墨西哥人大规模驯化。现在,玉米是撒哈拉以南非洲和拉丁美洲最重要的粮食作物,也是亚洲的重要作物。同时,玉米是全球最大的饲料作物。

  • 数据的类型

    在统计学中,数据可以分成很多类型:定性类和定量类、离散型和连续型、独立型和非独立型。

    定性变量和定量变量

    定量类属于数值型变量,如年龄和收入,是具体的数值。

    定量类属于非数值型变量,如性别和民族,变量的值是描述性的,就像男、女、汉、苗等。

    • 定性类(Qualitative)
      • 名称(Nominal):描述性,如姓名、性别、邮政编码等,值为男、女、汉、蒙。它的顺序没有意义,也不能进行加减乘除运算。
      • 序号(Ordinal):看待某事的态度,完全同意、同意、无所谓、不同意、坚决不同意等,程度可以比较,但没有倍数关系,不能说完全同意并非2倍的同意。加减乘除也没有意义。
    • 定量类(Quantitative)
      • 序号(Ordinal):病害分级或好评分级,1、2、3、4、5星。同样,级别之间可以比较大小,但不能表示倍数关系,不能说4星不比2星好(差)两倍。加减乘除也没有意义。
      • 间断值(Interval):温度。严格来说可以加减,但不能乘除。不能说40℃是20℃的2倍温暖。0℃不代表真的0,不是没有数量,而是有温度的。
      • 比率值(Ratio):身高、体重、年龄等。既可以加减、也可以乘除,数值间可以有倍数关系。0表示真正的0,没有数值。可以确定的说2米比1米高两倍。

    可以通过0点是否是真的0来判断是间断值还是比率值。

    离散型变量和连续型变量

    • 离散型变量:有确定的值,且值与值之间有间隙,一般不能取小数。如,汽车的个数,家里孩子的个数。
    • 连续型变量:几乎可以取到每一个值,精确的小数位数取决于测量方法和精度。比如身高、体重。

    独立类和非独立类

    • 独立类:变量值的改变不依赖于其他变量。比如学习时间是独立变量。
    • 非独立类:变量值的变化依赖于其他变量。比如考试成绩是非独立变量,依赖于学习时间。

    一般而言,非独立变量依赖于独立变量,而独立变量不依赖于非独立变量。

  • 世界人口,1985-2150

    1985年

    工业革命过后,世界人口有13亿人,其中亚洲、非洲和拉丁美洲有10亿人;欧洲、北美和大洋洲有3亿人。

    1950年

    二十世纪中叶,全球共有25亿人,其中亚洲、非洲和拉丁美洲有18亿人;欧洲、北美和大洋洲有7亿人。

    2000年

    跨入二十一世纪,全球人口60亿人,其中亚洲、非洲和拉丁美洲49亿人;欧洲、北美和大洋洲有11亿人。

    2050年

    二十一世纪中叶,全球人口达到98亿人,其中亚洲、非洲和拉丁美洲86亿人;欧洲、北美和大洋洲12亿人。

    2150年

    二十二世纪中叶,全球人口下降到97亿人,其中亚洲人、非洲和拉丁美洲人口87亿人;欧洲、北美和大洋洲人口10亿人。

    发展中国家和欠发达国家的人口激增,必须解决粮食问题。

  • 第五章 R语言的缺失值

    我们在记录数据时,经常会遇到缺失值。比如,统计一下全班同学的身高,恰巧有些同学今天生病没来,只记录了姓名或序号,却没有记录身高数值,这就造成了缺失。在R语言中,缺失值有两种形式,一种是NA,另一种是NaN,注意大小写。缺失值在实际统计运算中会对结果造成干扰,因此,在一些运算中需要先删除缺失值或使用补缺失(imputation)的方法,将缺失填充上值,再进行计算,降低对结果的影响。

    NA表示的是测定的时候为空(Missing)或当前值不可用(Not available)。NaN表示无意义的值,比如0除以0(0/0)或者无穷减去无穷(Inf-Inf)。NaN在实际应用中并不常用,而NA在实际应用中非常常见。NA和NaN都是占位符,无意义,无法进行运算。

    可以看一下实例,我们假设记录一个班级同学的身高(height),全班共7名同学(n=7)。

    height <- c(171,165,159,198,146,NA,184) # 其中有一个缺失值

    接下来,我们需要验证我们一共调差了几个同学,用到之前的length()函数。

    length(height) # 查看向量中元素的个数

    [1] 7

    得到的答案是7,也就是我们一共调查了7个人。接下来,我们做一些基本的统计运算,比如计算这几个人的平均身高。还记得求平均值的函数吗?mean()

    mean(height) # 计算平均身高,可以看到,下面的结果是NA,也就是NA对数据的计算造成了干扰

    [1] NA

    那么,我们应该怎么计算带有NA的均值呢?最简单的方法就是将NA去掉,然后再进行计算。R的内置函数中,已经集成了去掉NA的功能,即是用na.rm=T参数先去除数据中的NA再进行计算。

    mean(height, na.rm=T) # 先去掉NA,再计算均值

    [1] 170.5

    在一些高级运算中,没有直接可用的R语言的内置函数,需要我们自己编写代码进行计算。我们该怎样处理缺失值呢?这就要求我们先知道缺失值的位置或个数,然后再进行相应处理。这里我们用sum()函数再算一次均值。

    sumHeight <- sum(height, na.rm=T) # 对所有数据求和

    numberHeight <- length(height)-sum(is.na(height)) # 有效数据数量

    sumHeight/numberHeight # 计算均值

    [1] 170.5

    is.na()是专门处理缺失值的函数,它会得到一个与原向量等长的向量,并标注每一个对应的位置是否为缺失值。我们将sum()函数与is.na()函数连用,可以得到缺失值的个数,这可能很难理解,原因很简单,逻辑值FALSE被视为0,而逻辑值TRUE被视为1;is.na()得到的向量中,NA变成了TRUE(也就是1),非NA变成了FLASE(0),因此,用sum()函数可以求出缺失个数。下面,我们手动去掉缺失值,然后再计算平均值,用到which()函数,用来显示某个值的下标(位置)。

    heightNoNA <- height[-which(is.na(height))] # 将有NA的数据去掉

    heightNoNA <- height[!is.na(height)] # 将有NA的数据去掉

    mean(heightNoNA) # 计算均值

    [1] 170.5

    思考题:

    1. 用is.na()求缺失值个数。
    2. 不使用is.na()求出缺失值的个数。
    3. 写出能将NA下标(位置)显示出来的函数组合。
    4. 组合上面函数,写一行代码,直接算出平均值。
      # mean(height[!is.na(height)])