如何在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

