一个较为完整的中文图书Latex模板

用Latex编写中文书是让人头疼的工作。如果不是需要输入很多公式,很多人是不愿意用latex排版中文书的。

在ctex宏包发布之前, latex系统对中文排版的支持一直不太理想。虽然中文能够正常显示,但是一些排版细节, 如章节号、行距、字体选择、缩进等都需要写很多命令重新定义。ctex宏包较好地解决了这个问题。

这里给出一个latex中文图书模板。 该模板主要包括:

  1. 扉页
  2. 序言
  3. 前言
  4. 目录
  5. 部分
  6. 章以下标题
  7. 分栏模式
  8. include包含其他tex文档
  9. 标题名称转换
  10. 标题部分加入目录
  11. 自动生成索引
  12. 参考文献(待完善)
  13. 生成目录、索引以及参考文献的超链接
  14. 后记

编译的方法是: 将代码部分保存到文本文件中, 用UTF-8编码。 之后用XeLaTeX编译即可生成中文文档。 虽然生成的图书效果值得商榷, 但是相信编译为书稿后, 再交给专业排版人员, 一定能省很多事。 最主要的是可以用Latex直接写公式。

利用这个模板,编写植物名录、植物图集等会容易很多。可以借助其他脚本语言如Python或者R处理相应的数据库,生成tex代码,\include{}之后,再编译即可。

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
%%% Latex代码开始
\documentclass[utf8]{book}
\usepackage{titletoc}
\usepackage{titlesec}
\usepackage{ctexcap}
\usepackage[b5paper,text={125mm,195mm},centering,left=1in,right=1in,top=1in,bottom=1in]{geometry}
\usepackage[]{geometry}
\usepackage{imakeidx}
\usepackage{multicol}
\usepackage{hyperref}
\makeindex
\bibliographystyle{plain}
\begin{document}
\title{\heiti中国植物多样性地理图集}
\author{\fangsong中国科学院植物研究所 编著}
\date{2018年1月}
\frontmatter
\maketitle
\chapter{序 I}
这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言
\chapter{序 II}
这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分是序言这部分
\chapter{前~言}
这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分是前言这部分
这部分是前言
\renewcommand\contentsname{目~录}
\tableofcontents
\mainmatter
\part{总论}
\chapter{中国植物调查的历史}
\section{一级节标题}
\subsection{二级节标题}
\subsubsection{三级节标题}
\begin{multicols}{2}
清朝中期,外国人就开始中国采集植物标本。清朝中期, 外国人就开始中国采集植物标本。清朝中期, 外国人就开始中国采集植物标本。清朝中期, 外国人就开始中国采集植物标本。清朝中期,外国人就开始中国采集植物标本。清朝中期, 外国人就开始中国采集植物标本。
\end{multicols}
\chapter{植物区系分区}
\section{一级节标题}
\subsection{二级节标题}
\subsubsection{三级节标题}
\begin{multicols}{2}
和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集植物\index{调查}和标本采集植物调查和标本采集植物调查和标本采集植物调查和标本采集
\end{multicols}
\part{植物多样性分区概述}
\chapter{东北地区}
\begin{multicols}{2}
Lorem ipsum dolor sit amet,consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamcolaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in \index{reprehenderit} in voluptate velit essecillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{multicols}
\chapter{华北地区}
\begin{multicols}{2}
Lorem ipsum dolor sit amet,consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamcolaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor inreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officiadeserunt mollit anim id est laborum.
\end{multicols}
\include{angiosperms}
\appendix
\chapter{APG分类系统的科名}
内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容文内容正文内容正文内容正文\index{内容}
内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容附录内容正文内容正文\cite{DK1}.


\renewcommand\indexname{索~~引}
\printindex
\addcontentsline{toc}{chapter}{索~引}
\backmatter
\addcontentsline{toc}{chapter}{参考文献}
\begin{thebibliography}{参考文献}
\bibitem[Knuth1 et al. 1997]{DK1} D. Knuth, T.A.O.C.P. , Vol.1, Addison-Wesley, 1997.
\bibitem[Knuth2]{DK2} D. Knuth, T.A.O.C.P. , Vol.2, Addison-Wesley, 1997.
\bibitem[TONG YH 2014]{TONG} TONG YH, PANG KS, XIAN NH,2014. Carpinus insularis(Betulaceae), A new species from HongKong [J]. J Trop Subtrop Bot, 22(2): 121-124. [童毅华, 彭权森,夏念和,2014.香港桦木科一新种——香港鹅耳枥 [J]. 热带亚热带植物学报,22(2):121-124.]
\bibitem[XIA NH 2008]{XIA} XIA NH, DENG YF, YIP KL,2008. Syzygium impressum (Myrtaceae), A new species from HongKong [J]. J Trop Subtrop Bot, 16(1):19-22. [夏念和,邓云飞,叶国梁,2008. 香港桃金娘科一新种-凹脉赤楠 [J].热带亚热带植物学报,16(1):19-22.]
\end{thebibliography}

\chapter{后~~记}
后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容后记内容
\begin{flushright}
作~~者~~~~~~~~~
2018年1月~~~~~
\end{flushright}
\end{document}
%% Latex代码结束

中文图书模板.pdf

中文图书模板.tex

一个中文Latex幻灯片模版

幻灯片重在用简洁、优雅的方式传递信息。

幻灯片中,最重要的当然是内容, 但是排版风格也十分重要,尤其是字体、行距以及版式的统一。

制作幻灯片和文档的方法很多, Latex不是唯一选择。Markdown等也能通过pandoc转换,或者借助用javascript等生成类似的效果,powerpoint经过精心设计, 也能赏心悦目。 不过在Markdown以及powerpoint中生成中文文档一些细节不好控制, 很多时候还是用Latex更简单明了。

