2017年12月28日星期四

CDC博物馆游记

中午老板赐饭,之后本想搭校车回lab科研。然而校车司机在我面前停下之后,又堂而皇之地开走了。一怒之下我便步行2.5个mile,来到了亚特兰大唯一的一个联邦机构总部:美国疾病预防与控制中心克里夫顿路园区。我原计划在这个小小的博物馆里面转上一个多小时便回去搬砖,谁知道一不小心就一直呆到了闭馆。
该馆面积很小,但是布展技术非常专业,因此信息量非常大。即便如此,还是可以看出CDC完全是把这个博物馆当成“疾控系统光荣历史陈列馆”来建设的。这真是暴殄天物,它本可以被建成世界上最好的公共卫生博物馆,乃至公共卫生主题公园的!人类进二百年来的公共卫生历史的重大事件中,没有一半也得有三分之一与CDC这个二战之后才出现的年轻机构有各种各样的联系。你提到公共卫生的发展历程,能绕开艾滋病么?能绕开禁烟吗?能绕开埃博拉/马尔堡吗?能绕开军团病吗?能绕开消除天花吗?这些故事都有CDC的一个视角。然而目前的展览,像是提出一个关键词,然后懂的人自然懂,不懂的人估计也是两眼一抹黑。我希望它的展览面积扩大为目前的三到五倍,然而讨论的话题压缩到目前的三分之二,这样的话能够把美国公共卫生的故事讲得相当清楚了。
CDC这样一个单位,几十年来一直非常激进地介入别国的公共卫生事务。这让我感觉非常不舒服:一国的国家安全完全把握在他国手中,这还有什么主权可言?然而公共卫生又是关乎基本人权的事业,某些第三世界国家(我这里就不点名了,你们自己心里清楚)确实没有资源,乃至没有决心去建立自己的公共卫生,你CDC不帮人家建的话迟早出现人道主义危机和疫病大流行危机,因而一国的公共卫生问题乃是全球问题,CDC代劳也是无奈之举。我们可以想象,CDC在这里面也渔利不少:不仅积攒了大量的实践经验和科学数据,也有了新临床技术的实验场。目前Emory大学在做的一个Ebola疫苗项目,而CDC之前在西非就有一些同类疫苗的试验性接种了。
但我不是指责CDC违背医学伦理。相反,这样其实是互利共赢的。我们可以说CDC在塞拉利昂设立实验室是居心叵测,但谁又能指责他们野战医院的条件都不如却处理BSL-4样品的Bo中心实验室在疫情巅峰的21天里舍命检测了2700多疑似Ebola样品?我只是嫉妒,我希望中国的公共卫生专家也能在国际舞台上扮演重要角色,也能输出智慧和技能。这是我们走向负责任的大国、强国的必经之路。
CDC违背医学伦理的事情也不是没做过。这学期伦理课我们讨论了Tuskegee梅毒实验事件。我听说这件事的时候震惊到不敢相信,我以为是他们把时间搞错了。通过诱骗的手段进行人体实验历史上并不鲜见,731部队犯下的罪行比这个更加令人发指。然而Tuskegee事件到1972年才结束,这时候不仅是纽伦堡规则提出之后,甚至美国民权运动都已经取得胜利了,居然还有这种事情。有一次我在MegaBus上遇到一位黑人老先生,我们讨论了双方的少数族裔问题,我提到Tuskegee事件的时候这位老先生一度哽咽,差点要哭出来了。(然而这位老先生对华工、排华法案一无所知,还以为华人在美国一直以来都是社会经济地位相当高的少数族裔,我为他进行了科普。)
在美国总统道歉以后,CDC能够正视历史,在博物馆里专门设立一个不起眼的展板,这也是一种进步吧。

下面是Ebola临时展的一些图片

CDC下设机构Viral Special Pathogens Branch在塞拉利昂Bo地区临时设立了一座一线实验室。这一实验室完全是临时搭建的的,下图的牌子即是处理BSL-4样品的核心实验室的门牌。

该实验室的平面图。该图是供当时在CDC总部受训的技术人员使用的。

工作人员在这个实验室工作的照片:来自CDC网站。

Bo Lab的RTPCR核酸高通量提取装置。


CDC专家绘制的塞拉利昂Magazine Wharf地区一个cluster的infection chain。

青岛澳柯玛生产的ArkTek被动制冷式疫苗容器,之前已经有很多媒体报道了,这次近距离接触到这个展品。这一设备正在改变非洲公共卫生事业的面貌。


2017年9月10日星期日

谢宇老师关于中国Gini系数的PNAS文章


