关于pcfcross、markconnection与markcorr函数结果差异的技术问询
多树种生活史阶段空间相关性分析问题解答
问题背景
拟分析不同树种不同生活史阶段的空间相关性,采用spatstat包中的pcfcross、markconnect和markcorr三个汇总统计函数,但所得结果存在差异,甚至markconnect与markcorr的结果相互矛盾。以长叶松(longleaf pine)数据为示例,依据标记值将其划分为幼苗(sapling)、幼树(juvenile)和成树(adult)三个生活史阶段,原本预期各函数结果趋势一致,但实际不符。调整代码后,成树vs幼苗、成树vs幼树两组结果匹配良好,但幼树vs幼苗组的pcfcross.inhom与markconnect结果仍存在差异。
具体疑问解答
1. 幼树vs幼苗组结果差异的解释
这三个函数的统计定义和核心关注的空间关联维度完全不同,出现差异是正常的,尤其在幼树和幼苗这类格局更复杂的组中:
pcfcross.inhom:非齐次交叉点对相关函数,核心是衡量距离r处,类型i点周围出现类型j点的局部密度与全局平均密度的比值,聚焦于空间密度的关联,对密度的非均匀性更敏感。markconnect:标记连接函数,衡量的是从类型i点出发,在距离r范围内连接到类型j点的概率,本质是点之间的“连接概率”,而非密度。当启用normalise=T时,它是相对于随机标记的期望比值,但如果幼树和幼苗的数量差异大、局部密度波动剧烈,或者校正方法的适配性不同,都会导致结果和pcfcross.inhom偏离。- 此外,幼树是幼苗存活竞争后的阶段,两者的空间分布可能存在尺度依赖的差异:比如幼苗集中在微生境,而幼树是扩散/竞争后存活的个体,不同函数对这种尺度关联的捕捉能力不同,也是差异的来源。
2. 多类型点模式下markcorr的简化写法
无需单独构建仅含两类的新ppp对象,直接在原始多类型点模式上操作即可,关键是通过自定义f函数筛选目标类型,并在模拟时限制标记打乱的范围:
library(spatstat) # 基于长叶松多类型点模式Y(包含Sapling/Juvenile/Adult)分析幼树vs幼苗 envelope(Y, fun=markcorr, # 自定义函数:仅关注幼树和幼苗之间的配对 f=function(m1, m2) { (m1 == "Juvenile" & m2 == "Sapling") | (m1 == "Sapling" & m2 == "Juvenile") }, # 模拟时仅打乱幼树和幼苗的标记,保持成树标记不变 simulate=expression(rlabel(Y, restrict=marks(Y) %in% c("Juvenile", "Sapling"))), correction="best", nsim=199, nrank=5, kernel="epanechnikov")
restrict参数限定了随机标记仅作用于目标两类,避免其他类型的干扰;- 自定义
f函数精准筛选了需要分析的配对组合,无需拆分点模式。
3. 两树种生活史阶段关联代码的修正与验证
你的代码框架是正确的,但存在几个细节问题需要修正:
library(spatstat) # 假设Xpattern、Ypattern是同一窗口下的两个树种点模式 X <- cut(Xpattern, breaks=c(0, 10, 30, Inf), labels=c("XSapling", "XJuvenile", "XAdult")) Y <- cut(Ypattern, breaks=c(0, 10, 30, Inf), labels=c("YSapling", "YJuvenile", "YAdult")) XY <- superimpose(X, Y) # 关键:将标记转为因子,避免字符型标记的匹配问题 marks(XY) <- as.factor(marks(XY)) # pcfcross.inhom分析(修正大小写错误) par(mfrow=c(2,3)) pcf1 <- plot(envelope(XY, fun=pcfcross.inhom, i="XAdult" , j="YJuvenile", correction="best",nsim=199, nrank=5), main="XAdult vs YJuvenile") pcf2 <- plot(envelope(XY, fun=pcfcross.inhom, i="XAdult" , j="YSapling", correction="best",nsim=199, nrank=5), main="XAdult vs YSapling") pcf3 <- plot(envelope(XY, fun=pcfcross.inhom, i="XJuvenile" , j="YAdult", correction="best",nsim=199, nrank=5), main="XJuvenile vs YAdult") # 修正原代码中Xjuvenile的小写j问题 pcf4 <- plot(envelope(XY, fun=pcfcross.inhom, i="XJuvenile" , j="YSapling", correction="best",nsim=199, nrank=5), main="XJuvenile vs YSapling") pcf5 <- plot(envelope(XY, fun=pcfcross.inhom, i="XSapling" , j="YAdult", correction="best",nsim=199, nrank=5), main="XSapling vs YAdult") pcf6 <- plot(envelope(XY, fun=pcfcross.inhom, i="XSapling" , j="YJuvenile", correction="best",nsim=199, nrank=5), main="XSapling vs YJuvenile")
修正点说明:
- 统一标记的大小写:原代码中
i="Xjuvenile"是小写j,与标记XJuvenile不匹配,会导致函数报错; - 将合并后的点模式标记转为因子:避免字符型标记在函数中出现匹配问题;
- 若两个树种的原始点模式窗口不同,需先使用
shift或rescale统一窗口,再进行superimpose; - 若要更精准的非齐次分析,可通过
lambdaI和lambdaJ参数为目标类型单独拟合强度模型(如lambdaI=ppm(XY, ~marks))。
内容的提问来源于stack exchange,提问作者Puion
相关产品推荐
相关产品推荐

