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

基于Shapiro-Wilk检验验证SPI指数正态分布的问题咨询

SPI指数正态分布检验的疑问与问题排查

核心疑问

  • 不确定Shapiro-Wilk检验中该用$fitted、$p.value还是$w
  • 不清楚是否需要将时间序列转换为数据框
  • 理论上SPI应服从正态分布,但检验得到p值0.0019,拒绝原假设,怀疑操作有误

用到的R代码

install.packages("SPEI")  
install.packages("readr")
library(SPEI)
library(readr)

options(scipen=999)

df <- read_delim("https://raw.githubusercontent.com/victoresende19/testing/main/PRECPT.csv", 
                   ";", escape_double = FALSE, locale = locale(decimal_mark = ","), 
                   trim_ws = TRUE)

##### SPI #####
SPI12 <- spi(ts(df$`PRECIPITACAO`, freq = 12, start=c(1992, 1)), scale = 12)
plot(SPI12)

#Teste de normalidade
SPI_shapiro <- shapiro.test(SPI12$fitted)$p.value

问题解析与解答

1. Shapiro-Wilk检验的输出解读

  • shapiro.test()返回的结果中:
    • $statistic(即W值)是检验统计量,取值越接近1,数据越符合正态分布;
    • $p.value是判断是否拒绝原假设的核心指标:若p值小于常用的显著性水平(如0.05),则拒绝“数据服从正态分布”的原假设。你提取$p.value的操作是完全正确的。

2. 检验对象与数据格式

  • SPI12$fitted就是spi()函数计算得到的SPI指数序列,直接用这个向量做正态性检验是正确的,不需要转换成数据框。

3. p值显著的可能原因及排查方向

(1)样本量的影响

Shapiro-Wilk检验对大样本极度敏感——哪怕数据只是轻微偏离正态,只要样本量足够大(比如超过300),就容易得到显著的p值。这种情况下检验结果的实际参考意义有限,建议结合可视化判断:

# 绘制SPI12的直方图
hist(SPI12$fitted, breaks = 20, main = "SPI12 分布直方图", xlab = "SPI12")
# 绘制Q-Q图,观察数据是否贴合正态分布直线
qqnorm(SPI12$fitted)
qqline(SPI12$fitted)

如果直方图近似钟形、Q-Q图上的点大部分贴合直线,即使p值显著,也可以认为数据近似服从正态分布。

(2)SPI计算的参数或数据问题

  • 检查降水数据:确认是否存在缺失值、极端异常值,这些会干扰SPI的计算结果,导致分布偏离正态;
  • 核对spi()函数参数:freq=12是否匹配你的数据时间频率(月度数据是对的),scale=12是否是你需要的时间尺度(12个月尺度的SPI),参数错误也可能导致结果异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:21