(题图:https://www.economist.com/news/china/21570749-gini-out-bottle)

最近开学之后深陷作业的泥潭不能自拔……我选了一位中国工程院(外籍)院士的可持续发展课程,上课就在白板上配平燃烧反应的化学方程式,以及算各种单位换算(误),然后作业题里面让我们名词解释什么是自由主义、什么是民主……
其中一题让我们说明美国和何种程度上是平均主义的,何种程度上不是平均主义的。我想拿收入不平等来做例证,就查了一下美国的Gini系数,于是找到了谢宇老师的这篇旧文。这个文章当时出来的时候引起了广泛的、热烈的讨论,不过我和他们专业隔了太多,就没有找来看。正好刚刚收到通知后天因为刮飓风全校停课,due自然就后推了,我就读了一下这个文章,发现居然非常通俗。
记得2013年我在北大上研究生马克思主义与当代中国课,有一讲是社会学系的一位老师给我们讲中国基尼系数的问题。那个时候谢宇老师(和他在UMich的合作者)的文章还没见刊,但是他讲的基本观点倒是和本文非常重合。

这篇文章说了这么几件事情:
  1. 中国的Gini系数究竟是多少?
题图来自对华并不友好的The Economist,它2013年初引用的官方数据,说2012年中国的Gini系数是0.474,不过它也说有很多人怀疑这个数据。
国家统计局在2000年中断了Gini系数的提供,到2013年突然又提供了历年的数据。这个数据被很多人批评,认为有很严重的偏差。谢宇等人在本文中称,数据偏差的原因包括政治上的以及现实上的复杂困难,所以他也不信。13年那节课上老师引用了一个西南财大的报告,那份报告上对Gini系数的估计高达恐怖的0.611,该老师认为他们的方法有一定偏差。谢宇等人认为这个报告是促使统计局重新公布Gini系数的原因。
然后,本文作者从几份社会调查研究的结果中分析了中国近年来实际的Gini系数变化是怎样的。他们的数据源包括统计局的1%人口抽样调查(2004)、人大的中国综合社会调查(CGSS10/12),和北大的中国家庭追踪调查(CFPS10/12),双鸭山大学的一份调查(2012)和那份西南财大调查(2011)。(这里面CFPS的数据在2016年又帮我赢得一台iPad mini 2,主要感谢队友。)他们的结论是,以2012年为例,这几年的购买平价的Gini系数大概在0.515-0.531之间,不算那个西财的离群值(0.588)的话。
综合联合国大学的研究(UNU-WIDER)、国家统计局的数据等,他们绘制了这样一张图:

红线是他们用LOESS方法做的回归结果,蓝线是美国的LOESS回归结果。
从这个图上可以看出,国家统计局的趋势和若干份社会调查研究表现出的趋势并不一致。

2. 中国的Gini系数是不是在倒U型发展通道中?
所谓倒U型趋势也是2013年那节课上讲过的内容。意思就是,随着社会经济的发展,收入不平等会出现一个先上升再下降的过程。这是Kuznets于1955年提出的一个发展经济学理论。这一部分他们分析了倒U型趋势问题,但我觉得他们的计量工具用的不太漂亮。
他们首先从CIA World Factbook上查到世界各国1995-2012年间的人均GDP(购买力平价)和Gini系数,并以人均GDP为对数横坐标,Gini系数为纵坐标描绘出来,最后再用关于人均GPD的对数的二次函数去拟合Gini系数,发现果然是一个上凸的图像。我就不明白这个二次函数的函数原型他们是如何选择的,感到无语。
在这张图上重叠放置上面那张图,得到的效果就是这样的:

可以看到,中国和美国现在都处在拟合曲线的上方。只是中国有一个恐怖的overshoot趋势。但我觉得这个图的问题在于,经济发展毕竟是主观能动的,不是决定论的,所以外推无意义——但是我见到这张图就忍不住脑补外推是什么样的。灰度预测也只是一个合理化的猜测,并不保证效果。我想,一个改进的办法是只看发达经济体的历史数据,把横坐标换成历史人均GDP占现在人均GDP的比例,可能更有说明力一些——不过我不知道发展经济学上是不是有什么标准化的方法。

3. Gini系数的影响因素探讨和中美差异比较
他们说先从社会调查中抽提出了一系列反应地区、城乡类型、受教育程度、种族/民族和家庭结构的变量,然后对这些类别分别建立了对于家庭人均收入的线性回归模型:

其中Yi是第i个家庭的人均年收入,Xi是自变量,β是系数向量,εi是残差。
他们用各组R^2来表征该因素对总体趋势的贡献,这个指标成为“双边R^2”。看起来是非常朴素的思想。

可以看到,在美国,地区和城乡与家庭人均收入的回归优度是很差的,而中国这两个因素非常显著。美国单亲家庭的导致了家庭结构在收入不平等上起到了重要作用,而中国的影响却不大。
他们又用全部指标对人均收入做了一个多元回归,并每次剔除上面的一类指标,计算残余的R^2值。他们把这个称为部分R^2,并用这个指标进行鲁棒性的分析,发现依然反映了上述结果。

最后,谢宇等人分析,改革开放以来中国的收入不平等急剧增长。中国人认为经济发展必然伴随收入不平等的扩大,以及随着经济的进一步发展,收入不平等将会减小这样的说法不仅是历史的经验,也有社会学规律的作用。
我的一个反思就是,本文利用的数据都是公开的,没有自己做田野研究。我甚至有其中CFPS的授权。他们的统计手段也不见得高端,要让我还原他们的代码也似乎并不难,SPSS的话都不用写代码。我读这个文章的时候就有一种读数学建模比赛优秀论文的体验。
我们常说谁拥有了数据谁就拥有了一切。但是真的把数据拿手上,就开始考验学术视角了。

2017年4月16日星期日

燕园生灵其三:家燕

从演化的角度看,人类文明的历史曾不能以一瞬。但在这短短数千年间,智人这一个物种对于生物圈和生物多样性的影响却相当显著。这种人与生物圈的相互作用为人类的生存和发展提供了充分的条件,也改变了其他物种的遗传特性和行为规律。这样的例子不胜枚举。
今天我们讲到的“家燕”就是这样一个和人类活动紧密相关的动物。它的学名是Hirundo rustica,同样是由分类学祖师爷卡尔·冯·林奈(Carl von Linné)亲自命名的。这个属名的来源有两种说法,一说来自拟声词hirrio,因为叫声而得名;另一说来自harundo,意为苇草或长矛,因其尾羽形状得名。至于家燕的种加词rustica,则是乡村的意思。
家燕的形象已经比较深入人心了,在这里我无需过多描写。不过值得注意的是,家燕也并不是儿童画上简单的黑白两色,而由于个体差异会呈现不同的蓝黑色背部,且前胸,下颔也往往有栗红色的羽毛。其最具特征性的便是它分叉的尾羽了。常和家燕混淆的是金腰燕,后者的鉴别依据是颜色更加鲜艳的腹部,和胸前的纵纹。

让我们首先从家燕的名字谈起。我们是说到这种动物在世界各地都有出现,那么不同地区的人们是怎样称呼这一物种的?家燕拉丁文学名的种加词rustica,是乡村的意思,和英语词rural有相同的渊源。在英语中,它叫barn swallow,有人说是因为它们在谷仓筑巢的行为而得名的。在法语中,它叫hirondelle de cheminée,壁炉燕。在德语中它叫RauchschwalbeRauch-是烟雾的词根。维基百科说,在过去的几个世纪里,“烟燕”一直在墙壁的缝隙中进进出出,穿梭在炉火的烟雾中。一本1777年的《年轻人的自然科学》(Naturlehre für die Jugend: Zweyter Band, bei Johann Jacob Ebert, 1777)上解释道,叫这个名字的原因是家燕会在厨房和烟囱处筑巢。
有什么鸟比“燕”更深入的渗透进中国人的文化传统中了。“燕”是一个象形字,其字形上可追溯到甲骨文:

这里其分叉的尾羽被十分鲜明的用文字描绘出来。到了小篆,燕的形象便更加抽象也更加接近当今的字形了(图片来自国际电脑汉字及异体字知识库,“中央研究院”)。
早在《诗经》中,燕的形象就已经出现了。
燕燕于飞,差池其羽。之子于归,远送于野。瞻望弗及,泣涕如雨。
燕燕于飞,颉之颃之。之子于归,远于将之。瞻望弗及,伫立以泣。
燕燕于飞,下上其音。之子于归,远送于南。瞻望弗及,实劳我心。
仲氏任只,其心塞渊。终温且惠,淑慎其身。先君之思,以勖寡人。
——《诗经·邶风·燕燕》
自此,燕这个意象就贯穿了中国文学史。有王谢堂前世态冷暖的燕,有春日里忙着啄新泥的燕,还有落花时节双飞虐狗的燕。
梁上有双燕,翩翩雄与雌。衔泥两椽间,一巢生四儿。四儿日夜长,索食声孜孜。青虫不易捕,黄口无饱期。觜爪虽欲敝,心力不知疲。须臾十来往,犹恐巢中饥。辛勤三十日,母瘦雏渐肥。喃喃教言语,一一刷毛衣。一旦羽翼成,引上庭树枝。举翅不回顾,随风四散飞。雌雄空中鸣,声尽呼不归。却入空巢里,啁啾终夜悲。燕燕尔勿悲,尔当返自思。思尔为雏日,高飞背母时。当时父母念,今日尔应知。
——白居易,《燕诗》
白乐天则对燕的育雏过程大发慨叹,讲了一个伦理的寓言。但不知有没有人注意到,这首诗中对于育雏过程的观察倒是和现代生态学家的繁殖生态学研究具有非常重合的视角!
在物候方面,我国积累了较为完整的家燕迁徙时间物候记录,目前仍能查到很多相关的论文。在考古方面,著名的“马踏飞燕”铜像踏的究竟是什么鸟目前仍有争议。另一个有意思的是一种两千多年前的“桌游”:“乌尔王族局戏”。根据大英博物馆对于一块巴比伦石板的译读,发现这个桌游里面有一个角色就是家燕。
家燕和人类的相互作用远不止文化意义上。对家燕来说,人类的住宅为它们提供了理想的筑巢场所。我经常听曾在农村生活的同学讲述燕子的故事。一般在中国农村,燕子在家中筑巢是被视为非常吉祥的事情,这一家人也都会保护燕子的巢。燕子有恋巢的习性,来年迁徙回来还有可能会回到同一处地点筑巢。
但是由于农村住房的升级,新楼房没有燕子筑巢的条件,伴随当地燕子的数量锐减。这种人与自然的矛盾,发展与生态的矛盾如何解决,大概要靠我们这代人的创造力和聪明才智吧!

家燕在北大并不算罕见,但出现的频率远远比不上另一种“燕”——雨燕科的普通楼燕。我在北大并没有观察到家燕筑巢的现象,但是我早先在南开大学的时候,曾见过几只家燕在校园里面筑巢育雏。

家燕是圆明园的常见鸟类,但在北大,“家燕仅在夏末秋初出现大群, 这可能与园内缺乏家燕喜好的营巢场所和开阔觅食地有关。”[闻丞等,北京大学燕园鸟类组成,北京大学学报(自然科学版),2014:50(3), 416-428]

2017年4月5日星期三

燕园生灵专栏其二:普通楼燕

按照日历的排班表,这个物种叫本来叫“北京雨燕”。这种在整个亚欧大陆温带地区都不太罕见的鸟非常幸运的从分类学祖师爷瑞典人卡尔·冯·林奈(Karl von Linnaeus)那里获得了自己的学名:Apus apus。1758年,成为林奈双名法之蓝本的《自然系统》一书,记录了普通楼燕的名字。
普通楼燕有两个亚种。其中林奈描述的现被称为欧洲亚种 A. apus apus。而另一个亚种则牵扯到另一个和中国渊源深厚的英国博物学家Robert Swinhoe(常译为郇和)。我们对这个帝国主义侵略者兼优秀的博物学家怀着复杂的感情,但必须承认在中国(“现代”)鸟类学研究的历史上,他扮演了极为重要的角色。普通楼燕北京亚种 A. apus pekinensis 就是他在1870年发表的,其模式标本采集于北京。
普通楼燕和我国常见的白腰雨燕 A. pacificus 同属雨燕属,该属和因为燕窝而遭受厄运的金丝燕同属雨燕科(Apodidae)。在上级的分类单位有些小的争议,有雨燕目(Apodiformes)和夜鹰目(Caprimulgiformes)两种观点。2014年年底,Science 上发表了划时代的基于全基因组分析的鸟类演化树工作(E. D. Jarvis, et al. Science 346.6215: 1320.),他们对北美的雨燕科动物烟囱(褐)雨燕 Chaetura pelagica 的测序结果表明,雨燕科在演化上的近亲实际上是蜂鸟,而夜鹰和它们二者具有共同的祖先,与其同被归为夜鹰目。
图X:普通楼燕的相关类群。图中没有展示全部物种和分类阶元,各分支未必单系,仅作说明使用。

图1:普通楼燕的相关类群。图中没有展示全部物种和分类阶元,各分支未必单系,仅作说明使用。
普通楼燕是一种擅长飞行的鸟,一般是在空中观察到,因而难以分辨它的细节。当看到一群翼展修长的鸟以优雅的姿态疾速飞过,配合很容易分辨的高频叫声,就能准确无误的识别出这种城市中并不罕见的夏候鸟。一般观察飞行的普通楼燕也就只能看出一个剪影来,再仔细分辨一下可以看到分叉的尾羽——这大概是它名字里面带有“燕”的原因之一。据说北京风筝的最经典形状——沙燕儿,就是取自普通楼燕的形状,从剪影看来还真颇有几分相似。
图X:普通楼燕的剪影。

图2:普通楼燕的剪影。根据CC BY-SA-2.0 修改自Wikimedia,原始文件来自Flickr ,本图像以相同证书共享。
关于普通楼燕不得不指出的是,它们的有特殊的爪,为了适应攀缘而特化成四趾全向前的前趾足形式。一般认为正是这种足型导致了雨燕无法直接从地面起飞,而只有攀附在垂直的壁面上才能正常飞行。普通楼燕和白腰雨燕的鉴别方法,一方面是白腰雨燕的体型要大一些,另一方面是白腰雨燕常能在腰间看到白斑,而普通楼燕一般只有头部是白色的。

普通楼燕是擅长飞行的鸟类。它们飞行姿态优雅,飞行速度极快,但是最令人印象深刻的是他们的长距离迁徙。
在北京,每年这个季节普通楼燕突然开始出现,继而很快成为一种常见的物种。到了盛夏时节,这种鸟却突然从北京的天空中消失,直到来年春天再次出现。这段时间北京的普通楼燕去了哪里?
我前不久在美国亚特兰大市Emory大学图书馆里找到了一本1933年前后该校学生做的候鸟记录,其中详细记载了约150种候鸟在Emory附近春秋两季的最早和最晚的记录日期。这本由三位后来均成为科学家的本科生和一位当地的观鸟老手共同编写的名录中并没有普通楼燕的记录,但如果这样的名录能覆盖全球,我们的问题就能以在一定程度上得到解答。这愿望自然是不现实的,但好在我们有数据库的帮助。
eBird是奥杜邦协会和康奈尔大学共同建立的观鸟记录数据库,任何人都可以建立账号上传他们在全球范围内的观鸟记录。这些记录将会经过计算机和专家的审核并存储在服务器中,任何人都可以获取这些信息。有人告诉我eBird上目前的数据量大约是2.5亿条。有这些“大数据”的支持,我们就可以在全球范围内搜索普通楼燕了。
我首先把eBird数据库中跨度八十多年的观鸟数据中,所有出现过普通楼燕记录的地点绘制在地图上。这个样子基本和鸟类学家绘制的普通楼燕分布范围图一致——实际上从Wiki上找到的这张图问题也很多,但大体上是差不多的。eBird的最大弱点是,那些观鸟活动开展多的地方,比如欧洲,会有很密集的记录。但国内,特别是中西部地区,以及俄罗斯远东地区、印度北部、撒哈拉地区等人口稀少、观鸟活动开展不多的地方,数据就非常少了,甚至还有大片的区域完全没有提交过观鸟记录。
图X:eBird上的普通楼燕分布范围与维基百科上分布范围的比较。

图3:eBird上的普通楼燕分布范围与维基百科上分布范围的比较
下一步就要像Emory的观鸟少年一样,对数据做时间尺度的分析。我首先按季节把记录分成了四组,用不同的颜色绘制出来。
图X:不同季节普通楼燕的分布。

图4:不同季节普通楼燕的分布
这张图像显示,在北京的春夏季节,普通楼燕会出现在欧洲、中东一直到中国的华北地区。而北京的秋冬季节,普通楼燕会向非洲大陆迁徙。至此我们发现,普通楼燕的越冬地,可能在南半球。但我们还不确定它们迁徙的具体过程。为了详细了解这一过程,我们可以把时间的分辨率调高。于是我制作了这张按月分布的动图。
图X:不同月份普通楼燕的分布。

图5:不同月份普通楼燕的分布
这张图显示,在二三月间,普通楼燕会出现在地中海沿岸、中东地区以至于南欧。到了四月,中国和除了北欧以外的欧洲大部就都出现了普通楼燕的身影。五月到七月之间,普通楼燕的活动范围遍及整个欧洲和东北亚、中亚地区,同时撒哈拉以南的非洲几乎没有记录。八月间,亚洲和欧洲普通楼燕的记录变得稀少,东非重又出现了普通楼燕记录。九月,中亚和东亚已经没有记录了。十月开始到一月,记录又多出现在撒哈拉以南的非洲地区,特别是观鸟记录比较丰富的南非。
鸟种记录的变化给了我们普通楼燕迁徙路线的一些线索,但是还有太多问题是我们不清楚的。能否像化学里的单分子研究那样,聚焦单一动物个体的行为,而不是群体的总体行为呢?传统上,我们依靠环志工作来获取这方面的信息。幸运的是,一种新技术的出现可以使我们更高效的追踪一只鸟的飞行轨迹,那就是光学位置传感器。这种传感器最小的不到一克,一般的也只有几克。它可以被固定在鸟类身上,在鸟类飞行过程中探测光照的变化,从而确定日夜长度,进而应用特殊的算法确定所处的经度和纬度。
图X: 固定了光学位置传感器的普通楼燕。Terry Townshend拍摄。

图6:固定了光学位置传感器的普通楼燕。Terry Townshend拍摄。
这种技术已经率先应用于普通楼燕欧洲亚种的研究当中。今年一篇文章(L.B. Jacobsen, et al. Animal Biotelemetry 5.1:4)介绍了2010年前后丹麦科学家对于三种鸟类的跟踪数据,其中就包括普通楼燕。本文采用开放获取模式,数据可供下载,于是我摘取了一只典型普通楼燕的迁徙路线绘制出来。另一篇早先的研究(S. Åkesson, et al.PLoS One 7.7:e41195.)也给出了相似的结果。
图X:文献报道的普通楼燕从欧洲开始的迁徙路线。

图7:文献报道的普通楼燕从欧洲开始的迁徙路线。数据通过CC-BY-4.0 协议获取,原文引用如图所示。
这只普通楼燕进入几内亚湾后有些数据异常,所以我删除了一部分数据。另外在刚果盆地附近过冬时,怀疑是传感器信号不甚稳定,造成纬度偏差较大,因此我删除了2011年2-4月的全部数据。这究竟是探测器失灵,还是普通楼燕的独特迁徙行为,我还不清楚。
从数据中可以看出,2010年7月-10月,这只普通楼燕欧洲亚种沿着非洲西部,跨越几内亚湾达到撒哈拉以南的刚果盆地附近,并在此越冬。来年5月则回到了出发地尼徳兰地区。
到这里,我们还是没有完整的回答一开始提出的问题,那就是北京的普通楼燕到底迁徙去了什么地方?这个问题曾困扰人们多年,直到2015年,北京观鸟会等单位合作进行的“北京雨燕项目”取得初步成果之时,答案才初步揭晓。一篇在我朋友圈中刷屏的文章介绍了很多相关的信息。这一项目的重要意义不仅在于跨国、跨地区的合作科研,更在于提高当地公众对于鸟类研究的参与度,进而提高公众对本土鸟类的保护意识。
该项目的地点选在了颐和园廓如亭,因为普通楼燕有依恋旧巢址的习性,当年在此地安装探测器的鸟,次年还很有可能回到原地。项目开始的2014年,工作人员在颐和园安装了31个定位器。2015年雨燕回来后,他们回收到了其中13个。
图X:工作人员释放安装定位器的普通楼燕。左图中可以看到普通楼燕背后的传感器,右图中可以看到普通楼燕白色喉部的典型特征。Zhang Weimin拍摄。

图8:工作人员释放安装定位器的普通楼燕。左图中可以看到普通楼燕背后的传感器,右图中可以看到普通楼燕白色喉部的典型特征。Zhang Weimin拍摄。
这组数据让我们对普通楼燕北京亚种(或者我们更喜欢称其为北京雨燕)的迁徙过程有了更加深刻的认识。初步的数据中,我们可以看到,普通楼燕北京亚种从北京出发后,沿着蒙古高原-天山山脉附近-中亚地区画出一个漂亮的弧线,并从波斯湾附近穿越阿拉伯半岛进入非洲大陆。这时候有的鸟还会在里海附近逗留。在之前关于欧洲亚种的研究中,中东地区的数据很少,结合eBird的迁徙趋势来看这里的普通楼燕很可能是北京亚种为主。经过红海后,这些普通楼燕分成了两拨:一部分在更靠近地中海的撒哈拉沙漠停留,另一部分在撒哈拉沙漠以南的刚果盆地附近停留。
接下来一段时间数据的质量不太好,具体原因我还不清楚。但随后这些普通楼燕的记录就出现在了非洲西海岸和南非高原附近。接下来它们在南非停留了很久,可以想见是在越“冬”。突然又到了迁徙的季节,这群鸟从东非开始沿着相差不多的路径再画了一个大弧线,次第回到了我们熟悉的城市——北京。
图X:北京雨燕项目的初步数据。由 Lyndon Kearsley 提供。
图9:北京雨燕项目的初步数据。由 Lyndon Kearsley 提供。
这一数据和eBird观鸟记录的月度变化数据结合起来,就使我们对普通雨燕的迁徙过程有了更深入的认识。这个过程中,我们见证了技术的革命对于鸟类研究的重要促进作用,也看到了公民科学家对于海量科学数据聚沙成塔式的贡献。通过这些工作,我们认识到普通楼燕迁徙过程中一些有趣的事实:
  1. 欧洲亚种和北京亚种的迁徙轨迹明显不同,但它们的越冬地却都是非洲南部。
  2. 虽然同一亚种不同个体开始迁徙的时间并不同步,但他们的迁徙路线较为近似。
  3. 北半球夏季时,同一个体有很大几率在同一地点出现(并被重捕)。
  4. 向南迁徙的过程一般要比向北迁徙的过程历时更久。
  5. 普通楼燕在非洲越冬时间比在北半球的时间要长。
  6. 在所有利用地理位置传感器的研究中,总有一段时间信号出现奇怪的特征,且这种情况发生的位置靠近赤道——这正是非洲观鸟数据十分缺乏的地区。这段时间究竟发生了什么,可能还需要专家的分析或者更详细的研究。
至此,普通楼燕去了哪里似乎已经比较清楚了。但关于这个神奇的物种,还有很多我们不了解的。去年年底刚刚见刊的一篇Current Biology文章(A. Hedenström, et al. Current Biology 26.22: 3066.),发现普通楼燕在迁徙过程中,个别个体甚至可以10个月不落地!因此我们也不难理解为什么早先的环志工作没能得到清晰的普通楼燕迁徙信息——它们根本就不落地,人类如何回收环志呢?也多亏了公众参与的观鸟数据库与地理位置传感器的研究,才能使我们更深入的认识鸟类迁徙规律。

我本科在南开大学能看到大量的普通楼燕。据说南开大学八里台校区附近的复康路立交桥是南开区普通楼燕的大本营,这些鸟类经常结成大群出现在附近的南开大学和水上公园。
在北大,普通楼燕仍然是观鸟记录中非常稳定的一项。根据闻丞等人的《北京大学燕园鸟类组成》(闻丞 等,北京大学学报(自然科学版),50.3: 416),普通楼燕是燕园鸟类调查中平均遇见率第五高的鸟类,且在4-7月为优势种。夏季在静园以北到红湖一带,每到早晚都会看到大群的雨燕上下翻飞,听到呕哑嘲哳之声此起彼伏。它们以轻快的速度盘旋在天空中,不时钻进燕园古建筑的构件之中。

Bonus

这一段无关普通楼燕,但我在搜集资料过程中看到了eBird所在的康奈尔鸟类学实验室发表的一篇利用eBird数据研究鸟类迁徙的工作非常具有启发性(F. La Sorte, et al. Proceedings of the Royal Society B 283.1382:10.1098/rspb.2015.2588 )。他们研究的情况比普通楼燕要简单得多——他们研究的是在美洲大陆进行周期迁徙的鸟类。之所以说这种情况比普通楼燕简单,一方面是因为这里几乎不存在普通楼燕这样空间跨度极大的两支分流的情形,另一方面是因为几乎整个美洲大陆的观鸟数据都足够充分。
他们在自己的网站上展示了118种鸟类迁徙路径的动画。图中每个圆点代表一种鸟类的“分布重心”。更严谨的说,他们把一年当中每日的观鸟记录离散化的表示在GIS网格之中,构成了时间-空间维度的数据集。再用GAMLSS模型对这个数据集进行拟合,得到一条三维空间中的曲线。圆点就是这条曲线在空间坐标上的投影点。利用这样一个聪明的技巧,他们将美洲候鸟的迁徙规律清楚的可视化了出来。
图X:康奈尔鸟类学实验室绘制的美洲鸟类迁徙路径。

图10:康奈尔鸟类学实验室绘制的美洲鸟类迁徙路径。经作者允许,复制自 All About Birds 网站。
看了这篇工作我的体会是,在数据科学水平突飞猛进的今天,高质量的公众科学数据将会对科学本身的发展带来新的机遇。如果你已经准备好推动人类对自然认知的极限,那么请积极的向公众科学数据库贡献你高质量的观测记录。

2017年3月19日星期日

远东山雀与环形种


远东山雀(Parus minor)是雀形目山雀科山雀属的鸟类。远东山雀和我们已经或即将介绍的沼泽山雀、黄腹山雀同属山雀属(亦有分类系统依据分子证据和单系群原则将沼泽山雀归入Poecile高山山雀属,将黄腹山雀归入Periparus煤山雀属[1]),而与大家喜闻乐见的长尾山雀科的银喉长尾山雀分属不同的科。分子证据证实,山雀科和长尾山雀科的亲缘关系倒是很近[2]。

图1:几种山雀和相关鸟类的系统发育。改编自参考文献[2]。学名和该参考文献保持一致。

远东山雀个头比树麻雀还要小,但是和沼泽山雀、黄腹山雀等比起来又略大。远东山雀特征性的配色是黑-白-绿。第一个令人印象深刻的特征是它脸颊的大白斑,这是远东山雀和大山雀(P. major)共有的特点。这块白斑之外,远东山雀的头是黑色的。有时可以看到远东山雀的绿色后背,但也有的个体后背颜色不甚明显。它的飞羽颜色斑驳。远东山雀最重要的鉴别特点是它的“拉链”——《北京鸟类志》描述:“上胸及腹部白色,中央贯以宽阔的黑色纵斑带。”[3]这个特征非常明显其稳定,一眼就可以将它同沼泽山雀区分开。经验丰富的观鸟者可以通过这条拉链粗略推测远东山雀的性别,因为雌鸟的拉链一般略窄。除了拉链,腹部基本是白色的。

2015年11月1日,我第一次在eBird数据库上报道了我在燕园内的鸟类观测记录。但不久之后,我却被eBird的志愿者告知记录有问题。原来,在eBird使用的Clements分类系统中,我们常见的乌鸫普通亚种Turdus merula mandarinus被提升为种T. mandarinus,而大山雀的东北亚种Parus major minor被提升成了P. minor种,其中文名就是远东山雀,英文名是Japanese tit。

这是我第一次知道,我们常见的“大山雀”其实并不是大山雀。就这样在北京随处可见的普通鸟类,它的身份居然一直存在争议。它是一个种还是一个亚种?它应该归入什么类别?本文遵循主流分类系统的认识,承认P. minor种的地位,下面将简单介绍这个认识在我国是如何演进的。

我国传统的鸟类分类学主流观点将这种鸟认作是大山雀P. major的亚种。我国鸟类学的前辈大师郑作新先生在不同历史时期编写过几套反映中国鸟类分类认识的巨著。在1958年的《中国鸟类系统检索》[4]及其1964第二版[5]中,P. major包含七个亚种,现在这些亚种很多被归入了现代分类系统中的P. minor之下。我们今天讨论的山雀被作者归为P. major artatus。在2002年的第三版中,P. major只有北方亚种有所微调,所调整的亚种对应于现代分类系统中的P. major[6]。

然而在其它一些鸟类文献中,我们经常看到旧体系中对于该鸟的另一个称呼,P. major minor,也就是认为这种鸟是在大山雀(P. major)这个种下面的minor亚种。在郑先生1987年的著作《中国鸟类区系纲要(英文版)》中,有一条脚注引起了我的注意[7]。这条脚注引用了一篇1950年的法文文献,声称P. major artatus“可能是”('may be')P. major minor的异名[8]。赵正阶先生的《中国鸟类志》对这一异名问题有很详细的讨论[9]。原来P. major artatus是由美国人根据湖北宜昌采集到的标本定名的。在发表该亚种的文章中,原作者将其与P. major minor进行了详细的形态对比,说明二者是不同的亚种[10]。而那篇法文的文章则声称P. major artatus只是P. major minor的同物异名[8]。而郑作新后来的著作中似乎误读了原文,他把P. major artatus当作了正式名,而P. major minor却成为了异名[11,12],而且他仍坚持使用前者作为亚种的名称。受他的影响,国内多将这个亚种的名字称为P. major artatus,而国际同行则多称为P. major minor

所以在熟识这种鸟多年以后,我仍按照观鸟前辈们的习惯,称它为“大山雀”也不足为怪了。虽然中文互联网上的资料仍然在几个亚种之间纠结,国内的业余观鸟者倒是越来越接受“远东山雀”这个新名字了。现在,国际和国内的鸟类学者、观鸟爱好者的共识是,“远东山雀”不应该被视作P. major的一个亚种,而应该被作为独立的种。这种认识上的变化是怎么来的?正如很多分类学上的变动一样,最简单的答案是:新的分子(遗传学)证据表明……

自达尔文以来,演化生物学家就一直面临着一个困难,那就是如何定义种。搞不清这个问题,种的起源和演化就缺乏一个清晰的逻辑框架。一类广为流行的种的界定标准基于“生殖隔离”,把基因交换和有性繁殖作为界定种的关键标准。这种定义取得了很大的成功,但也有一定问题,比如对无性生殖的物种就不太适用。因此还有人以基因差异和演化为核心构建种的概念。[13]

环形种的问题,也是生殖隔离类物种定义遇到的一个困难。下面是一个完全虚构的例子:2015年我们在北大本部发现并命名了一种仅存在于燕园的动物Phallus parvusia Peiyangii,简称DXP。虽然这个DXP种群丰富了燕园的智商多样性,但是为了保护其它本土种,我们将一部分DXP逐出了燕园,只剩个别残余。这群背井离乡的DXP只好四处迁徙扩散,主要向两个方向:一部分向五道口东扩,另一部分往颐和园北扩。DXP移动能力很差,繁殖一代它们的分布范围只能扩散几米。在已经有DXP分布的地方,邻近的DXP种群自然是可以相互交配繁殖的。很多代之后,东扩的DXP分布范围遍及东升乡,而北扩DXP的分布范围也跨越了中关村北大街。终于,两路本是同根生的DXP在清华园里会面了。这时候它们发现,东路和北路两支DXP虽然都分布在同一个清华园中,但他们之间却不能繁殖出可育的后代!

图2:Phallus parvusia分布与扩散(假想图)

至此,我们是否可以说这两种DXP已经不是一个种了?似乎是可以的,因为它们毕竟已经产生了生殖隔离。似乎又是不行的,因为这两种DXP之间虽不能杂交,但仍可以通过上图中绿箭头的方向发生间接的遗传物质交流。

这种情况在自然界中并不鲜见,这就是所谓的环形种。基因交流的通道在地理空间上几乎构成了一个环——只是在接触区出现了缺口。早在1905年,Stanford大学的David Starr Jordan就在Science上发文提出了环形种在地里隔离与新种产生方面的重要意义[14]。从此,环形种的研究成为了演化生物学和分类学中的一个热点议题。

远东山雀的分类学困难,看似是形态学上的混乱,但其本源实际上就是这种基因多样性谜题。在我根据eBird数据库中记录所绘制的山雀属部分种的分布图上看,P. majorP. minor加上P. cinereus这几种鸟,围绕着青藏高原构成了一个环。注意这张图上一些种间分界线受到记录整理方面的人为因素影响,同时由于eBird是一个在我国不甚流行的观鸟记录数据库,在没有人提交观鸟记录的地点是没有信息的。

图3. eBird数据库中Parus属三种鸟的记录分布

环形种的概念是否适用,几代专家提出了很多针锋相对的意见。早在1928年,即有人在阿穆尔河下游的major/minor接触区同时观察到现在称大山雀和远东山雀的两种鸟。但关于这两种鸟是否能“通婚”,不同人有不同的看法。如果能够“通婚”,那就说明存在基因交流,环形种不成立,这两类鸟属于同种不同亚种。如果不能“通婚”,说明这两种生殖隔离的鸟已经可以算是分属不同的种了[15]。2004年,德国美因茨大学一位博士在其学位论文课题中对这个问题进行深入的考察,结合了蛋白序列比较、形态学研究和声音分析,最终确认了环形种的成立——尽管存在着小范围、不常见的“通婚”情形,总的来说P. majorP. minor两类鸟并不能发生有效的基因传递。[16,17]本文被分类学家广泛接受,也成了确立P. minor独立种地位的主要依据。不过后来仍有人通过mtDNA测序的有力证据对这一结论提出质疑。

山雀属是一类擅长鸣叫的鸟类,其鸣声与求偶密切相关。鸣叫除了展示性成熟、交配能力等,也是吸引雌性的手段。鸣叫如同暗号,对不上的话就没有交配权,从而产生生殖隔离。所以,研究鸣叫可能比研究蛋白和核酸的序列更直接的反映出物种差异。日本综合研究大学院大学的铃木俊贵曾在远东山雀的鸣叫方面做出了一些工作。将鸣叫的录音进行频率分析,就可以将声音转化成谱图,得到特征性的“声音指纹”。

图4:大山雀的不同叫声组合。根据CC-BY-4.0协议摘自参考文献[18],未经修改。

通过这些研究,铃木得到了很多有趣的结果。他首先证实了鸟类的语言不仅有“词汇”,还有“语法”:将各种鸣声组合(“词汇”)按不同顺序(“语序”)播放,会引起远东山雀不同的反应[19]。他还发现在远东山雀孵卵过程中,亲鸟对于不同的警示性鸣声也会做出不同的反应,这说明鸣声和危险等级是有关系的[20]。这些远东山雀的研究揭示出,鸟类的“语言”可能比我们原先想象的要复杂。

下面是一段儿远东山雀的叫声,你能知道它在说些什么吗?


图5: Parus minor commixtus叫声频谱图,来自http://www.xeno-canto.org/61847。根据CC BY-NC-ND 2.5协议。

请放心加载播放器脚本。


远东山雀被称为北京最常见的山雀[21]。在2014年发表的《北京大学燕园鸟类组成》一文中,大山雀在北大燕园内的遇见率要低于作为优势种的黄腹山雀和沼泽山雀,属于常见种[22]。该文章依从《中国鸟类分类与分布名录(2011)》的分类系统,将远东山雀归为大山雀的亚种。

最新版IUCN红名单遵照BirdLife的分类系统同样将远东山雀合并到大山雀中,并将该种评价为最低受威胁级别,无危。远东山雀在北京一些地区的方言中又被称为“吱吱黑”,这个名字来源于它鸣叫的声音。在校园中凡有远东山雀鸣叫之处,皆能找到其踪迹。

我有一次在校园北部,中国社会工作研究中心门口的台地上看到很多鸟,其中包括了好几种山雀。这个时候还偶遇了商务印书馆一位观鸟的大叔,他曾在北大生活多年,和我聊了一会儿北大的山雀。此处说的大叔并不是灭雕灵大叔。

另一个我经常路过并且能看到远东山雀的地方是燕南食堂和哲学楼之间的长着紫藤的“破支架子”附近(典出Ingress)。那里经常可见远东山雀和沼泽山雀,由于遮挡较小,往往不需要望远镜就能清楚的看到有什么鸟。燕南园里面也时有远东山雀出没。

致谢:感谢黄瀚晨同学在鸟类学文献方面的重要讨论。

[1] Johansson U S, Ekman J, Bowie R C K, et al. A complete multilocus species phylogeny of the tits and chickadees (Aves: Paridae)[J]. Molecular phylogenetics and evolution, 2013, 69(3): 852-860.

[2] Tian H, Zhang Z, Yan H, et al. Molecular phylogenetic analysis among species of Paridae, Remizidae and Aegithalos based on mtDNA sequences of COI and cyt b[J]. 2010.

[3] 其侃. 北京鸟类志[M]. 北京出版社, 1988.

[4] 郑作新. 中国鸟类系统检索[M]. 科学出版社, 1957.

[5] 郑作新. 中国鸟类系统检索(第二版)[M]. 科学出版社, 1964.

[6] 郑作新. 中国鸟类系统检索(第三版)[M]. 科学出版社, 2002.

[7] Tso-Hsin C. A synopsis of the avifauna of China[M]. Science Press, 1987.

[8] Delacour J, Vaurie C. Les mésanges charbonnières (révision de l’espèce Parus major)[J]. Oiseau Rev. Fr. Ornithol, 1950, 20: 90-121.

[9] 赵正阶. 中国鸟类志[M]. 吉林科学技术出版社, 2001.

[10] Thayer J E, Bangs O. Descriptions of new birds from Central China[M]. Museum, 1909.

[11] 郑作新. 中国鸟类种和亚种分类名录大全: A complete checklist of species and subspecies of the Chinese birds[M]. 科学出版社, 2000.

[12] 郑作新. 中国鸟类分布名录[M]. 科学出版社, 1976.

[13] 洪德元. 生物多样性事业需要科学, 可操作的物种概念[J]. 生物多样性, 2016, 24(9): 979-999.

[14] Jordan, David Starr. "The origin of species through isolation." Science (1905): 545-562.

[15] Kapitonova, Smirenskii, Selivanova, et al. The history of ranges of the great tit (Parus major) and Japanese tit (Parus minor) in the Amur Region[J]. Biology Bulletin, springer, 2011, 38(9): 912–926.

[16] Paeckert M, Martens J, Eck S, et al. The great tit (Parus major)–a misclassified ring species[J]. Biological Journal of the Linnean Society, 2005, 86(2): 153-174.

[17] Päckert M. Differenzierung von Reviergesängen und mitochondrialem Cytochrom-b in drei ausgewählten Singvogelgattungen (Aves, Passeriformes: Genus Regulus, Genus Seicercus und Parus major)[D]. Mainz Univ, 2003.

[18] Kvist L, Martens J, Higuchi H, et al. Evolution and genetic structure of the great tit (Parus major) complex[J]. Proceedings of the Royal Society of London B: Biological Sciences, 2003, 270(1523): 1447-1454.

[19] Suzuki T N, Wheatcroft D, Griesser M. Experimental evidence for compositional syntax in bird calls[J]. Nature communications, 2016, 7.

[20] Suzuki T N. Assessment of predation risk through referential communication in incubating birds[J]. Scientific reports, 2015, 5: 10239.

[21] Townshend, T. 北京常见鸟类指南[OL], (2015-07) [2017-01-28]. https://birdingbeijing.files.wordpress.com/2015/08/e58c97e4baace5b8b8e8a781e9b89fe7b1bbe68c87e58d971.pdf.

[22] 闻丞, 韩冬, 李晟, 等. 北京大学燕园鸟类组成[J]. 北京大学学报 (自然科学版), 2014, 50(3): 416-428.

2017年3月17日星期五

Malvern ZetaSizer Visualizer, a tool to plot the exported data from Malvern DLS

Many labs own Malvern ZetaSizer products, but the data export is always a problem. Nobody loves the low-resolution original output images and the built-in tool to automatically export the data is generates terrible results.The general method of exportation can be found in the user manual, and it is described in Chapter 11. You can follow this link to obtain a full text.

However, for size measurement, you can actually export a "size/volume/intensity distribution table" every time you conduct a measurement.  Albeit the terrible format it produces, this is the most favorable practice in the labs that I have worked in. To view it, you first need to turn on the panel/tab in Tool>>Setting>>Configure Workspace>>Size, and in the tab Report Pages, check Number Stats Table (M). Then after each measurement, just drag/copy the table to a .txt file and save it to your flash disk. Remember, one measurement in each file.

The file looks like this:
It seems to be a poorly formatted, tab separated file which is extremely unfriendly to the graph editing software.

I used to manually cut and paste and use Excel as well as some more specific data analysis software to visualize the data. Recently I am generating a large number of results, so I decided to write a script to process them.

Here is the Python-Gnuplot script. To run it on Windows, you need to first install python (for some reason, I am still using Python 2.7, but I believe it is also compatible with Python 3), Gnuplot and add their directory in %PATH%. Just check "add to %PATH%" options  when you install these softwares.

Then, put all the .txt files in the same directory, download this script file to the same directory and run it. A png figure will be generated for each .txt file in this directory, and it looks just like this one:
In the meantime, another .csv file is generated. You can import this file into other software for a further analysis.

Here is the code of the script:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import subprocess

def transcribe(fname):
 cumul = 0.0
 with open(fname,'r') as source,\
   open(fname[:-4]+'_trans.csv','w') as result:
  content = source.readlines()
  del content[0:2]
  for i in range(0,3):
   for j in content:
    if len(j.split('\t')[4*i])>0:
     x = j.split('\t')[4*i]
     y = j.split('\t')[4*i+1]
     cumul += float(y)
     result.write(x+','+y+','+str(cumul)+'\n')

def plot(fname):
 figtitle = fname[:-10]
 with open(fname,'r') as source:
  dataraw = source.readlines()
 for i in range(0, len(dataraw)-1):
  x = float(dataraw[i].strip().split(',')[0])
  y = float(dataraw[i].strip().split(',')[1])
 with open('gpl_temp.plt','w') as gTemp:
  gTemp.write("set term png\n")
  gTemp.write("set output \"%s.png\"\n" %fname[:-10])
  gTemp.write("set datafile separator \",\"\n")
  gTemp.write("set title \"%s\"\n"%figtitle)
  gTemp.write("set xlabel \"D (nm)\"\n")
  gTemp.write("set ylabel \"N%\"\n")
  gTemp.write("set yrange [0:110]\n")
  gTemp.write("set grid\n")
  gTemp.write("set logscale x\n")
  gTemp.write("set style fill solid 0.4 border\n")
  gTemp.write("plot \"%s\" using 1:2 \"%%lf,%%lf\" title \"\" with boxes,"%(fname)+\
              "\"\" using 1:3  title \"\" with line\n")
  gTemp.write("set output\n")
 p=subprocess.call("gnuplot gpl_temp.plt")


txtdir = os.listdir(os.getcwd())
for i in txtdir:
 if i[-4:] == '.txt':
  transcribe(i)
  plot(i[:-4]+'_trans.csv')

2016年12月14日星期三

一个基于JavaScript的timer实现

为了方便观察色谱的运行状态,在降低辐射剂量的情况下获得色谱的时间信息,我用Javascript撰写了一个html小程序,用来在限制很多的色谱工作站上跑。
内容比较简单,所以我一点注释都没有加。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<html>
<head>
<script type="text/javascript">
var c=0
var d=0
var t
var per=0.1
var alOffset=0
function offset(sec)
 {
   clearTimeout(t);
   if (sec == '-1')
   {
     sec = (document.getElementById("offsetbox").value)*600
   }
   c = sec
   d = sec%(per*600)
 }
function changeColor()
{
  var bgcolor = document.getElementById('txt').style.backgroundColor
  //var x = alert(bgcolor)
  if (bgcolor != "green"){
    document.getElementById('txt').style.backgroundColor = "green"
  }
  else
  {
    document.getElementById('txt').style.backgroundColor = "yellow"
  }
}
function timedCount()
 {
 document.getElementById('txt').innerHTML=(c/600).toFixed(3)
 d=d+1
 c=c+1
 t=setTimeout("timedCount()",100)
 if (d>=per*600){
   changeColor()
   d = 0
 }
 return false;
 }
function timedStop()
{
  clearTimeout(t);
  document.getElementById('txt').innerHTML=0
}
function setAlert()
{
  per = document.getElementById("alPerBox").value
  alOffset = document.getElementById("alOffsetBox").value
  d = alOffset*600
}
</script>
</head>
<body>
<form>
<input type="button" value="0 sec" onClick="offset(0); timedCount()">
<input type="button" value="5 sec" onClick="offset(50); timedCount()">
<input type="button" value="0.1 min" onClick="offset(60); timedCount()">
<input type="button" value="stop" onClick="timedStop()">
<div id="txt" style="color:red;font-size:100px">
0
</div>
<div>
<input type="button" value="Start at" onClick="offset(-1); timedCount()" id="offsetbutton">
<input type="text" id="offsetbox" value="0.5" size="3"> min
</div>
<hr />
<div>
<input type="button" value="Set Alert" onClick="setAlert()">
<br />
Period:
<input type="text" id="alPerBox" value="0.1" size="1.5"> min
<br />
Offset:
<input type="text" id="alOffsetBox" value="0" size="1.5"> min
</div>
</form>
</body>
</html>
    

效果见: