ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SPSS计算香农多样性指数:从公式到统计检验的完整实操

SPSS计算香农多样性指数:从公式到统计检验的完整实操 前阵子帮一位做森林生态的朋友处理植被调查数据他问了我一个很现实的问题论文要求比较“退化林修复区”和“天然次生林”的物种多样性报告评审又说要“用标准方法算出来”那到底怎么算才既严谨又省事我直接给他推荐了香农多样性指数Shannon Diversity IndexH并且当场在SPSS里把30个样方的数据从零跑通了一遍。这篇文章就是那次实操的完整记录内容包括这个指数到底在测什么、野外数据怎么整理成SPSS能用的结构、公式怎么一步步变成计算变量和脚本语法以及最后怎么把一堆H值变成能进论文的图和检验结果。无论你是生态学专业的研究生还是需要处理群落调查数据的环境工作者照着这个流程做基本不会卡壳。1. 香农多样性指数的生态学直觉一个公式怎么衡量“不确定性”1.1 从信息熵到物种多样性香农多样性指数最早并不是为生态学设计的它来自香农在1948年提出的信息熵概念用来度量一个信息源产生信息的“不确定性”有多高。后来MacArthur等人在1950年代把这个思路引入生态学假如你闭着眼睛在群落里随机抓一个个体在你抓到它之前你对“它属于哪个物种”这件事有多不确定物种越多、各物种数量越均匀这种不确定性就越大反过来如果一个群落里只有一种生物你抓到前就已经知道答案不确定性为零。所以香农指数本质上是把“生态多样性”翻译成“信息量的期望值”。它不直接回答“这里有多少个物种”而是回答“这里的物种构成有多难以预测”。正是这一点让它在比较结构不同的群落时特别有用。公式长这样H -Σ_{i1}^{S} p_i ln p_i其中S是物种数p_i是第i个物种的相对多度也就是该物种个体数占总个体数的比例。生态学文献里大多用自然对数ln也有用log2或log10的后面我会专门说底数问题。1.2 符号拆解pi、ln和负号各在干什么很多第一次接触这个公式的人会被负号弄晕。其实把公式换个写法就清楚了H Σ p_i ln(1/p_i)p_i一定小于等于1所以ln(1/p_i)是一个非负的数。某个物种越稀少p_i越小ln(1/p_i)就越大但前面乘的权重p_i又越小。这个“越大”和“越小”放在一起决定了香农指数对稀有物种并不是无限放大的它给了每个物种一个与相对多度成比例的“信息量贡献”然后求期望。举个例子一个群落里有3个物种相对多度分别是0.5、0.3、0.2那么H -(0.5×ln0.5 0.3×ln0.3 0.2×ln0.2) ≈ -(0.5×(-0.6931) 0.3×(-1.2040) 0.2×(-1.6094)) ≈ 1.0297这个数值没有上限但有最大值约束。当所有物种个体数完全相等时H达到最大值ln S。比如同样3个物种各占1/3Hln3≈1.0986。换句话说香农指数把物种数和均匀度同时编码进了一个数字里。1.3 与Simpson、Margalef的差别以及什么时候换指数生态学里常见多样性指数不止香农一个我最常用的还有Simpson指数和Margalef指数。它们看问题的角度不太一样指数常用表达式生态侧重对稀有物种的敏感度适用场景ShannonH-Σp_i ln p_i群落信息量与不确定性较敏感群落间结构比较、多样性监测Simpson1-Σp_i²优势种集中程度不敏感优势种明显的群落、污染指示Margalef(S-1)/lnN物种丰富度粗算只看物种数快速探查不推荐单独使用实际操作里我一般同时算出Shannon和Simpson正文重点讲Shannon把Simpson作为稳健性检验放在补充材料里。如果两个指数指向的结论一致说明结果不太受稀有物种干扰如果不一致往往意味着两个群落的差异主要体现在稀有种或优势种上这本身就是一个值得写进讨论里的生态发现。2. 进SPSS之前把野外样方记录整理成“能算的表”2.1 长表和宽表为什么我强烈推荐长表SPSS本身不关心你的数据是“长格式”还是“宽格式”但它内置的聚合、拆分文件、计算变量等功能在长格式下用起来会顺手得多。所谓长表就是每一行代表“某个样方里的某个物种”包含三列核心信息样方ID、物种代码、多度。比如样方ID物种代码个体数Q01QUAC12Q01PIPI7Q01SYJA4Q02QUAC5Q02PIPI8Q02EUMA3Q02SYJA6宽表则是每个样方一行每个物种占一列列名就是物种名。宽表适合人眼浏览但在SPSS里做计算时很麻烦不同样方的物种数通常不一样字段名固定后要预留很多空列后续抽样如果碰到新物种还得手动加列改脚本非常容易出错。我用SPSS处理数据的原则是录入和清洗用长表统计分析前再用“重组”或透视功能把需要的数据转成宽表。这样每个操作都是可追溯的也方便做批量计算。2.2 多度测度选择个体数、盖度还是重要值香农指数的p_i是“比例”理论上只要用的是同一套多度测度公式都能算。但测度类型会直接影响H的生态含义不能混着用个体数草本群落、昆虫群落、土壤动物调查的默认选择直接数个体。最直观统计检验也最容易被接受。盖度植物群落里有些物种难以分株计数如苔藓、草本层用投影盖度百分比。注意总盖度可能因为分冠层叠加而超过100%这时应该把各物种盖度除以所有物种盖度之和转成相对盖度再代入公式。重要值森林调查里常用相对多度、相对频度、相对显著度的均值。重要值本身已经是0~100的标尺可以代入公式但结果的含义会偏向“生态位权重”。我个人建议能用个体数就用个体数因为它最符合香农公式的原始设定读者和审稿人也最容易理解。如果必须用盖度或重要值方法部分务必写清楚因为同一份数据用不同测度算出的H可能差出好几个档位。2.3 数据清洗统一物种代码、查重复、区分0和缺失在把数据导入SPSS之前至少要过一遍这几道关第一物种名统一。野外记录里经常出现同一物种的不同写法比如“白栎”和“Quercus fabri”、“Q. fabri”甚至还有调查员手误写错拼音。我习惯在Excel里维护一张“物种代码-拉丁名-中文名”对照表然后把代码填进数据表。SPSS中后续所有计算都用代码不在公式里直接纠缠学名。第二查重复记录。一个样方里同一个物种如果出现两行后面的计算会把两次多度当成两个物种的贡献直接抬高物种数、扭曲均匀度。SPSS里可以用“数据 标识重复个案”按样方ID和物种代码双重条件查看重复行确认后删除多余行。第三区分零值和缺失值。长表里没有出现的物种就是“没记录到”不需要填零但如果你手里是宽表数据转为长表后那些空列在SPSS里会变成缺失值不是0。后面计算时缺失值和0的处理逻辑不一样这一步不清干净聚合结果会莫名其妙多出很多“幽灵物种”。提示如果你拿着宽表可以用SPSS菜单“数据 重组 重组为长格式”或者直接跑VARSTOCASES命令VARSTOCASES /MAKE 个体数 FROM sp1 TO sp10 /INDEX物种代码(个体数) /KEEP样方ID.执行后再确认物种代码变量里的取值是否正常缺失值是否成片出现。3. 核心实操用SPSS把公式变成一列变量3.1 手写还是对话框为什么我建议直接写SyntaxSPSS里算香农指数没有现成的菜单你要自己组合“转换 计算变量”和“数据 聚合”来完成。第一次搞的话点对话框也能点出来但它有两个问题一是聚合对话框默认会把结果放到一个新数据集你需要在选项里改成“将聚合变量添加到活动数据集”二是全程点鼠标下次换一批数据又要重来一遍还容易点错字段。所以我建议直接写Syntax。SPSS的脚本语法没有那么神秘核心就是AGGREGATE、COMPUTE、MATCH FILES这几个命令。你把脚本存成.sps文件以后新数据往同一个模板里一套几秒钟出结果完全可复现。这也是很多生态学项目组内部流转的姿势。3.2 长格式数据计算H的完整脚本假设你的数据集长这样列名为“样方ID”“物种代码”“个体数”每个样方-物种组合占一行。下面是完整脚本我加了注释* 第1步给每条记录添加所在样方的总个体数. AGGREGATE /OUTFILE* MODEADDVARIABLES /BREAK样方ID /Total_NSUM(个体数). * 第2步计算相对多度pi. COMPUTE pi 个体数 / Total_N. * 第3步计算pi * ln(pi)注意保留正负号. COMPUTE p_ln_p pi * LN(pi). * 第4步按样方汇总所有物种的贡献. AGGREGATE /OUTFILE* MODEADDVARIABLES /BREAK样方ID /Sum_p_ln_pSUM(p_ln_p). * 第5步取负得到香农指数. COMPUTE Shannon_H - Sum_p_ln_p. * 第6步只保留每个样方第一条记录得到样方级结果. SORT CASES BY 样方ID. MATCH FILES /FILE* /BY 样方ID /LASTLastOne. SELECT IF LastOne. EXECUTE.逐行解释几个关键点MODEADDVARIABLES表示聚合结果直接作为新列添加到现有数据集而不是生成一个全新的数据集。这是整个流程能连续往下走的关键。/BREAK样方ID相当于“分组依据”SPSS会按样方ID分组计算。SUM(个体数)计算每个样方的总个体数N注意不能漏掉这个步骤否则后面pi无从谈起。LN()在SPSS里是自然对数。如果你要用log2把最后一步写成LN(pi)/LN(2)要用log10直接LG10(pi)。第6步的去重逻辑是SPSS里比较经典的处理方式先排序再用MATCH FILES生成一个标记变量LastOne最后只选出每个样方ID的最后一条记录。运行完这份数据就只剩“一行一个样方”的H表了。3.3 宽格式数据的替代写法如果你手里的数据已经是“一行一个样方、一列一个物种”的宽表就不适合用上面这套步骤因为AGGREGATE按样方分组没法直接处理多列。这时用DO REPEAT循环更高效* 假设物种列名是sp1到sp10新变量名l1到l10. NUMERIC l1 TO l10. COMPUTE Total_N SUM(sp1 TO sp10). DO REPEAT sp sp1 TO sp10 / l l1 TO l10. IF (sp 0) l (sp / Total_N) * LN(sp / Total_N). IF (sp 0 OR MISSING(sp)) l 0. END REPEAT. COMPUTE Shannon_H -SUM(l1 TO l10). EXECUTE.这段最关键的是先用两个IF把非正数和缺失值全部压成0。宽表转长表后没有记录的物种很容易以0或缺失值出现如果不处理ln(0)会让结果变成缺失整行数据全废。3.4 用手算小例子验证结果脚本跑通之后第一件事不是看全部分析结果而是手工验证一个样方。我在教程里习惯用一个小例子样方Q1里有白栎9株、马尾松1株样方Q2里有白栎5株、马尾松5株。样方Q1N10p10.9p20.1 H -(0.9×ln0.9 0.1×ln0.1) ≈ -(0.9×(-0.10536) 0.1×(-2.30259)) ≈ 0.3251样方Q2N10p10.5p20.5 H -(0.5×ln0.5 0.5×ln0.5) -(-0.6931) 0.6931这两个数字也符合直觉同样是10个个体、2个物种均匀分布时不确定性更大香农指数更高。我每次跑完脚本都会手动验一个样方确认求和、取负、去重都没有问题再放心进入下一步。4. 从H到生态结论统计检验、可视化和梯度分析4.1 单个H怎么读别脱离S和均匀度拿到样方级H表以后最忌讳的是只看H一个数字就下结论。我见过有人拿着两组H均值差0.3就声称“多样性显著提高”结果两组物种数一个20一个5均匀度完全不一样这个结论根本立不住。正确的姿势是把物种丰富度S和Pielou均匀度J一起拿出来看。J的公式是J H / ln S它衡量的是实测多样性占最大可能多样性的比例取值0到1。举个例子天然林H2.1、S25J2.1/ln25≈0.65人工林H0.9、S5J0.9/ln5≈0.56。这样看天然林不仅物种多均匀度也高多样性优势是双重的。如果反过来天然林H高但J低那说明它可能只是物种数大少数物种占据了绝对优势——生态修复策略就得换方向了。4.2 组间比较先看正态性再选t检验还是非参数检验当我们比较“修复区”和“天然林”两组样方的香农指数时H在这里是作为每个样方的观测值出现的。接下来用参数检验还是非参数检验不能拍脑袋。SPSS里的标准动作是“分析 描述统计 探索”因变量选Shannon_H因子变量选生境类型然后在“图”选项卡勾选“带检验的正态图”。小样本看Shapiro-Wilk检验。H因为是多个概率的对数之和样本量大时往往接近正态但并不意味着每份数据都正态一定要看检验结果说话。如果两组都满足正态性且方差齐看Levene检验就用“分析 比较均值 独立样本T检验”或者多组时用单因素ANOVA接LSD或Tukey做事后比较。如果正态性不满足改用“分析 非参数检验 旧对话框 2个独立样本”做Mann-Whitney U检验多组做Kruskal-Wallis H检验。画图层面我常用“图形 图表构建器”做误差条形图横轴是生境类型纵轴是H均值误差线用±2个标准误读者一眼就能看出差异性。SPSS老对话框里的箱线图也很好用特别适合展示离群样方。如果你想按生境分组看描述统计不要忘了“数据 拆分文件”功能按生境类型拆分后Explore和Frequencies都会自动输出分组结果。提示如果每组只有三四个样方参数检验很勉强即便正态性检验不拒绝也建议以非参数检验为主并报告效应量。审稿人通常会认可“小样本非参数检验”的做法。4.3 沿环境梯度把H当因变量做回归除了两组生境的比较生态学里还经常关心多样性随环境梯度的变化比如海拔、土壤pH、林分郁闭度等。这时H就是连续型因变量可以直接做线性回归。SPSS操作是“分析 回归 线性”因变量放Shannon_H自变量放环境变量。在“图”里勾选画散点图拟合线看趋势。需要注意的是如果样方在空间上是相邻或嵌套的简单回归可能受到空间自相关的影响严格来说要做空间回归或混合模型。但作为初步探索SPSS线性回归足以帮你判断趋势方向。我自己的经验是多样性-环境梯度的结果先画散点图看有没有明显的非线性如果出现倒U形趋势可以在模型里加一个二次项试试不要一上来就套直线。5. 实操中容易翻车的五个坑从数据到结论的隐性错误5.1 零值让LN(0)直接报错只要你在宽表格式里用过DO REPEAT大概率遇到过LN(0)的问题。SPSS里ln(0)不是一个显示为0的数而是会让计算变量变成缺失值而且这个缺失会沿着后续计算一路传染。我见过有人检查输出看到一堆缺失H第一反应是“数据有问题”其实只是没筛零值。修正思路我在3.3节已经写了计算贡献项之前用IF条件把非正数设为0或在计算时嵌套条件函数。数据量小时可以手动排序检查数据量大时必须写进语法里。5.2 对数底数不统一横向比较全盘出错香农指数用ln、log2、log10算出来的数字差得很多。同一个群落以2为底可能得到1.485以e为底是1.0297以10为底是0.4472。如果你在论文里写明底数那没问题但如果你拿别人用ln计算的结果直接和某软件默认的log2结果比结论就是错的。好在不同底数之间可以直接换算H_2 He / ln2H{10} H_e / ln10。我习惯把所有数据统一用自然对数方法部分写一句“Shannon index (H, natural logarithm)”就完事了。5.3 聚合产生的“幽灵记录”让样本量虚高这是SPSS里最隐蔽的坑。第3.2节的第6步如果省略你的数据仍然是“一行一个物种”的长表但每个样方的H都已经算好并重复显示在所有行上。接着你用“比较均值”去找两组差异时SPSS会把这个长表的行数当成样本量比如30个样方、平均每样方8个物种它可能认为n240标准差被严重压缩p值虚假地特别小结果完全不可信。我每次跑完聚合都会马上用“数据 标识重复个案”确认一下总行数是否和样方数一致。只有看到数据行数等于样方数再去跑统计检验。5.4 样方面积和抽样努力不匹配香农指数对物种丰富度很敏感而丰富度又直接受样方面积影响。同样是森林群落20m×20m样方算出来的H通常高于10m×10m样方。如果你在两块样地用了不同面积算出的H差异可能不是生态差异而是抽样努力差异。这种情况有两种处理思路一是尽量让所有样方面积一致这是调查设计阶段就该定的二是如果面积不一致需要先做稀疏化rarefaction或稀释曲线校正SPSS没有现成功能建议把数据导到R的vegan包或PAST软件里处理。别硬拿着面积不均的H去做t检验那基本等于给审稿人送把柄。5.5 把伪重复当成真重复最后一个坑更偏统计层面。同一个大样地里布设的10个小样方如果空间距离很近它们之间并不完全独立这时把它们都作为独立样方参与检验本质上是在重复计算同一个斑块的效应。比如你想比较“天然林”和“人工林”这两种生境的多样性但所有天然林样方集中在北坡同一条沟里那“生境”效应就可能和“坡向”“空间位置”效应混在一起。严谨的做法是把样地作为随机效应纳入混合模型SPSS里用“分析 混合模型 线性”可以处理。如果没有足够样地重复至少要在讨论里说明这个局限别把结论说得太满。6. 把香农指数嵌入长期监测扩展与自动化6.1 一个Syntax批量跑完多地块、多年份如果你手里不是一两个样方而是几十个地块、连续多年的监测数据写法也很简单在所有AGGREGATE命令的BREAK子句里加入地块、年份变量即可。比如AGGREGATE /OUTFILE* MODEADDVARIABLES /BREAK样方ID 地块 年份 /Total_NSUM(个体数).后面所有分组和去重都按“样方ID 地块 年份”三个变量一起操作。最后生成的样方级数据集里保留了地块和年份信息后续无论是做年际变化折线图还是混合模型都非常方便。这样一套脚本放进项目文件夹每年新数据来了直接跑省下的时间够多看十篇文献。6.2 顺手算出Pielou均匀度和其他多样性指标既然总个体数都算出来了再算物种数和均匀度就是顺路的事。在去掉重复之前加一段* 计算每个样方的物种数. AGGREGATE /OUTFILE* MODEADDVARIABLES /BREAK样方ID /RichnessN(个体数). * 计算Pielou均匀度. COMPUTE Evenness Shannon_H / LN(Richness).如果Richness1Evenness会变成缺失这是合理的单物种群落谈不上均匀度。Simpson指数也可以用同样思路算先算pi再求1-Σpi²或者用更简单的公式1-Σ(n_i(n_i-1))/(N(N-1))。这几个指标放在一个样方级表里写报告时一次就能输出完整多样性结果。6.3 与聚类分析结合让生态洞察更立体香农指数给人的是群落多样性的“单点汇总”但它抹掉了物种组成的细节。同样是H2.1的两个样方可能一个是“壳斗科优势”另一个是“禾本科优势”把这两个样方归为同一类会漏掉大量生态信息。这时候可以借助SPSS“分析 分类 系统聚类”把样方-物种多度表样方为个案、物种为变量做Q型聚类看哪些样方在物种组成上更接近再和H分组结果对照。如果聚类分出的群落类型和H分组的边界不一致通常意味着多样性数字虽然相近但群落演替方向或物种替代关系完全不同这正是生态学里最值得深入讨论的部分。6.4 什么时候该放弃SPSS换R或PASTSPSS在数据整理、描述统计、常规检验上非常好用但我不建议回避它的短板。如果你的研究涉及以下几项就该考虑R的vegan包、PAST或PRIMER需要做稀释曲线、物种累积曲线需要做β多样性分解、NMDS/PCoA排序、PERMANOVA检验数据量达到几百个样方、上千个物种SPSS聚合脚本会变得冗长且容易卡顿需要写一整套可重复的R Markdown分析流程发给合作者。实际操作中我经常是SPSS负责前期数据清洗和描述统计R负责多样性的高阶分析两者结合。这并不冲突反而比硬把一个工具用到头更高效。最后分享一个我自己每次都会做的习惯动作算完H后不要急着复制结果进论文先在Excel或手算里验一个样方再用R的vegan包快速跑一次对照。这个多花五分钟的动作能筛掉绝大多数低级错误。另外要记住H反映的是“一维”不确定性真正的生态洞察还需要结合丰富度、均匀度、功能性状和β多样性一起谈别让一个数字扛下所有结论。
返回列表