Beamer是Latex的一个程序包, 可用来生成pdf格式的幻灯片。Latex中,中文文档大多以CJK包为基础编译。配置中文使用环境,在CJK基础上曾出现过若干程序包, 但是配置中文环境往往十分复杂, 其中目录、标题、索引、代码高亮显示等为最难的部分往往很难到位。为此,国内一些Latex爱好者开发了ctex程序包, 以生成符合中文排版习惯的文档的latex文档 (http://www.ctan.org/tex-archive/language/chinese/ctex)。要查看ctex的帮助文档, 可以在安装好Texlive或者MikTeX之后, 在terminal或者cmd中,输入texdoc ctex查看。该项目的github网址是 https://github.com/CTeX-org/ctex-kit 。目前来看 ,ctex套件通过XeLaTeX为中文提供了最好的支持。

以下是一个基于ctex程序包的beamer文档代码。 将源代码保存为utf-8格式的文本文档,然后用XeLaTeX编译即可。

查看更多beamer的配色方案以及主题, 参见

http://deic.uab.es/~iblanes/beamer_gallery/

https://hartwork.org/beamer-theme-matrix/

https://github.com/matze/mtheme

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
%%% TeX代码开始
\documentclass[UTF8]{ctexbeamer}
\usetheme{Boadilla}
\usecolortheme{beaver}
\usepackage{graphicx}
\usepackage{color}

\begin{document}
\title{R编程与进化分析}
\subtitle{内容与目标}
\author{\songti 张金龙}
\institute{jinlongzhang01@gmail.com}
\date{\today}
\frame{\titlepage}

\begin{frame}
\frametitle{目录}
\tableofcontents
\end{frame}
\section{进化树之后要回答的问题}

% 如果需要目录,请去掉这张幻灯片的%
%\begin{frame}
%\frametitle{目录}
%\tableofcontents[currentsection]
%\end{frame}

\begin{frame}
\frametitle{进化树能帮我们回答哪些问题 I?}
\begin{itemize}
\item 1. 分类单元之间的系统发育关系
\item 2. 物种的形成速率受什么影响? 如: 类群的古老程度, 类群的丰富度, 类群所处的纬度, 类群的特殊生境
\item 3. 物种形成速率和灭绝速率在历史上发生过哪些变化?
\item 4. 物种的进化历史越独特, 越应该受到保护吗?
\item 5. 相近的物种有相似的性状吗? 有相似的习性吗?
\end{itemize}
\end{frame}

\end{document}
%%% TeX代码结束。

img

img

为什么生态学家要学习Python或者R?

最近有几位老师在微信里面分享了学习Python的一些资料。与R相比,Python是一门真正意义上的编程语言,除了编写脚本,用于数值计算之外,还可以编写命令行程序,编写带用户界面的应用程序,编写网站,绘图,调用C,C++以及Fortran等语言的函数库等等。Python比R的应用领域更广阔,除了为黑客提供各种黑科技外,还广泛应用在化学、物理、天文、生物信息等领域,当然也非常好玩儿。这么强大的语言,当然非常值得了解和学习。更难能可贵的是,很多Python的项目是开源的,也就是源代码可以下载,供好事者仔细研究。Python的另外一个好处就是可以在不同的平台上使用,也可以编译为独立的程序运行。Python脚本也可以用来驱动MySQL,sqlite, ArcGIS, Adobe Indesign等软件,进行二次开发,用途极广。 Python资源极为丰富,有数以万计的程序包, 其中不乏生物信息学软件包。Biopython就是其中之一。BioPython程序包的一些函数可以对DNA序列进行复杂操作,实现对GenBank的访问和查询等。Python的语法简洁,通俗易懂, 很容易上手。 Python用户不需要捣腾层次复杂的花括号,只需要留意缩进。Python还有pip程序包管理系统,编写程序包也极为方便。掌握了Python,就掌握了这些资源。看了上面的介绍, 还没有学Python的朋友,是不是动心了呢?

然而还有一个选择,那就是R语言,也叫R软件,R语言是驱动R软件工作的命令。其实R语言的本质是S语言,S语言诞生于美国贝尔实验室。不过实现S语言的软件Splus售价太高,新西兰奥克兰大学的两个老师在教学过程中山寨了一下SPlus,他们用C语言和Fortran编写了一个软件,用来实现S语言,于是R软件就诞生了。自从这两个老师开放了R的源代码之后,R受到了学术界的关注。因为S语言语法简单,接近于很多人熟悉的C语言,在进行统计分析以及绘图上有出色的表现。不仅如此,R秉承了UNIX的传统,所有的命令, 包括程序包中的函数,都有非常详细的帮助文件,这是很多语言和软件所望尘莫及的。Python的很多程序包都没有做到这一点。近几年来,R语言成为生态学研究最流行的软件,特别是在森林样地数据处理、地理信息和空间处理、统计绘图以及在系统发育比较分析,经济学,贝叶斯统计等很多领域,都有一流的学者坚持使用R,一些新的统计方法也用R开发。从Springer以及Wiley,O’Reilly等著名出版商R相关图书的出版情况,就可以了解到R的热度。Tiobe编程语言热度排名,R蹿升到第8位,对于一门应用领域狭窄的脚本语言实属不易。还有很多研究论文直接在附录中给出了R代码。英国生态学会的Methodsin Ecology and Evolution 杂志更是开设专栏介绍生态学与进化分析的软件包,其中R程序包占绝大多数。在过去,研究人员可能提供MatLab代码或者SAS程序,然而最近几年, 这种情况逐渐减少了。相比之下,提供Python代码的生态学研究还不是很多。

对于生态研究来说,R与Python都是非常好的语言,R则更胜一筹。任何一门编程语言, 从入门到精通都需要很长时间练习,普通人即使花费很多时间, 也未必能够掌握一门计算机语言的精髓,更别提能使用得出神入化。Python的语言的覆盖面很广,几乎是我们能想到的脚本语言能做的事情,Python都是可以做到的。

但是,一门计算机语言, 能够在一个学科中占据绝对优势,其实主要是看运气,更重要的是取决于在这门脚本语言的发展过程中,有没有足够牛的牛人, 能够做出一些开创性的工作,奠定良好的发展基础。 例如, 之所以R软件在系统发育比较分析(PhylogeneticComparative Methods)能占绝对优势,根本原因在于法国进化生物学家E.Paradis编写的APE程序包,因为这个程序包定义了phylo这种数据类型,设计了进化树在R中储存的格式以及基本的操作。这样一来, 你想提取物种名, 就可以用 $tip.label提取;想为进化树重新排序,就用ladderize(); 想绘图,就用plot.phylo();Paradis创造了APE,在Analysisof Phylogenetics and Evolution一书中介绍了相应的操作。APE对进化树的操作简单易行,因此很快吸引了大量用户,其中不乏一流学者,很多人在APE的基础上开发了程序包,如laser,phytools, picante等等,引入了众多新的分析方法,从此用R进行进化分析一发而不可收拾。对于群落生态来讲,类似的例子是vegan程序包。这个程序包主要用来进行多元统计,对于群落生态学数据分析有举足轻重的作用,例如计算alpha和beta多样性,CCA,DCA排序以及方差分解,物种多度曲线等等只需要一个函数就完成了。 生成的结果,可以直接绘图或者进行其他分析,极为方便。vegan也是众多一流生态学者合作完成的。进行生物多样性分析, vegan是绕不开的,而且越来越多的人开始使用vegan做群落数据分析,这也是很多人学习R的驱动力。在此之前,群落生态学家主要是用CANOCO或者TWINSPAN或者其他一些多元统计分析软件进行数据处理,数据格式千差万别,甚至每个软件都有自己的数据格式。那时候, 就连Numerical Ecology的作者,大名鼎鼎的Pierre Legendre都也只能自己用Fortran写程序。

R语言目前在中科院以及国内大学的生态和进化研究中已经非常重要。植物研究所赖江山博士的R语言培训班和课程进行的如火如荼,次次爆满。很多人学习R,不但是为了掌握一门技术, 更是为了了解资源。学习了一门语言,就打开了一门看世界的窗户,其实编程语言也是如此,至少可以看看用这门编程语言能做什么以及现有的资源有哪些。不过,学习的诀窍,就在于不要一下子学很多东西,而是要学得深入。虽然R语言或者Python已经入门,但是学的不够精,即使代码和程序包在就在那里,自己也不清楚怎么用。 ggplot2的作者Wickham在《Rfor Data Science》一书里面说,作者建议读者先学好一门语言,学到很熟很深的程度,然后自然就容易融会贯通,这种说法我十分赞同。

对于学过R语言的学生,什么学到比较熟练了呢? 这里说说自己编写R程序包的感受。

其实学习R语言,并不一定非要求编写什么程序包。编写程序包还涉及到一些Latex语言文档,有时候涉及到调用C语言或者C++或者Fortran代码,涉及到其他程序包的依赖以及编写Description文件的格式以及UTF-8编码等许许多多问题,需要一段时间去认真学习。而且随着R的升级,R程序包编写的要求也经常改变,原来能够正常工作的程序包因为不符合要求就从CRAN下架了。还有不同操作平台编译的限制,数据大小的限制等等。例如在检查R程序包过程中有几十项内容,不能有一条出错,否则就不能提交到CRAN。对程序包的质量严格控制,并不是R管理团队太苛刻了。最近昆明植物所一位老师就抱怨说,安装一个R程序包,要依赖十个其他的包, 然后其中有些包又要依赖若干程序包,不过有一个二次依赖的程序包,因为不合格已经从CRAN移除了,这就导致程序包不能正常安装。程序包没有人好好维护的情况之下, 如果出现错误,就难免影响用户的心情, 影响CRAN以及R的声誉。当然, 你可以说, CRAN上的程序包都是作者负责的,出错也是难免的,R核心团队对此没有任何责任。道理是如此,可是谁也不希望不靠谱的程序包太多。

2017年年底,我忽然收到维也纳大学KurtHornik教授发来的email,让我修改phylotools,原因是该程序包一些函数的例子里读取用户工作路径之外的路径,这违反了CRAN的规定。phylotools程序包主要是用来构建DNA序列的超级矩阵supermatrix的。2009年年底,我到华南植物园葛学军研究员的实验室补充浙江古田山大样地DNA条形码的数据,做了一些实验之后,要把140多个种,每个种的rbcLa, matK,trnH-psbA基因分别比对,然后再拼成supermatrix。在计算机程序里,这是很容易实现的,但是如果用手工,就非常麻烦。当时还不熟悉R的我,编写了一些R脚本,用来创建supermatrix,这些函数后来就成了phylotools的主体。2015年,重新检查这个程序包后,我觉得很多函数写得不够好,于是将函数重新写了一遍, 放到github托管了。这次收到email通知,让我修改phylotools,我干脆就把github上的新版本改了改,然后提交到CRAN。新版本很快就就在CRAN接收了,不过代价也是有的: 因为重写了一些函数, 参数和旧版本不同,基于旧版本的R脚本其实已经不能用了。虽然如此,作为软件包的作者,我还是觉得新版本的代码优雅一些,函数设计更合理一些。相比之下,虽然对HK80以及spaa这两个程序包都不太满意,但是精力有限,就一直没有修改。另外两个R包,查询植物科属的plantlist以及打印植物标签的herblabel一直都托管在r-forge以及github上,没有在CRAN上那么费心。

能够编写R程序包,是否代表具有很高的R编程水平?答案是否定的。 因为编写程序包这件事, 只要是能编写R函数的用户,学习一点儿编写程序包的技巧,都是可以弄出来的。能够写程序包,确实说明相当熟悉R语言了,至少是能编写R函数了。能编写函数是区分入门水平和较为熟悉一门语言的分水岭。学习编程,入门阶段熟悉的是语法,如赋值、调用函数、写循环,如何查询帮助;之后是数据操作,字符串操作与正则表达式,编写函数,再之后就是各种算法。有人说,算法是函数的灵魂,很多情况下确实如此。因为函数就是为了实现一些功能,算法告诉你应该怎样实现这些功能。对算法的理解不够深入,函数就很难解决更深层次的问题,比如,要编写一个用于CCA排序的函数或者进行方差分解的函数,没有对相应理论很好掌握是不可能做到的。这些是真正考验基础理论和水平的地方,国内数量生态学家与国际同行核心竞争力的差距也就是在这里。

学习计算机语言,无论是Python还是R,都是有助于培养好的思维习惯与严谨的态度。在编程过程中,错一个标点符号都是不行的。与此同时, 学习编程还要理解很多抽象的概念,比如S3、S4方法,面向对象、继承、多态性,也需要理解一些数学和统计学的内容,最小二乘法、极大似然、贝叶斯统计、非参数统计以及线性和混合模型等等。

将一个问题分解为能用程序解决的问题,需要化整为零,一步一步思考,然后步步为营,这样从技术上问题也许就解决了。然而真正解决生态学与进化上的问题,发现新知识,提出新观点,已经不是技术问题,是编程所不能回答的。这时候就需要将各种信息进行整合,深刻把握问题的本质,进行深入思考。编程的能力再强,如果没有纵深的思考,没有对问题的全局性把握,没有从具体的学术问题出发,就很容易停留在技术层面,难有深刻的见解。无论是学习Python还是R,这个问题都需要仔细考虑的。

2018年1月9日 于 香港大埔

CTPL2通过中文名批量查询植物学名

关注plantlist程序包的朋友们可能记得我在半年前加了CTPL2函数,用来从excel文件中读取植物名并批量查询。这篇主要谈谈在整理CTPL2所用到的数据集时的心得。

写plantlist程序包CTPL2函数主要是想节约点时间。因为在野外调查结束后,整理植物名录总要花上很多时间,直接输入拉丁名显然是费时费力,极容易出错。其中一种方法是用输入法直接输拉丁名,例如拼音加加,不过要根据已经改过名的植物照片整理名录,用输入法逐个输入也是非常麻烦的,这是因为输入法词库大多不提供物种命名人,在严谨的植物名录中是不能用的。cfh可以基于照片生成名录,但是每个种都要有照片,照片要改好名称,上传到cfh,以便自动生成名录。不过这仍然有这样或那样的不便,例如要查询物种的分布,保护等级等信息,过程就非常繁琐。因此我就想能不能用中文名关联上一个数据库, 实现批量查询。

想法是好的,函数也很容易写,但是R的中文编码问题始终让人极为头疼。试了很多种方法让问题简单, 最终只能选用读取excel文件的方式,把字符编码交给openxlsx程序包处理。因为openxlsx包是依赖于Rcpp的,所以要运行新版的plantlist需要安装这两个包。

做一个工具函数同做艺术品是相通的,都要努力发挥创意。要让这个函数好用,最好能满足以下要求:只要在xlsx文件的第一列,依次输入物种中文名,保存,运行函数就能自动生成一个新的excel文件,里面有如下结果:

  1. 物种的中文名
  2. 学名
  3. 带命名人的学名
  4. APG等现代分类系统的科名
  5. 科中文名
  6. 属名
  7. 属中文名
  8. 该种在国内的IUCN保护等级
  9. 是否为特有植物
  10. 分布的省市缩写
  11. 分布的海拔范围等

因为这些数据都是多样性分析中常用的,所以应尽量出现在结果中。

不同地区物种不同,要满足国内大部分科研人员的需求,名录的覆盖度要很高,所以数据库必须要包括大部分植物的标准中文名。所以这个数据库合并了多个数据库,包括:

  1. 《中国植物志》中文名数据库
  2. The Plant List网站科属数据库
  3. 刘冰等2014中国被子植物属数据库
  4. 中国高等植物IUCN红色名录
  5. 中国种子植物名称和分布数据库

合并后,数据达到53000多条,包括苔藓、蕨类、裸子植物、被子植物的标准中文名。

数据库合并看似容易,实则问题非常多。例如,当前仍然未能找到苔藓的中文科属名称对照表,蕨类部分也仍然需要按照ppg系统整理,这些仍待下次更新时补充。被子植物部分还好有刘冰博士整理的中文名对照表,让进度加快不少。iucn红色名录数据中,有时候两个学名对应同一个中文名,此外还有为数众多的原变种、原亚种以及原变型等,这在匹配时都是很大的麻烦。不过由于它们的存在,几千条近似的条目分散在这五万多条数据中,要将这种条目合并,需要认真细致的校对。

由于数据量较大,在整理过程中,MS Excel还罢工几次:有时候整理到一万多条,不得不重新开始。吃了两次亏后,只能寄希望于随手按住Control+S了。经过多天的努力,数据终于整理干净了。

全部数据之后压缩成R数据库二进制文件。增加一个版本号后,经过检测,CTPL2函数可正常使用。

整理物种的学名以及相关信息,在植被多样性研究中是十分耗时的。真心希望plantlist程序包的CTPL2函数能帮大家节约时间。该程序包的下载地址是 https://www.github.com/helixcn/plantlist

如果有任何问题、意见或建议,请发email到jinlongzhang01@gmail.com

安装 plantlist 请参考 http://blog.sciencenet.cn/blog-255662-846673.html

幼苗生存状态、负密度制约与Janzen Connell假说的检验

检验同种和不同种在群落内的竞争效应是群落生态学的重要研究内容。 负密度制约一般表现在同种个体或者异种个体在空间距离越近,对资源的竞争也就越激烈。与此同时,相同种在空间上的聚集,容易导致疾病传播,容易被捕食或者取食,对该种的幼苗生长不利。这种情况也发生在幼苗与母树之间,生态学家提出距离母树更近的幼苗死亡率更高,这就是Janzen Connell假说,并认为这是群落内物种多样性维持的重要机制之一。近年来,对于Janzen-Connell的研究也不断增加。

检验同一物种以及不同物种之间的密度制约现象, 一般是用到幼苗的两次调查数据, 用广义线性混合模型去探讨各因子的相对贡献。 响应变量一般为幼苗在两次调查时的生存状态。 解释变量一般为同种和异种幼苗在任何一棵幼苗内的胸径截面积,幼苗胸径、高度等。并将样方号、物种等并不太关心的因子作为随机效应处理。 根据研究问题和研究尺度的不同,也可能也会考虑环境因子的贡献等, 不过由于很难直接获得每棵幼苗对应的环境因子,所以整合环境因子的密度制约分析还不多。

在本文先随机生成一套样地数据, 然后给出一个函数compute_neighbour_area,该函数能计算指定半径下,每个个体相同种和不同树种的胸径截面积,生成的数据可以直接用来拟合广义线性混合模型,以探讨同种和不同种的竞争效应,探讨密度制约机制。

模拟生成的练习数据要求如下,面积为5公顷,长250m, 宽200m, 有90个物种, 12700个个体, 详情参见下面的R代码和注释 。

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
#### 假设样地有如下90个物种 (参考 陈云等 2017)

sp <- c("Abelia biflora",
"Abelia uniflora","Acer davidii","Acer davidii subsp. grosseri","Acer griseum",
"Acer pictum subsp. mono","Acer truncatum","Ailanthus altissima","Aralia elata",
"Berberis circumserrata","Berberis mitifolia","Betula chinensis","Betula luminifera",
"Betula platyphylla","Buckleya graebneriana","Carpinus cordata","Carpinus turczaninowii",
"Cerasus clarofolia","Cerasus polytricha","Cerasus serrulata","Cercidiphyllum japonicum",
"Cornus controversa","Cornus kousa subsp. chinensis","Cornus macrophylla",
"Cornus schindleri subsp. poliophylla","Cornus walteri","Corylus chinensis",
"Corylus heterophylla","Cotoneaster acutifolius","Cotoneaster multiflorus",
"Crataegus hupehensis","Crataegus pinnatifida","Deutzia parviflora",
"Diospyros lotus","Elaeagnus umbellata","Euonymus maackii",
"Euonymus phellomanus","Euonymus schensianus","Euptelea pleiosperma",
"Evodia daniellii","Evodia fargesii","Forsythia suspensa","Fraxinus chinensis",
"Fraxinus mandshurica","Fraxinus paxiana","Juglans cathayensis",
"Koelreuteria paniculata","Lespedeza bicolor","Lespedeza buergeri",
"Lindera obtusiloba","Litsea tsinlingensis","Lonicera hispida",
"Lonicera microphylla","Lonicera tatarinowii","Maddenia hypoleuca",
"Malus baccata","Malus honanensis","Malus hupehensis","Malus kansuensis",
"Meliosma flexuosa","Meliosma veitchiorum","Ostrya japonica","Padus buergeriana",
"Philadelphus incanus","Pinus armandii","Pinus tabuliformis","Populus davidiana",
"Quercus aliena var. acutiserrata","Quercus serrata var. brevipetiolata",
"Quercus variabilis","Rhododendron micranthum","Ribes pachysandroides",
"Salix floderusii","Sambucus williamsii","Sinowilsonia henryi",
"Sorbaria sorbifolia","Sorbus alnifolia","Sorbus hupehensis","Spiraea hirsuta",
"Stachyurus chinensis","Styrax hemsleyanus","Styrax obassis","Symplocos paniculata",
"Tilia japonica","Tilia paucicostata","Toxicodendron vernicifluum","Ulmus davidiana",
"Viburnum betulifolium","Viburnum opulus var. sargentii","Yulania denudata")

set.seed(12345) #### 设定随机数种子
library(sads) #### 导入物种多度分布程序包
## Loading required package: bbmle
## Loading required package: stats4
library(stringr) #### 导入字符串处理程序包
library(vegan) #### 导入物种名处理程序包
## Loading required package: permute
## Loading required package: lattice
## This is vegan 2.5-3
library(coefplot)#### 绘制参数图
## Loading required package: ggplot2
library(knitr)
library(lme4)
## Loading required package: Matrix
library(broom)
#### 生成物种编码, 并全部转换为大写
spcode <- toupper(make.cepnames(sp))
### 物种数90
nsp <- length(spcode)### 个体数
nind <- 12700
### 假设多度服从以下分布
temp <- rls(n = nsp, N = 10000, alpha = 6)
#### 生成名称字符串向量
sppool <- rep(spcode, temp)
#### 随机筛选出物种, 长度与样地的个体数相同
species <- sample(sppool, nind, replace = TRUE)
#### 查看每个种的个体数####
table(species)
#### 计算总的个体数
sum(table(species))
## [1] 12700
#### 样地长250m, 对应nind个x坐标,坐标的取值范围从0-250
gx <- round(runif(nind)*250, digits = 2)
#### 样地宽200m, 对应nind个y坐标,坐标的取值范围从0-250
gy <- round(runif(nind)*200, digits = 2)

xlab20 <- cut(gx, breaks = seq(0, 260, by = 20), labels = 1:13)
ylab20 <- cut(gy, breaks = seq(0, 220, by = 20), labels = 1:11)
#### check the quardrat name
sort(unique(ylab20))
## [1] 1 2 3 4 5 6 7 8 9 10
## Levels: 1 2 3 4 5 6 7 8 9 10 11
sort(unique(xlab20))
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13
## Levels: 1 2 3 4 5 6 7 8 9 10 11 12 13
#### generate quadrat name
quadrat20 <- paste(str_pad(xlab20, 2, pad ="0"),
str_pad(ylab20, 2, pad ="0"), sep = "")
##### table(quadrat20)
#### 假设dbh服从指数分布
dbh = dbh <-round(rexp(nind,rate =2)*50+1, 1)
#### 假设样地名为白云山BYS (白云山物种名录参考 陈云等 2017), 物种标牌
tag <- paste("BYS", str_pad(1:nind, 6, pad ="0"), sep ="")
#### 物种的生存状态
status <- rbinom(nind, size = 1, prob = 0.01)
#### 合并到一个data.frame中
bys <- data.frame(tag, species, gx, gy, quadrat20, dbh, status)
#### 以上样地模拟数据生成。 请注意以上数据都是随机生成, 数据只供练习用,不宜用来做零模型或其他分析。
#### 数据准备

#### 首先,去除个体数少于30个的个体
#### 每个种的个体数
nindividual <- table(bys$species)
#### 大于等于30个个体的物种名
sp_to_select <- names(nindividual[nindividual >= 30])
#### 仅保留名单中出现的物种
sub_bys <- subset(bys, subset = species %in% sp_to_select)
#### 提取一部分数据的前2000条, 用于检验下面的函数
sub_bys_test <- sub_bys[1:2000,]

#### 计算每一个个体, 在某一半径范围内同种和异种的胸径截面积
#### dat 为样地数据, 必须包括以下各列
#### gx 个体在样地内的x坐标, 单位为m
#### gy 个体在样地内的y坐标, 单位为m
#### species 个体的名称缩写
#### dbh 每个个体的胸径,单位为cm
#### r 从任何一个个体出发所画圆盘的半径

compute_neighbour_area <- function (dat, r = NULL)
{
if(any(is.na(dat))){
### 如果出现NA缺失数据, 则需要先去除, 以免产生未知后果
dat <- na.omit(dat)
warning("NAs detected in the data and the entries
containing NAs have been omitted.")
}
dat$ID <- 1:nrow(dat)
### 为每一条物种记录增加一个ID

if(is.null(dat$gx)){
### 检查gx
stop("Column gx is missing")
}

if(is.null(dat$gy)){
### 检查gy
stop("Column gy is missing")
}

if(is.null(dat$species)){
### 检查物种名
stop("Column species is missing")
}

if(is.null(dat$dbh)){
### 检查dbh
stop("Column species is missing")
}

if(is.null(r)){
### 检查是否有提供r
stop("r is not specified")
}
gx <- dat$gx
gy <- dat$gy
dat$species <- as.character(dat$species)
### 转换为字符串主要是为了方便后面进行物种筛选
species_each_id <- dat$species
### 由于进行的循环数较多, 所以最好不要在循环中不断提取物种, 而是先生成一个字符串向量
area_of_neighbours_same_species <- rep(NA, nrow(dat))
### 生成空白数据
area_of_neighbours_diff_species <- rep(NA, nrow(dat))
### 生成空白数据
print(paste(nrow(dat), "rows to process."))
### 提示数据量
for (i in 1:nrow(dat)){
if(i %% 100 == 0 | i == 1){
### 每计算100个,打印正在计算哪条
print(paste("Computing neighbourhood area for row:", i))
}
x <- gx[i] ### 提取第i个
y <- gy[i]
#### 先把数据量缩小到个体加减半径范围内的方块内, 这样能减少很多计算量
dat_sub <- dat[(gx < x + r) & (gx > x - r) & (gy < y + r) & (gy > y - r), ]
### Select the area, reduce the computation of each loop

#### 计算相邻树木的胸径截面积需要将中心树种本身去除
#### Exclude the focusing tree during the computation
dat_sub <- dat_sub[dat_sub$ID != i, ]
#### 如果dat_sub 的行数大于0, 表明在缩小的方块内是有其他树种的
if(nrow(dat_sub) > 0){
#### 先生成一个空白的向量, 用来保存哪些记录是处在圆盘内的, 这里的下表是针对方块内的小数据的
sp <- rep(NA, nrow(dat_sub))
### empty vector, the index of the entries within the distance
### r will be saved to sp.
for(j in 1:nrow(dat_sub)){
### 对方块内所有的物种计算欧氏距离,并做比较, 做j次
mat <- data.frame(c(x, dat_sub$gx[j]), c(y, dat_sub$gy[j]))
sp[j] <- (dist(mat) <= r)
}
#### 所有个体的胸径截面积
area_of_neighbours <- pi*(dat_sub$dbh[sp]/2)^2
### Trunk Area at the breast height for all the neighbouring trees
### in the subset dataset, within distance R

#### 如果同种的在圆盘内出现了,那么胸径截面积向量的长度肯定不是0,这时候就保存结果到第i个位置
if(length(area_of_neighbours[dat_sub$species[sp] %in%
species_each_id[i]]) != 0 ){
area_of_neighbours_same_species[i] <-
sum(area_of_neighbours[dat_sub$species[sp] %in% species_each_id[i]])
### The trunk area at breast height of the same species
}
#### 如果不同种在圆盘内出现了,那么胸径截面积向量的长度肯定不是0,这时候就保存结果到第i个位置
if(length(area_of_neighbours[!dat_sub$species[sp] %in%
species_each_id[i]]) != 0){
area_of_neighbours_diff_species[i] <-
sum(area_of_neighbours[!dat_sub$species[sp] %in%
species_each_id[i]])
### The trunk area of breast height of different species
}
} else {
### If there is no tree within the distance r, return NA
#### 如果没有出现任何树木,第i个胸径截面积都是NA
area_of_neighbours_same_species[i] <- NA
area_of_neighbours_diff_species[i] <- NA
}
} #### 合并成data.frame
res <- data.frame(area_of_neighbours_same_species,
area_of_neighbours_diff_species)
#### 为了数据处理方便,在返回值的列名上增加半径 r的取值
colnames(res) <- paste(c("area_of_neighbours_same_species",
"area_of_neighbours_diff_species"),
"_r_", r, sep = "")

return(res)
}

#### debug(compute_neighbour_area)

neighbour_area_res10 <- compute_neighbour_area(sub_bys_test, r = 10)
### 半径10m
## [1] "2000 rows to process."
## [1] "Computing neighbourhood area for row: 1"
## [1] "Computing neighbourhood area for row: 100"
## [1] "Computing neighbourhood area for row: 200"
## [1] "Computing neighbourhood area for row: 300"
## [1] "Computing neighbourhood area for row: 400"
## [1] "Computing neighbourhood area for row: 500"
## [1] "Computing neighbourhood area for row: 600"
## [1] "Computing neighbourhood area for row: 700"
## [1] "Computing neighbourhood area for row: 800"
## [1] "Computing neighbourhood area for row: 900"
## [1] "Computing neighbourhood area for row: 1000"
## [1] "Computing neighbourhood area for row: 1100"
## [1] "Computing neighbourhood area for row: 1200"
## [1] "Computing neighbourhood area for row: 1300"
## [1] "Computing neighbourhood area for row: 1400"
## [1] "Computing neighbourhood area for row: 1500"
## [1] "Computing neighbourhood area for row: 1600"
## [1] "Computing neighbourhood area for row: 1700"
## [1] "Computing neighbourhood area for row: 1800"
## [1] "Computing neighbourhood area for row: 1900"
## [1] "Computing neighbourhood area for row: 2000"
#### 合并数据
sub_bys_test <- cbind(sub_bys_test, neighbour_area_res10)
####
head(sub_bys_test)
## tag species gx gy quadrat20 dbh status
## 1 BYS000001 SORBALNI 53.21 78.17 0304 54.7 0
## 2 BYS000002 POPUDAVI 115.82 79.36 0604 40.0 0
## 3 BYS000003 BERBCIRC 45.61 2.98 0301 6.4 0
## 4 BYS000004 PADUBUER 12.58 3.22 0101 6.5 0
## 5 BYS000005 PINUARMA 244.71 80.23 1305 44.2 0
## 6 BYS000006 LITSTSIN 20.92 68.87 0204 140.7 0
## area_of_neighbours_same_species_r_10
## 1 1899.35979
## 2 NA
## 3 183.85386
## 4 11.34115
## 5 5242.44635
## 6 NA
## area_of_neighbours_diff_species_r_10
## 1 18553.107
## 2 10102.828
## 3 10170.050
## 4 6330.403
## 5 9277.956
## 6 4614.992
#### 拟合广义线性混合模型
#### 各列数据标准化, 以便在参数图中进行比较相对重要性
sub_bys_test$dbh <- scale(sub_bys_test$dbh)
sub_bys_test$area_of_neighbours_same_species_r_10 <-
scale( sub_bys_test$area_of_neighbours_same_species_r_10)

sub_bys_test$area_of_neighbours_diff_species_r_10 <-
scale (sub_bys_test$area_of_neighbours_diff_species_r_10)
#### 设定广义线性混合模型
glmm_model_10m = glmer(status ~ dbh +
area_of_neighbours_same_species_r_10 +
area_of_neighbours_diff_species_r_10 +
(1+dbh|species)+(1|quadrat20),
data=sub_bys_test,
family = binomial(link="cloglog"))
## singular fit
tidy(glmm_model_10m)
## Warning in bind_rows_(x, .id): binding factor and character vector,
## coercing into character vector
## Warning in bind_rows_(x, .id): binding character and factor vector,
## coercing into character vector
## # A tibble: 8 x 6
## term estimate std.error statistic p.value group
## <chr> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 (Intercept) -4.62e+0 0.394 -11.7 9.18e-32 fixed
## 2 dbh -1.23e-1 0.347 -0.354 7.24e- 1 fixed
## 3 area_of_neighbours_sam… -8.53e-1 0.777 -1.10 2.73e- 1 fixed
## 4 area_of_neighbours_dif… 1.99e-1 0.280 0.712 4.76e- 1 fixed
## 5 sd_(Intercept).quadrat… 2.29e-7 NA NA NA quadra…
## 6 sd_(Intercept).species 0. NA NA NA species
## 7 sd_dbh.species 3.36e-8 NA NA NA species
## 8 cor_(Intercept).dbh.sp… NaN NA NA NA species
glance(glmm_model_10m)
## # A tibble: 1 x 6
## sigma logLik AIC BIC deviance df.residual
## <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 1 1 -58.3 133. 171. 117. 918
coefplot(glmm_model_10m)

当然, 实际研究中, 最好能考虑每个个体调查时间的间隔 offset, 或者考虑更复杂的随机效应,特比是针对不同种, 在数据量允许的情况下, 计算各个种生存状态的影响因素等。

参考文献

  1. 陈云,郭凌,姚成亮,韦博良,袁志良,叶永忠.暖温带⁃北亚热带过渡区落叶阔叶林群落特征.生态学报,2017,37(17):5602-5611.
  2. Zhu, Yan, et al. “Conspecific and phylogenetic density‐dependent survival differs across life stages in a tropical forest.” Journal of Ecology 103.4 (2015): 957-966.

繁花满树 (十六首)

1. 小村里正午的阳光

 

买好了回家的机票,

但愿这次一切平安顺利,

不要遇到大风雪。

2000公里3.5小时的飞行

比大雁更快

 

不在乎朋友圈有多少赞,

只愿家里一切安好。

没有人在乎你的孤独,

除了你自己,

因为孤独只有自己能理解

 

离乡十六年,

电脑、手机、ipad,

数字电视、数码相机、互联网,

QQ、微信、电子邮件、高铁, 

还有家家户户的小汽车….

还有DNA提取、基因组、PCR、Illumina,

R语言、大样地、红色名录、Maxent….

 

该来的就一定要来

该走的就一定要走

录音机、VCD、DVD、1.44M软盘、随身听、mp3….

仿佛正午的阳光

只维持一顿饭的功夫

烟一样消散

 

小村里只有捕鱼、耪地,

不需要动植物标本,

不需要多元回归树、最大熵和蒙特卡洛马尔科夫链….

小村能自给自足,

额外的都不需要,

小村里说话时第二声还是要压低一半。

 

在远方,

总会想起小村。

十六个春秋,

多少不认识的孩子出生了,

多少人曾在花季和雨季,

多少人去了远方

 

时间改变了你的容颜

不变的只有乡音

某一天正午的阳光

和低沉的西北风

 

2017年10月21日于大埔

 

2. 初冬的柿子

 

初冬的清晨

柿子挂满枝头

散发着温暖的光

静静守候

 

37度的温暖

照亮整洁的院子

也照亮那一片荒芜

还有深蓝的天

 

叶子落了

柿子还在

南国的清晨五点

北京也是五点

 

寒夜走了

天蒙蒙亮时

柿树下的灯光还是那么温暖

让你一下子回到了春天

 

3. 山楂

 

那时候

一小盆山楂

就是外面的世界

那天下午

送货的卡车洒了一些山楂在村里

这是村罐头厂对村民们的全部恩惠

人人有份

 

清晨的霜

还未散去

山楂就来了

山楂也就一直没有走:

在蓟县北山的树上

在东城路

在二道贩子的麻袋里

住满了山楂

 

山楂和山楂树

一年又一年

开花、结果

从不知疲劳

如同种山楂的人

要养活自己和正在读书的儿女

 

穿行在大街小巷的糖葫芦杆子

哪里有婚丧嫁娶

哪里下课、放学

就聚集在哪里

那是孩子们最喜欢的味道

 

倾斜着的铝锅里

绵白糖已经浓稠变黄

串好的山楂在里面打个滚

然后清脆地摔在湿木板上

就生出了晶莹剔透的翅膀

有了爬上竿子的资格

就在那一瞬间

 

三十年前的山楂籽从未发芽

山楂还是一样红

一样酸

蘸糖葫芦的人

现在开电瓶车

不再蘸糖葫芦

 

2017年10月18日

 

4. 清晨随想

 

哈佛、耶鲁、斯坦福、佛罗里达、奥胡斯、根特…..,

朋友圈里一长串大学的名字,

熟悉而陌生,

智慧在远方开枝散叶

如果没有互联网,

我只埋头于眼前的柴米油盐

 

梦见联合国专门派人教我怎样养鸡

怎样用水帘给鸡舍降温

怎样无损伤收鸡蛋

梦见派人教我怎样种桃子

怎样避免收获时伤到桃子

以免影响农产品的价格

……

凡事都要小心

 

四十岁的老屋里

假装停着那三十五岁的自行车

学校八点钟上课

现在已经9点05,

这堂课,

要么是数学

要么是物理

我深信,都是因为那课程

进入了一种让人听不懂的状态

我才会迟到

 

不知道为什么

人要在火柴盒中生存

也许因为这座城太小

 

楼道里人来人往

街上人来人往

街上的人各自行路

都不在乎

远方的大学和那边的风景

 

2017年10月9日清晨

 

5. 大埔的黄昏

 

大埔,

华灯初上,

深蓝的天空,

多了一抹昏黄

 

香港,

一个人的傍晚,

时间,

在公路旁流淌

 

来自南海的风,

带来了一弯月色;

林村河旁,

是否遍洒流光?

 

车走了,

明天还会不会来?

人生易老,

作伴好还乡

 

2017年9月28日于香港大埔

 

6. 倦

 

黑云压城:

暴风雨到来的一瞬间,

终于上了巴士,

外面又是倾盆大雨……

 

一年600次乘车,车上居然没有一张熟悉的面孔,

这些人从哪里来?

这些人会不会想家?

也许不会想

 

他们从没有背井离乡。

 

但是我为什么要离开故乡?

然后为什么要从零开始?

还不都是因为自己太无能,

太渺小……

 

朋友圈分享自己的感受:

其实都是为了慰藉自己的心,

让自己少些孤独和伤感,

请原谅我的自私

 

倦了:

你不停地索取,

我不停地给予,

从不懂怜悯或拒绝

 

孤独的雨夜,一个人听雨

仿佛一个人饮酒

窗外灯光昏黄……

我只想着回不去的故乡

 

7. 台风之夜

 

台风如过客,

来也匆匆,

去也匆匆。

 

回到多年前那个夏天的傍晚,

也许……

一切能重新开始

没有那一晚,

就不会有现在….

 

奋力追赶,

却依然落后,

也许根本不在正确的轨道上

 

你说我意气用事,

我比谁都更清楚自己;

追寻台风的脚步,

风里来,雨里去….

 

我愿沉醉在这雨中,

走走停停,

聆听,聆听….

 

8. 秋天快来

台风在辽阔的太平洋上转出一个大写的M,

也许它的征途是星辰大海,

我并不理会,

但是,

这是多好的广告

 

世界需要降温、降雨,

发展速度需要降,

房价需要降,

只是网速和工资都不要降….

 

改完稿子已经凌晨一点,

不知道世界上为什么要有那么多论文,

为什么要有那么多人做研究,

其实很多人只是在科研中寻求温饱

 

音乐还在响着,

下一首曲子是贝多芬的《命运》,

这星期还有一篇稿子要审….

…..

 

不想这么焦虑,

不想这样疲惫,

不想这样打拼,

背着厚厚的蜗牛壳,

我并不知自己被什么驱动,

在外国人的语言与文字间艰难地爬行

 

只希望秋天快来:

到那时候,

去收获满车的高粱和玉米,

一定要堆得老高,

同时收获满院子的金色阳光,

收获黎明前的露水,

还有院子里那棵玉簪花的阵阵香气

 

9. 明天就回去

 

月光照亮你

也照亮了安静的小村

 

你留住了宁静,

也留住了一样宁静的天空

没有路灯的小村

我们就只需要月光;

没有灯红酒绿的小村,

我们就只需要夜的沉寂

 

在那里长大,

一生一世就留在了那里:

十八年的日日夜夜,

乡音,

还有母亲的双眼,

都盼你回去

 

明天就回去:

回那里耕田、放牛、种菜,

回那里划船、逮鱼、做小本生意

再回到那平平常常的日子,

然后去五里以外赶集

那个只有半天的小集市….

 

明天就回去,

再不要四处流浪;

明天就回去,

回到皎洁的月光里

 

10. 天牛

 

这一刻,

你行走在一片风景里。

 

这一刻,

你忘记了曾经的孤独,

也许也忘记了自己。

 

这一刻,

你行走在一间大房子外面,

想看看谁在办公室里偷懒….

 

你行走在空中,

就像行走在树上;

你行走在树上,

阳光就填充了你的思想

 

11. 地球日植树

 

当你种下一棵树,

铺上防草垫,

就又为大地打了一块补丁

 

从枯黄到翠绿,

到山溪再次流淌,

你的双手成就了大自然的欢愉

 

一米高的芒草,

伴随着太阳,清风,白云,

掠过植树区

– 你需要漫长的等待

 

当你种下一棵树,

锤击钢铁的声音,

刺痛了耳膜,

也刺痛了大地

 

6月4日

于香港大埔

 

12. 夏天里的一朵花

 

没人记得一朵花,

在大地上

怎样绽放、枯萎,

怎样随风而逝,

怎样埋入黄土

 

没人记得一朵丝瓜花

在某一天傍晚

瓜熟蒂落

那时候火烧云正红彻天际

 

夏天里重复着夏天

草芥依然是草芥,

夏天里的一朵花,

随着火烧云消失在深蓝色的夜空里

没有人再记得

 

13. 时间里的花朵

 

—— 写给采标本的人

 

5月26日同金刚、慧玲、阿芳一起参观香港渔农自然护理署植物标本室,见到若干超过百年的植物标本,其中不乏Champion、Ford、Dunn、Levine、Maclure等名家的标本有感

 

你的工作默默无闻,

然而时间会记得,

一百年后的人们也会记得

 

清晰的记录,

一百年后,

依然映出你在那一刻是怎样屏息凝神:

在那一刻,

你想在时间的长河里留下一朵花,

让它永不凋谢;

 

仿佛一壶老酒,

芳香四溢

岁月留住了你想留住的花朵,

也留住了你的心

 

14. 霞光里的少年

 

遥想1997年初春里的一天,

一个十三岁的少年,

在寒夜里爬起身,

一个人到一里路以外的河边看海尔-波普彗星

 

寒气袭人,

东方泛白。

彗星高悬在东方的天空,

就像快要降落天际的羽毛球

 

满地白霜,

潮白河边,

脚下那一层薄冰,

咔咔作响

 

二十岁的河流沐浴在朝霞里,

还有河面上的一层浮冰,

以及二三里以外河堤上的树木

……

 

大地还在沉睡,

村庄就像一个婴儿,

做着自己甜美的梦

 

我只愿做一个渔夫,

撑船,

撒网,

收获这样的清晨和喜悦

 

二十年后,

在五千里之外,

大地还是大地

回忆起那一天,

少年又回到了那个清晨

 

2017年5月24日

于香港大埔

 

15. 大帽山以北

 

春天里,

 

大雾弥漫。

春天的天气完全不顾老板的理想:

我们一安排上山,

就要下雨。

 

春天的植树区,

海拔还是600米。

 

春天的大帽山北坡,

不管我们多着急,

还是只有两三个人在测量树木。

 

16. 繁花满树—-写给钟花樱桃

 

盼望你繁花满树,

盼望你果实挂满枝头,

盼望你不再孤独,

盼望你平安如意。

花非花,

雾非雾…

 

广义线性模型中的逻辑斯蒂回归

其实题目不太准确,这篇短文介绍的是二项分布线性模型, 也就是当响应变量为01时的线性模型,例如物种是否出现,病人是否需要住院,学生是否成功考入大学,英语四六级成绩是否及格等。逻辑斯蒂回归模型,是二项分布线性模型中的一种,也是最广泛的一种。

事情还要从1935年说起。那一年,英国伦敦大学学院的C.I. Bliss 在《Annals of Applied Biology》上发表论文The Calculation of the Dosage**-**Mortality Curve。这篇论文的表4,就是现在广泛用于逻辑斯蒂回归教学的beetle数据。该数据是C.I. Bliss从Strand在1930年发表的论文中摘出来的。

Bliss的这篇论文主要以杂拟谷盗**(Tribolium confusum)**为例,系统介绍拟合存活比例曲线的方法。杂拟谷盗是一种粮食害虫。当时生物学家将481只杂拟谷盗分成8组,每一组分别在暴露在不同浓度的二硫化碳5小时,之后记录每个组有多少只甲虫死了。由于甲虫对二硫化碳的反应只有两种可能,要么存活,要么死亡,所以这个数据集是典型的二项分布数据。

在这篇论文中,Bliss提出了一种连接函数,也就是事件发生与否,用转换以后的正态分布累计曲线去估算,称为Probit。实际上,二项分布线性模型的连接函数有三种,分别为logit, probit以及cloglog。 logit、probit以及cloglog都是统计变换,目的是将二项分布数据转换为一种形式,以便能用线性模型估计直接估计模型的参数。其中最常见的为logit,使用logit连接函数的二项分布回归称为逻辑斯蒂回归。logit是事件发生与是否发生的比例 (odds)的对数值,形为log**(y/(1-y)),称为log odds。cloglog是complementary log log的缩写,是将响应变量进行两次log变换, 公式为log(-log(1-y))**。 cloglog常用来拟合数据出现大量极端数值的数据, 例如,大样地的幼苗的负密度制约研究中,部分胸径等级的树苗只有很少一部分死亡,用cloglog能较准确捕捉到与树苗死亡相关性较强的环境因子, 如同种密度制约、光环境等。

下面用R代码演示如何进行二项分布回归,分别用logit, probit以及cloglog三种连接函数。

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
library(broom)
####表格形式的数据
####tabular form
####数据来源www.stat.ualberta.ca/~kcarrier/STAT562/comp_log_log
####beetle
####   LOGDOSE     NUMBER_OF_BEETLES  NUMBER_KILLED  COMP_LOG_LOGPROBITLOGIT
####1   1.691                59             6          5.7   3.4 35.0
####2   1.724                60            13         11.3  10.7  9.8
####3   1.755                62           18         20.9   23.422.4
####4   1.784                56            28         30.3  33.8 33.9
####5   1.811                63            52         47.7  49.6 50.0
####6   1.837                59            53         54.2  53.4 53.3
####7   1.861                62            61         61.1  59.7 59.2
####8   1.884                60            60         59.9  59.2 58.8
####>
####二硫化碳的浓度
LOGDOSE          <-c(1.6911.7241.7551.7841.8111.8371.8611.884 )
####各小组杂拟谷盗的头数
NUMBER_OF_BEETLES<-c(59,    60,    62,    56,    63,    59,    62,    60    )    
####杂拟谷盗经过二硫化碳熏蒸5小时后,死亡的个体数
NUMBER_KILLED    <-c(6,     13,    18,    28,    52,    53,    61,    60    )
####合并成一个数据框
beetle<-data.frame(NUMBER_OF_BEETLES,NUMBER_KILLED, LOGDOSE)
####第一种方法,数据表格式
####调用glm函数,注意连接函数的选择
mod_logit  <-glm(cbind(NUMBER_KILLED, NUMBER_OF_BEETLES -NUMBER_KILLED)~LOGDOSE,data=beetle,  family=binomial(link="logit") )
mod_probit <-glm(cbind(NUMBER_KILLED, NUMBER_OF_BEETLES -NUMBER_KILLED)~LOGDOSE,data=beetle,  family=binomial(link="probit"))
mod_cloglog<-glm(cbind(NUMBER_KILLED, NUMBER_OF_BEETLES -NUMBER_KILLED)~LOGDOSE,data=beetle,  family=binomial(link="cloglog"))
####Showing significance of the variables
tidy(mod_logit )

\## term estimate std.error statistic p.value
\##1 (Intercept) -60.74013 5.181870 -11.72166 9.871561e-32
\##2 LOGDOSE 34.28593 2.913213 11.76911 5.631446e-32

tidy(mod_probit)

\## term estimate std.error statistic p.value
\##1 (Intercept) -34.95614 2.648984 -13.19605 9.245343e-40
\##2 LOGDOSE 19.74103 1.488046 13.26640 3.625628e-40

tidy(mod_cloglog)

\## term estimate std.error statistic p.value
\##1 (Intercept) -39.52224 3.235649 -12.21463 2.596958e-34
\##2 LOGDOSE 22.01474 1.796996 12.25085 1.662370e-34

\####Showing AIC et al.
glance(mod_logit )

\## null.deviance df.null logLik AIC BIC deviancedf.residual
\##1 284.2024 7 -18.65681 41.31361 41.4725 11.11558 6

glance(mod_probit)

\## null.deviance df.null logLik AIC BIC deviancedf.residual
\##1 284.2024 7 -18.0925 40.18499 40.34388 9.986957 6

glance(mod_cloglog)

\## null.deviance df.null logLik AIC BIC deviancedf.residual
\##1 284.2024 7 -14.85619 33.71237 33.87126 3.514334 6

\####绘图Visualisingthe results
mortality_rate<-beetle$NUMBER_KILLED/beetle$NUMBER_OF_BEETLES
dose<-beetle$LOGDOSE
plot(mortality_rate~dose,xlab="Dose of Carbon Disulfide",ylab="MortalityRate of Beetles",main="BinomialRegression")
LOGDOSE_new=seq(min(dose),max(dose),length.out=200)
mod_logit_line <-predict(mod_logit,newdata=data.frame(LOGDOSE=LOGDOSE_new), type="response")
lines(mod_logit_line~LOGDOSE_new,col="blue")
mod_probit_line <-predict(mod_probit,newdata=data.frame(LOGDOSE=LOGDOSE_new), type="response")
lines(mod_probit_line~LOGDOSE_new,col="red")
mod_cloglog_line <-predict(mod_cloglog,newdata=data.frame(LOGDOSE=LOGDOSE_new), type="response")
lines(mod_cloglog_line~LOGDOSE_new,col="green")
legend("bottomright",title="Linkfunctions",legend=c("logit","probit","cloglog"),lty=c(1,1,1),col=c("blue","red","green"))

img

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
\#####第二种方法,每个个体生存状态的长数据格式。glm是可以接受这种格式的。
\#####按照个体来计
dose_surived<-
c(rep(1.691,59-6),
rep(1.724,60-13),
rep(1.755,62-18),
rep(1.784,56-28),
rep(1.811,63-52),
rep(1.837,59-53),
rep(1.861,62-61),
rep(1.884,60-60))
dose_dead<-c(
rep(1.691, 6),
rep(1.724,13),
rep(1.755,18),
rep(1.784,28),
rep(1.811,52),
rep(1.837,53),
rep(1.861,61),
rep(1.884,60))
status_survived<-c(
rep("alive",59-6),
rep("alive",60-13),
rep("alive",62-18),
rep("alive",56-28),
rep("alive",63-52),
rep("alive",59-53),
rep("alive",62-61),
rep("alive",60-60))
status_dead<-c(
rep("dead", 6),
rep("dead",13),
rep("dead",18),
rep("dead",28),
rep("dead",52),
rep("dead",53),
rep("dead",61),
rep("dead",60)
)

dose_long<-c(dose_dead,dose_surived)
status <-as.factor(c(status_dead,status_survived))

incidence_mod_logit <-glm(status~dose_long,family=binomial(link="logit"))
incidence_mod_probit <-glm(status~dose_long,family=binomial(link="probit"))
incidence_mod_cloglog<-glm(status~dose_long,family=binomial(link="cloglog"))

\####Showing significance of the variables
tidy(incidence_mod_logit )

\## term estimate std.error statistic p.value
\##1 (Intercept) -60.74013 5.181834 -11.72174 9.861985e-32
\##2 dose_long 34.28593 2.913192 11.76920 5.625873e-32

tidy(incidence_mod_probit)

\## term estimate std.error statistic p.value
\##1 (Intercept) -34.95613 2.649010 -13.19592 9.261453e-40
\##2 dose_long 19.74102 1.488061 13.26627 3.631968e-40

tidy(incidence_mod_cloglog)

\## term estimate std.error statistic p.value
\##1 (Intercept) -39.52224 3.235632 -12.21469 2.594819e-34
\##2 dose_long 22.01474 1.796986 12.25092 1.660982e-34

\####Showing AIC et al.
glance(incidence_mod_logit )

\## null.deviance df.null logLik AIC BIC deviancedf.residual
\##1 645.441 480 -186.1771 376.3542 384.7059 372.3542 479

glance(incidence_mod_probit)

\## null.deviance df.null logLik AIC BIC deviancedf.residual
\##1 645.441 480 -185.6128 375.2255 383.5773 371.2255 479

glance(incidence_mod_cloglog)

\## null.deviance df.null logLik AIC BIC deviancedf.residual
\##1 645.441 480 -182.3765 368.7529 377.1046 364.7529 479

大型森林样地样方的命名与坐标转换

大型森林监测样地一般是指面积在16公顷以上的样地,在样地内部, 所有胸径大于1cm的木本植物及其分枝都要测量平面直角坐标,胸径等。在调查过程中,一般是先确定样地范围,然后用全站仪打点,确定样地的四角,以及每个20m样方顶点位置,为了方便计算,一般以西南点为原点, x轴指向正东,向东为正,单位为m;y轴指向正北,向北为正,单位为m。

为了调查方便,一般先将样地划分成20m的样方,每个样方按照在xy轴出现的顺序命名。名字一般为4位,例如0518,前两位表示从原点开始算,向东计第5个20m样方,后两位表示从原点开始计,向北计第18个样方。因此,大样地西南角的样方名总是0101。对于东西方向宽400m,南北方向长500m的大样地,东北角的样方名为2025,西北角的样方名为0125,东南角的样方名为2001。

要在20m样方内部测量每棵树的xy坐标仍然困难。所以实际调查中一般是将20m的样方再进一步划分成16个5m*5m的小样方,每个5m的小样方均以自己的西南点为原点,xy轴的方向与20m样方相同。这样在调查中就可以较方便的测量每棵树的坐标。每个20m样地内的16个小样方一般按照蛇形顺序调查,以减少调查人员在样地内的走动。5m小样方习惯上一般命名为1到16。

按照这种调查方法,从野外调查获得的每棵树坐标位置实际上为该个体在5m小样方内的坐标。在生态学数据分析中,要进行空间分析、点格局分析、变换空间尺度时,需要每棵树在样地尺度的平面直角xy坐标。这就需要将5m的坐标按照样方名称等,转换为样地尺度的xy坐标。这也是大样地数据标准化的重要一步。

本文以一个东西宽400m*南北长500m的样地为例,简要介绍如何将调查数据转换为样地尺度。先生成模拟数据,再基于模拟数据演示如何处理。

调查后输入Excel的数据,20m样方的名称通常为0105, 0203, 0505,不过excel常常将名称自动转换为105, 203, 505等只包含三位数字;而有些样方号并不以0开头,例如1820, 2022,这些样方在Excel自动转换后包含四位数字。由于这会带来处理上的不便,所以最好统一为4位,在R中可以用stringr程序包的str_pad 函数,在3位数字的字符串前面加0,转换为0105,0203,0505等。

下面我们生成一套模拟数据,假设我们的样地设定在河南省内乡县宝天曼自然保护区,缩写为BTM。所有胸径大于1cm的,都已经挂牌,并已经测量了在5m样方内的横纵坐标位置。

假设样地内共调查到88325个个体,没有考虑分枝。每个个体有如下的信息:

  1. tag:树的号牌,原则上讲,从号牌上需要能看出每棵树所在的20m样方号,然后在每个样方号内顺序增加。因为这里是模拟数据,就暂时不考虑了。这里按照以下方式命名 BTM000001 - BTM088325;
  2. plot20_names:该个体对应的20m样方名;
  3. g5x:该个体在5m样方内的x坐标,单位为m;
  4. g5y:该个体在5m样方内的y坐标,单位为m;
  5. subplot5:该个体所在的小样方名称,按照蛇形顺序命名,从1-16;
  6. dbh:该个体的胸径,单位为cm
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
#### 以下代码先生成模拟的调查数据
library(stringr)
#### 生成模拟数据,假设整个样地有88325个个体
nindividual <-88325
#### 生成树牌号
tag <-paste("BTM", str_pad(1:nindividual, 6, pad ="0"), sep ="")
#### 生成20m样地的名称
plot20_x <- str_pad(1:20, 2, pad ="0")
plot20_y <- str_pad(1:25, 2, pad ="0")
names_temp <- expand.grid(plot20_x, plot20_y)
plot20_names <-paste(names_temp[,1],names_temp[,2], sep ="")
survey_plot20_names <-sample(plot20_names,nindividual, replace=TRUE)

#### 随机生成5m样地内,调查个体的坐标
g5x <-round(runif(nindividual)*5, 2)
g5y <-round(runif(nindividual)*5, 2)
#### 生成5m小样方的名称
subplot5 <-sample(1:16, nindividual, replace=TRUE)
#### 模拟生成每棵树的胸径dbh, 假设服从指数分布
dbh <-round(rexp(nindividual,rate =2)*50+1, 1)
#### 所有生成的数据合并到一个dataframe中
btmdat <- data.frame(tag, survey_plot20_names, subplot5, g5x, g5y, dbh)
#### 做简单排序
btmdat <- btmdat[order(btmdat$survey_plot20_names, btmdat$subplot5),]

############## 以上生成模拟数据结束 ####################
#### 以下代码用于转换5m坐标到大样地尺度的平面直角坐标
#######################################################


#### 生成定义5m样方在20m样方x位置的中间变量
btmdat$location5x <-rep(NA, nrow(btmdat))
btmdat$location5y <-rep(NA, nrow(btmdat))
#### 因为是蛇形调查顺序,所以5m的样方名要分别找出x轴和y轴的对应编号
btmdat$location5x[btmdat$subplot5 ==1]<-1
btmdat$location5x[btmdat$subplot5 ==2]<-2
btmdat$location5x[btmdat$subplot5 ==3]<-3
btmdat$location5x[btmdat$subplot5 ==4]<-4
btmdat$location5x[btmdat$subplot5 ==5]<-4
btmdat$location5x[btmdat$subplot5 ==6]<-3
btmdat$location5x[btmdat$subplot5 ==7]<-2
btmdat$location5x[btmdat$subplot5 ==8]<-1
btmdat$location5x[btmdat$subplot5 ==9]<-1
btmdat$location5x[btmdat$subplot5 ==10]<-2
btmdat$location5x[btmdat$subplot5 ==11]<-3
btmdat$location5x[btmdat$subplot5 ==12]<-4
btmdat$location5x[btmdat$subplot5 ==13]<-4
btmdat$location5x[btmdat$subplot5 ==14]<-3
btmdat$location5x[btmdat$subplot5 ==15]<-2
btmdat$location5x[btmdat$subplot5 ==16]<-1

#### 生成定义5m样方在20m样方y位置的中间变量
btmdat$location5y[btmdat$subplot5 ==1]<-1
btmdat$location5y[btmdat$subplot5 ==2]<-1
btmdat$location5y[btmdat$subplot5 ==3]<-1
btmdat$location5y[btmdat$subplot5 ==4]<-1
btmdat$location5y[btmdat$subplot5 ==5]<-2
btmdat$location5y[btmdat$subplot5 ==6]<-2
btmdat$location5y[btmdat$subplot5 ==7]<-2
btmdat$location5y[btmdat$subplot5 ==8]<-2
btmdat$location5y[btmdat$subplot5 ==9]<-3
btmdat$location5y[btmdat$subplot5 ==10]<-3
btmdat$location5y[btmdat$subplot5 ==11]<-3
btmdat$location5y[btmdat$subplot5 ==12]<-3
btmdat$location5y[btmdat$subplot5 ==13]<-4
btmdat$location5y[btmdat$subplot5 ==14]<-4
btmdat$location5y[btmdat$subplot5 ==15]<-4
btmdat$location5y[btmdat$subplot5 ==16]<-4

#### 将20m样方的名称补充完整为4位
btmdat$survey_plot20_names <- as.character(str_pad(btmdat$survey_plot20_names, 4, pad ="0"))
#### 提取20m样方名的前两位,作为20m样方的x坐标
x20 <-substr(btmdat$survey_plot20_names,start=1, stop=2)
#### 提取20m样方名的后两位,作为20m样方的y坐标
y20 <-substr(btmdat$survey_plot20_names,start=3, stop=4)
#### 计算每个个体的以大样地原点为原点的坐标
#### 无论是x轴,还是y轴,注意这里要-1
btmdat$gx <- g5x +(btmdat$location5x -1)*5+(as.numeric(x20)-1)*20
btmdat$gy <- g5y +(btmdat$location5y -1)*5+(as.numeric(y20)-1)*20
#### 去掉不需要的中间变量
final_btmdat <-subset(btmdat, select =!colnames(btmdat)%in%c("location5x", "location5y"))
head(final_btmdat)
summary(final_btmdat)

学英语记

自从初中一年级,接触Good Morning, Mr. Green 以来, 这么多年一直在学英语, 虽然从未学到多好。那时候课本是人民教育出版社的, Li Lei, Han Meimei,Lucy, Lily, Susan, Sue还有鹦鹉Poly:大家去摘苹果、过生日、放风筝、郊游、购物….第一次听到磁带中的中国人读英语, 虽然感觉发音都很正确, 总感觉缺点儿老外读的那种感觉。 特别是有一课, 有一个中国小孩儿问外国老太太的年龄, 老太太说, That’s a secret!大家都在笑老太太的发音。老师说, 在国外, 问人家年龄、是否结婚、一个月挣多少钱都是非常不礼貌的。这是文化的差异, 事情虽然很小, 我第一次知道还有这种忌讳。

英语难么? 其实并没有觉得, 初中时要学的单词那么少, 对话那么简单,很快就全部掌握了。 而且小测和考试, 我还常常能得全班最高分, 有时候甚至是满分。

不得不提的,是中央电视台当时播了一个叫《走向未来》的英语教学节目。这个教程从Nice to meet you 开始,每期一个主题, 穿插情景对话, 语法讲解,访谈,动画以及情景小品, 从开始最简单,到最后到相当高深的内容, 如议院、探险、石油钻井平台的工作、海关人员的访谈等。 我第一次感觉到课堂上的英语与生活中的英语有那么大的差别。 于是不惜将英语听力练习的磁带洗过, 守在黑白电视机前录制《走向未来》,一遍又一遍地听, 模仿BBC的口音。这是我后来英语发音的基础。我真切感受到, 那才是接近真实的英语, 就应该那么自然、流畅。差不多二十年后,2014年我去新加坡参加森林样地数据分析培训, 当时一位菲律宾的学员问我是在哪儿拿的博士, 我说是在北京, 她很惊讶,继续问,那为什么你英语发音很英式? 我说这主要是因为我跟着BBC的一个节目学的英语。

其实中学课本上的英语是相对有意思的, 但是相关的练习就非常枯燥。我甚至怀疑英语是否应该通过那样做题来学。 听力、选择、完形填空、阅读、作文, 难道真的能考察一个人的英语水平? 难道只有那样一遍一遍地做题, 人才能进步?

英语听力有时候也要绕一个圈子: 一个人买了去伦敦的车票, 然后迟到,没有赶上车。听力选项要问你, 这个人是不是在伦敦。说真的,到现在也没有去过伦敦,而且相信去过伦敦的初中同学也没几个。 我们真的不在乎那个没赶上车的人在哪儿。 但是这是听力题, 你听不懂, 就答不对,然后就可以跟班级前三名Bye bye了。

最难的是完形填空, 要想出合适的单词, 把一个完全不熟悉的故事编出来, 然后自己还要相信。 完形填空相信是很多人学英语的噩梦。 我也没有并没有什么高招。

作文还好,写点儿想写的话,无奈没什么书法天分, 总是觉得自己写的英文太难看。

听力、 选择、完形填空这样学英语的模式一直延续到中考、高考、博士入学考试。 一直到考博士时, 我还在学习那60课的《走向未来》。倒不是学得太慢: 这次是找到了视频, 将所有的采访内容, 一句一句写下来, 一遍听不懂, 再继续听, 最后将听写下来的内容, 背到滚瓜烂熟。当然, 这都是后来到北京的事情了。

高考后,到大学报到, 刚到大学门口, 有多失望就别提了: 我从来没有见过那种脏乱差。 虽然从小生活在农村, 但那时乡下各处的生活垃圾基本上是可以天然降解的, 所以并不是特别脏。 学校位于城中村,公滨路木材街上,下雨后门口泥泞不堪。 我看到学校的大门甚至有回家复读的冲动, 不过无论是家庭经济情况, 还是心理承受能力, 都不允许。

大学的英语课相当轻松, 考试也轻松。 平实成绩占很大一部分,所以但凡不缺课, 成绩差不多就通过期末考试了,至于有没有提高英语水平, 就见仁见智。 我们用的是浙江大学的教材,非常难。难的意思就是,我从来没有读懂过任何一篇课文,当然也对这套书没有任何印象。 不记得英语课是怎么上的, 试是怎么考的。大学时有一位美国还是加拿大的老太太做外教, 每个学生都要起一个英文名, 我不记得为什么给自己起了一个叫Tony的英文名,大概是与常见的随身听Sony有关吧, 要不就是受到莎士比亚威尼斯商人里面的安东尼奥启发, 觉得Tony这个名字不错, 因为Tony是Anthoy的昵称。 起了个英文名, 并不代表自己的英文就有多大长进了,相反, 还真没觉得有什么进步,Tony这个英文名自从上完那学期英语课后就没再用过。教辅书充斥着每个学生的生活,不知道今天是不是还是如此, 什么《英语周报》,王长喜英语练习,星火四六级, 以及后来的新东方,疯狂英语等等等等。有些教材让学生不停做练习, 认为可以巩固语法、熟悉词汇,通过阅读拓展词汇;有些教材让学生不断重复、大声朗读演讲名篇, 什么马丁路德金《我有一个梦想》, 丘吉尔什么什么演说,以便找出学英语的感觉。现在看来,都很可笑。

踏踏实实能让人进步的, 就是《新概念英语1-4册》, 而且, 每一篇都要背诵,烂熟于心, 这样词汇量和对英文的语感自然就出来了。各种练习题其实都不必。

前几天同Lisa和金刚一起聊学英语的事。他们说, 自己都是只考了一次大学英语六级,就通过了。我相当佩服, 因为我没有那么厉害。所以这里说说我通过英语四六级的事。那时候, 英语四级与大学的学位证挂钩, 也不知道是谁制定的这个政策。

我考入的是国家生物学理科人才培养基地,也就是所谓的生物学基地班,只有一个班,28个人。那时候很多人相信, 二十一世纪是生物学和计算机的世纪,在那几年,生物学和计算机异常火爆,我也不小心上了生物学的船,从此慢慢走向了植物生态。 由于我们专业的学生基本上是全学校最高分,普遍比一本线高出50-80分左右,学校和老师们对我们也很照顾:前几届学生也都非常争气, 学习氛围很好。 学院当然对我们也寄予厚望。允许我们大一下学期报考英语四级。幸运的是,在没有复习的情况下,我的英语四级居然考过了。四级通过,就可以考六级。我那时对学校基础课的老师失望到极点, 情绪低落, 成绩也排在中下游。由于上课时每堂课都要点名, 所以我并不缺课, 但是自己在后排翻《中国高等植物图鉴》或者《东北植物检索表》等书, 也就是觉得这些专业书还有点儿意思。

大学的基础课和专业课的教材不好, 也是一个问题。 那时候考试, 基本上要从练习册上划定范围, 但是我对做练习非常抵触。 主要是因为大学的正式课本主要是农科教材, 而这些教材对各种公式的原理、来源等大都介绍的不明不白,装帧和印刷也很差。也就是说,课本本身都讲不明白, 做相应的练习只是为了记忆这些公式和原理,大学仍然用这种灌输式的教学方式, 枯燥是必然的。 我当时想, 知识肯定不是这么来的。 于是到大学的图书馆,去一探究竟。

万幸的是, 学校拥有一个藏书十分丰富的图书馆, 生物学和农学的藏书, 对于农业院校是十分重要的。不过话又说回来, 虽然是农业大学, 但是其实图书馆的藏书还是比较全面的, 文学、历史、艺术、音乐等各种书籍, 应有尽有。 去年去海南拜访大学时候曾资助我的李庆章校长, 李校长说, 他当时特别重视图书馆的建设, 如果学生对学校的师资力量不满意, 还可以通过图书馆去弥补, 所以他在任时极为重视图书馆图书的更新和保存。 校长的高瞻远瞩, 救了我这个不听话的学生, 谢天谢地。由于我常去图书馆, 和图书管理员都混熟了, 甚至有几次还一起出来吃饭。 我借了《有机化学》、《动物学》、《普通生物学》、《植物学系统分类学》的英文教科书,努力去阅读。 虽然是九十年代或者八十年代的教材,有些是影印版, 但是内容实在是太丰富了。 我本身对英文不够敏感,阅读这些教材, 其实并没有让我的英语有多少长进, 不过确实拓宽视野,当时最重要的印象就是英文的教材真好, 讲得真清楚。

后来读博士后, 我才切身意识到, 世界上最新和最重要的科学研究成果,绝大部分是用英文写成的。 不能熟练阅读英文的论文和论著, 研究不可能做好, 而且同国际同行交流都成问题, 所以学好英文是有志青年们要留意的, 否则虽然身处国家队, 却有变成民科的风险。

继续回到四六级考试。可能是由于大学英语的教材太难, 我提不起什么兴趣, 也许是过了英语四级已经满足了毕业的要求, 我有报名参加英语六级考试, 但是又没有怎么努力。 终于大二考了两次也没有考过。第三次考六级是在大三上学期,好像是下午两点开始考,我一点半还在宿舍睡觉,对考试也有一种心灰意冷的状态。 宿舍的老大万里兄说:快起来,去试一试, 你试一下, 还有过的可能,不试, 连过的可能也没有。报名费已经交了,为什么不试试? 我想这说的很有道理。 于是抄起耳麦, 直奔考场。从宿舍到考场要20分钟。进入考场后找到自己的座位, 听力已经开始了。打开自己的电源, 发现耳麦没电,只能临时借了考场的备用耳机,开始答题。 也不知道是不是上天眷顾, 同样在考前没有做真题, 没有做模拟题, 直接裸考的我, 这次居然过了, 64.5分, 虽然刚刚过及格线。不过四六级这种考试, 通过了就好, 虽然自己英语水平其实并不怎么样。

由于我的硕士生导师李晶教授要出国, 帮我联系了在中科院植物所生物多样性与生物安全研究组联合培养。我还记得第一次见到自己将来的导师马克平研究员时的情景。马老师问:你英语六级过了吗? 我说:大三的时候通过了。马老师点点头。 之所以这么问, 是因为上面已经提到, 英语在中科院系统太重要了。 每个要读博士的学生, 都要通过中科院自己的博士入学考试。单词量要求为9000单词, 相比之下, 六级是6000单词, 四级是4000单词。

临近博士入学考试, 我还是要努力扩展自己的词汇量, 也加入了背单词大军, 虽然长期以来对背单词很不屑。 其实背单词并不太枯燥。 我先是把不认识的单词抄写到一个小本子上, 然后回忆单词的意思,回忆不起来的, 又抄到另外一张纸, 几轮下来, 单词量基本上上去了。 做足准备后, 我仍然只看了看之前的真题的题型就去考试了。成绩还可以。 这样我就成了中科院的博士生。

读博的过程是辛苦的。首先是选题并研读英文的论文, 然后学习理论和相关分析技术, 自己的研究成果要有创新性, 并且要用英文写出来并且发表。 这是很大的挑战, 特别是周围没有人跟你很好的讨论时更是如此。 博士生们往往很迷茫, 需要导师更多的指导与爱护。

学习生态学, 数据分析技术当然非常重要, 而新的分析技术和方法, 新的理论,文献全都是英文的, 不得不一头扎进去。这样, 又是三年。 直到有一天, 我需要用英文汇报自己的成果, 忽然之间傻了眼。 研究组邀请了美国密歇根州立大学的Nate Swenson博士报告, 并且帮博士生修改论文。 我当时想表达一句话, “本研究的结论与之前的研究结论是一致的”, 居然不知道怎样用英语表达,急的冒汗。幸好当时华南植物园裴男才博士在场帮忙翻译, Nate才明白我想说什么。

当时还有一件事触动了我。

由于博士毕业面临找工作, 我有两个选择, 一个是中南大学湘雅校区做师资博后, 另一个是去香港嘉道理农场暨植物园应聘 Plant Identification and Records Officer。那时候我博士期间工作的SCI论文还没有发表, 当时达不到中南大学的要求, 但是面试成绩还不错, 学校比较满意, 给我保留了一年的期限, 这一年内发表一篇SCI论文, 即可入职。这种情况,我只能先想想在嘉道理农场面试应该注意什么,怎么准备。面试还有两天的时间, 我忽然意识到面试可能是英文。怎么办? 总不能到时候卡在那里,眼睁睁看着工作机会从自己眼前溜走。于是我找了一些英文面试技巧, 并且认真准备了自我介绍以及常见问题的答案。大约50条。 谢天谢地, 面试时所有的问题, 都在我所准备的答案里面,所以那次面试应该还是给上司留下了不错的印象, 所以后来才能录用。那是我第一次面对两个金发碧眼的洋人, 面试官在一个小时里不断问你问题, 能否把握住机会, 就看自己怎么回答。 面试结束后, 部门主管很高兴, 还专门开车把我送回住处。最终我也被录取了。

虽然面试通过了, 不过我非常清楚自己的英语能力, 其实还停留很初步的阶段, 而且很多表达方式还很中式,口语更是一塌糊涂。

嘉道理的工作语言是英语。也许是对我特别关照, 全植物部二三十个坐办公室的同事,领导每个星期要和我面对面谈话超过8个小时,也就是每星期一天或者一天半的时间在跟我谈话。虽然说不上喜欢, 但是权当是英语听力练习吧。

经过不断的练习英语听力,去年的某一天, 我发现终于能不看字幕听懂英文纪录片和新闻,那种开心是很难形容的。后来还被公司找去做了两天中译英, 英译中的口语翻译。

二十年英语学习路,对于一个农村长大的人来说,艰辛而漫长。 学习英语的时间, 如果用来做别的事情, 能不能做得更好, 人生会不会更精彩? 我不知道。 对我来说, 英语打开了看世界的窗户, 让我有机会认识外国的文化、外国的新技术,认识国外的朋友。

如果再问我一次, 你愿意用这么多时间学英语吗? 我的答案是肯定的。

2017年10月7日于香港大埔

雪花飘落在英格兰

雪花飘落在英格兰,

一位年轻人拿起了相机…

一个人的二十四小时,

想怎样支配就怎样支配

 

三十天里,

总有阴晴圆缺…

从六年前的某一天起,

这里便是你的全部?

 

生命只在一呼一吸,

你真的希望就那样老去?

我不信,

这世界上的人都一样孤独;

我不信,

秋天的风酿不成烈酒

 

雪花也飘落在中国的大地上,

覆盖了最让人心疼的地方