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

如何在spatstat中合并多个窗口的多组pcf结果及模拟包络?

在spatstat中合并多窗口PCF结果及模拟包络的解决方案

一、合并PCF曲线(已验证可行的规范方法)

首先确保所有PCF对象的r值网格一致,再对齐后取平均值,最后封装为标准fv对象:

# 假设已有多个pcf结果:pcf1, pcf2, pcf3
# 统一r值网格(可根据需求调整步长或范围)
common_r <- seq(0, max(c(pcf1$r, pcf2$r, pcf3$r)), length.out = 100)

# 重新采样所有PCF到统一r网格
pcf1_resampled <- predict(pcf1, newdata = data.frame(r = common_r))
pcf2_resampled <- predict(pcf2, newdata = data.frame(r = common_r))
pcf3_resampled <- predict(pcf3, newdata = data.frame(r = common_r))

# 计算平均PCF
mean_pcf <- rowMeans(cbind(pcf1_resampled, pcf2_resampled, pcf3_resampled))

# 封装为标准fv对象
merged_pcf <- fv(data.frame(r = common_r, pcf = mean_pcf), 
                 argu = "r", valu = "pcf", 
                 fmla = ~ r, 
                 alim = range(common_r),
                 ylab = "Pair correlation function",
                 desc = "Average PCF across multiple windows")

二、合并模拟包络(解决你遇到的核心问题)

直接对原包络上下界取平均或仅基于合并PCF重新生成包络都是错误的——包络是分位数统计量,正确做法是收集所有窗口的模拟PCF曲线,对每个r值重新计算分位数:

步骤说明

  1. 重新生成各窗口的模拟包络时,必须设置savefuns = TRUE以保存所有模拟的PCF曲线(而非仅包络上下界);
  2. 将所有窗口的模拟曲线对齐到统一r网格;
  3. 对每个r值,从所有模拟曲线中提取对应值,计算所需分位数(如95%包络取2.5%和97.5%分位数);
  4. 将平均PCF与新包络整合为标准envelope对象。

代码实现

# 假设每个窗口的envelope对象(已设置savefuns=TRUE):env1, env2, env3
# 统一r值网格
common_r <- seq(0, max(c(env1$r, env2$r, env3$r)), length.out = 100)

# 定义函数:重新采样单个窗口的所有模拟PCF曲线
resample_simfuns <- function(env, r_grid) {
  sims <- lapply(env$simfun, function(f) predict(f, newdata = data.frame(r = r_grid)))
  do.call(cbind, sims)
}

# 处理所有窗口的模拟曲线
sim1_resampled <- resample_simfuns(env1, common_r)
sim2_resampled <- resample_simfuns(env2, common_r)
sim3_resampled <- resample_simfuns(env3, common_r)

# 合并所有模拟曲线到一个矩阵
all_simulations <- cbind(sim1_resampled, sim2_resampled, sim3_resampled)

# 计算合并后的包络分位数(示例为95%置信区间)
lower_env <- apply(all_simulations, 1, quantile, probs = 0.025)
upper_env <- apply(all_simulations, 1, quantile, probs = 0.975)

# 整合为标准envelope对象
merged_env <- envelope(fit = merged_pcf, 
                       fun = NULL,  # 使用已计算的平均PCF
                       r = common_r,
                       lower = lower_env,
                       upper = upper_env,
                       observed = merged_pcf$pcf,
                       savefuns = FALSE)

# 绘制合并结果
plot(merged_env, main = "Merged PCF with Envelope Across Multiple Windows")

错误方法的原因解释

  • 直接平均原包络上下界:分位数的平均不等于平均的分位数,会导致包络统计意义失效;
  • 仅基于合并PCF重新生成包络:未利用所有窗口的模拟数据,无法反映多窗口的整体变异,统计推断逻辑不成立。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:32:35