You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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")  

修正点说明:

  1. 统一标记的大小写:原代码中i="Xjuvenile"是小写j,与标记XJuvenile不匹配,会导致函数报错;
  2. 将合并后的点模式标记转为因子:避免字符型标记在函数中出现匹配问题;
  3. 若两个树种的原始点模式窗口不同,需先使用shift或rescale统一窗口,再进行superimpose;
  4. 若要更精准的非齐次分析,可通过lambdaI和lambdaJ参数为目标类型单独拟合强度模型(如lambdaI=ppm(XY, ~marks))。

内容的提问来源于stack exchange,提问作者Puion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:47:06