如何计算spatstat中Kcross曲线(红虚线与黑实线)间的面积?
计算spatstat中Kcross观测曲线与理论曲线的面积差
问题背景
我正在使用spatstat包运行多类型交叉K函数(Kcross),数据集和绘图脚本如下:
df <- read.csv(file = "trees_rocks.csv") df.test <- filter(df, Class %in% c("TREE", "ROCK")) x.range <- range(df.test$coord_x) y.range <- range(df.test$coord_y) test.ppp <- ppp( df.test$coord_x, df.test$coord_y, x.range, y.range, marks = factor(df.test$Class)) plot(envelope(test.ppp, Kcross, nsim = 10), xlim = c(0, 100))
生成的图能展示聚类程度,但我需要更精确的量化指标:如何计算红虚线(理论期望)与黑实线(观测值)之间的面积?
我尝试过auc()函数,但因不清楚无协变量时的用法而受阻。
解决方案
步骤1:保存envelope计算结果
先不直接绘图,将envelope()的输出存储为对象,方便后续提取数据:
env <- envelope(test.ppp, Kcross, nsim = 10, xlim = c(0, 100))
步骤2:提取曲线数据
envelope对象包含了关键数据列:
r:距离序列obs:Kcross的观测值theo:Kcross的理论期望值(完全空间随机下的结果)
提取代码:
r_vals <- env$r obs_vals <- env$obs theo_vals <- env$theo
步骤3:计算曲线间的面积差
两条曲线间的面积等价于观测值与理论值差值曲线的积分,可以用两种方法实现:
方法1:使用spatstat的auc()函数
直接对差值曲线计算曲线下面积:
# 计算观测值与理论值的差值 diff_vals <- obs_vals - theo_vals # 计算差值曲线的积分(即两条曲线间的面积) area <- auc(r_vals, diff_vals)
- 若差值有正有负,结果为净面积;若需要总面积(忽略正负),先对
diff_vals取绝对值:diff_vals <- abs(obs_vals - theo_vals)
方法2:基础R梯形积分
用梯形法手动计算积分,原理是将曲线分割为多个梯形求和:
diff_vals <- obs_vals - theo_vals # 梯形积分公式 area <- sum(diff(r_vals) * (head(diff_vals, -1) + tail(diff_vals, -1)) / 2)
步骤4:可视化验证(可选)
可以绘制差值曲线并填充面积,验证计算结果的合理性:
plot(r_vals, diff_vals, type = "l", xlab = "距离", ylab = "观测Kcross - 理论Kcross") # 填充差值曲线与x轴之间的区域 polygon(c(r_vals, rev(r_vals)), c(diff_vals, rep(0, length(diff_vals))), col = rgb(0,0,1,0.2), border = NA)
内容的提问来源于stack exchange,提问作者Wolfgang
相关产品推荐
相关产品推荐

