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

如何在spatstat中叠加g函数获取种内与种间空间格局?

问题

我针对某一植物群落开展研究,目标之一是探究其种内与种间空间格局。我想确认:通过计算所有同种配对(种内)和异种配对(种间)的g函数并分别求和(例如种内$g_{11}+g_{22}+…+g_{nn}$),是否能得到群落的种内空间行为?

我的预期逻辑如下:
g种内 = ∑gᵢᵢ(覆盖所有物种);
g种间 = ∑gᵢⱼ(覆盖所有物种);
g总 = 所有点集的单变量g函数 = g种内 + g种间。

请问将g函数用于该任务时,此逻辑是否正确?

我尝试将该逻辑应用于lansing数据集,但未成功:叠加g函数后无法得到通用函数。代码如下:

data("lansing")
#所有物种
gall<-pcf(lansing, correction = c("Ripley"))
#种内行为
gb<-pcfcross(lansing, i="blackoak", j= "blackoak", correction = c("Ripley"))
gh<-pcfcross(lansing, i="hickory", j= "hickory", correction = c("Ripley"))
gm<-pcfcross(lansing, i="maple", j= "maple", correction = c("Ripley"))
gmi<-pcfcross(lansing, i="misc", j= "misc", correction = c("Ripley"))
gr<-pcfcross(lansing, i="redoak", j= "redoak", correction = c("Ripley"))
gw<-pcfcross(lansing, i="whiteoak", j= "whiteoak", correction = c("Ripley"))
gintra<- gb+gh+gm+gmi+gr+gw

查看对象类型发现,叠加原本为“fv”类型的g函数数据后,得到了“data.frame”对象。尝试将求和后的data.frame转换为“fv”对象时出现错误:

#尝试将dataframe转换为"fv"
gintra(fv)<- as.fv(gintra)
Error in gintra(fv) <- as.fv(gintra) : could not find function "gintra<-"

此外,查看求和后的dataframe发现,理论值从1变为6,这可能意味着我将该逻辑应用于g函数时存在矛盾,我对如何实现目标感到困惑。

补充细节:我的逻辑受重复格局的空间聚集函数启发(WIEGAND; MOLONEY, 2014,第248、252页;ILLAIN et al., 2008,第262页)。但仔细研究后发现,我遗漏了一个重要细节:在此情境下,对相关函数(pair correlation function)存在一个名为“isotropised set covariance”的分母,我不知道如何估算它。

关于叠加g函数后得到的dataframe转换问题,我已通过as.fv.data.frame命令将其转为fv对象,但绘图时无法显示g函数的行为。

参考文献:

  • ILLIAN, J. et al. Statistical analysis and modelling of spatial point patterns. John Wiley & Sons, Ltd: 2008. 534p.
  • WIEGAND, T.; MOLONEY, K. A. Handbook of spatial point pattern analysis in Ecology. Chapman & Hall (CRC): 2014. 512p.
解答

1. 核心逻辑的正误判断

你的初始逻辑不完全正确。g函数(pair correlation function)的定义基于单位面积内的点对密度,每个种内$g_{ii}$的基准是对应物种的点密度,而群落总g函数的基准是整个群落的总点密度。直接简单求和会忽略密度权重,导致理论值从1变为6(对应lansing的6个物种)——因为每个种内$g_{ii}$在完全空间随机下的理论值都是1,6个相加自然得到6,但这不符合群落水平g函数的定义(理论值应为1)。

正确逻辑是加权求和,权重为对应物种的点密度占总密度的比例,确保结果符合群落尺度的g函数定义。

2. 种内/种间g函数的正确计算方式

群落水平的种内g函数需按物种密度加权求和,公式如下:
$$g_{intra}(r) = \frac{1}{\lambda^2} \sum_i \lambda_i^2 g_{ii}(r)$$
其中$\lambda$是群落总点密度,$\lambda_i$是第i个物种的点密度,$g_{ii}(r)$是第i个物种的种内g函数。

对应的种间g函数公式为:
$$g_{inter}(r) = \frac{1}{\lambda^2} \sum_{i \neq j} \lambda_i \lambda_j g_{ij}(r)$$

按此计算后,$g_{intra}(r) + g_{inter}(r)$会等于群落总单变量g函数$g_{total}(r)$,且三者理论值均为1,符合预期。

3. fv对象处理与绘图问题

(1)错误的转换方式

你之前的gintra(fv)<- as.fv(gintra)是语法错误,正确的赋值方式应为:

gintra_fv <- as.fv(gintra)

(2)修复后的完整代码示例

基于加权求和思路,针对lansing数据集的正确实现代码:

data("lansing")

# 计算总密度和各物种密度
lambda_total <- density(lansing)
species <- levels(lansing$marks)
lambda_i <- sapply(species, function(sp) density(subset(lansing, marks == sp)))

# 批量计算每个种内g函数
g_list <- lapply(species, function(sp) {
  pcfcross(lansing, i = sp, j = sp, correction = "Ripley")
})

# 加权求和得到群落种内g函数(保持fv对象类型)
g_intra <- 0
for (i in seq_along(species)) {
  weight <- (lambda_i[i]^2) / (lambda_total^2)
  g_intra <- g_intra + weight * g_list[[i]]
}

# 直接绘图
plot(g_intra)

(3)绘图异常的解决

如果转换后绘图不显示g函数行为,可手动指定绘图变量:

# 明确指定x轴为距离r,y轴为Ripley校正后的g函数值
plot(g_intra, formula = ripley ~ r)

4. Isotropised Set Covariance的处理

你提到的isotropised set covariance($C(r)$)是g函数分母的组成部分,用于边界效应校正。在spatstat包中,pcf和pcfcross函数会通过你指定的校正方法(如Ripley校正)自动估算该值,无需手动计算。只有当你自行推导g函数公式时,才需要明确$C(r)$的计算。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:17:49