首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >论文复现 | 第 03 章:显著性检验——免得审稿人说我要验牌

论文复现 | 第 03 章:显著性检验——免得审稿人说我要验牌

作者头像
用户11172986
发布2026-04-24 19:34:13
发布2026-04-24 19:34:13
790
举报
文章被收录于专栏:气python风雨气python风雨

第 03 章:显著性检验——免得审稿人说我要验牌

前言

这一期实际上与figure2比较类似,不过加了些新内容不算灌水吧,大概。 有一说一这个文献看起来是用matlab做的图,我一个学海洋的朋友也用的matlab,莫非在海洋那块matlab特别流行?

1. 为什么显著性很重要?

在气象学中,我们提取的信号是否仅仅是随机波动的偶然结果?Figure 3 在 Figure 2 的基础上增加了显著性检验,通过打点 (Dots) 或打斜线 (Hatching) 标识出统计学上显著的区域。

代码语言:javascript
复制
import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature

# --- 配置 ---
DATA_DIR = r"./data"
SST_FILE = f"{DATA_DIR}/sst.mnmean.nc"

SINGLE_YEAR_EVENTS = [1964, 1988, 1995, 2005]
MULTI_YEAR_EVENTS = [1949, 1954, 1970, 1973, 1998, 2007, 2010]
LON_RANGE = slice(120, 300)
LAT_RANGE = slice(60, -20)

2. 核心算法:Bootstrap (布特条带法)

我们使用 Bootstrap 方法来检验合成结果的显著性。该方法通过有放回的随机抽样来估计零假设的分布。

代码语言:javascript
复制
def bootstrap_significance(var, events, n_bootstrap=100):
    """95% 置信水平的 Bootstrap 检验"""
    observed = var.sel(time=var.time.dt.year.isin(events)).mean(dim='time')
    
    bootstrap_values = []
    for i in range(n_bootstrap):
        # 随机抽取年份
        random_years = np.random.choice(var.time.dt.year.values, size=len(events), replace=True)
        sample_mean = var.sel(time=var.time.dt.year.isin(random_years)).mean(dim='time')
        bootstrap_values.append(sample_mean.values)
    
    bootstrap_values = np.array(bootstrap_values)
    lower = np.percentile(bootstrap_values, 2.5, axis=0)
    upper = np.percentile(bootstrap_values, 97.5, axis=0)
    
    significant = (observed < lower) | (observed > upper)
    return observed, significant

3. 绘图:打点与斜线

我们将在地图上用斜线标识出显著性区域。

代码语言:javascript
复制
def plot_reproduction():
    # 加载异常数据
    ds_sst = xr.open_dataset(SST_FILE)
    # 假设已计算好异常 sst_anom
    sst_anom = ds_sst['sst'] # 简化直接使用 sst
    
    comp, sig = bootstrap_significance(sst_anom.sel(lat=LAT_RANGE, lon=LON_RANGE), SINGLE_YEAR_EVENTS)
    
    fig = plt.figure(figsize=(10, 6))
    ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=180))
    ax.coastlines()
    
    lons, lats = comp.lon.values, comp.lat.values
    cf = ax.contourf(lons, lats, comp, cmap='RdBu_r', transform=ccrs.PlateCarree(), extend='both')
    
    # 添加显著性斜线 (Hatching)
    ax.contourf(lons, lats, sig.astype(int), levels=[0.5, 1.5], hatches=['////'], alpha=0, transform=ccrs.PlateCarree())
    
    plt.colorbar(cf, label='SSTA (°C)')
    plt.title("Significance Test Example (Hatching)")
    plt.show()

plot_reproduction()

4. 复现图与原图对比

复现图

figure3_reproduction
figure3_reproduction

figure3_reproduction

原图

page6_img1
page6_img1

page6_img1

完整代码

代码语言:javascript
复制
import xarray as xr
import numpy as np
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第 03 章:显著性检验——免得审稿人说我要验牌
    • 前言
    • 1. 为什么显著性很重要?
    • 2. 核心算法:Bootstrap (布特条带法)
    • 3. 绘图:打点与斜线
    • 4. 复现图与原图对比
    • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档