mk趋势检验和sen
时间: 2025-03-08 18:11:46 浏览: 82
### MK趋势检验方法
MK趋势检验是一种非参数统计测试,用于检测时间序列数据中是否存在单调上升或下降的趋势。该方法不依赖于特定的数据分布形式,因此非常适合处理具有不确定分布特性的环境科学和社会经济数据[^2]。
#### 计算过程
1. 对给定的时间序列 \( \{X_1, X_2,...,X_n\} \),对于每一对观测值 \( (i,j) \), 如果 \( i<j \) 并且 \( X_i<X_j \),则计数加1;反之减去1。
2. 所有配对比较后的总和记作 S ,当 S 显著偏离零时,则认为存在明显的变化趋势。
3. 进一步通过标准化转换得到 Z 统计量来衡量这种变化的重要性水平,并利用正态分布表查询对应的 p-value 来决定拒绝与否原假设(无显著趋势)。
```python
import numpy as np
from scipy.stats import norm
def mk_test(x):
n = len(x)
s = 0
for k in range(n-1):
for j in range(k+1,n):
s += np.sign(x[j]-x[k])
var_s = (n*(n-1)*(2*n+5))/18
if n<=10:
return 'Sample size too small'
z = (s - 1)/np.sqrt(var_s) if s>0 else (s + 1)/np.sqrt(var_s)
p_value = 2 * (1-norm.cdf(abs(z)))
return {'z': round(z, 4),
'p_value':round(p_value, 4)}
```
### Sen斜率估计
Sen斜率估计算法旨在提供一种稳健的方式估算线性回归模型中的斜率系数,在面对异常点的情况下表现尤为出色。此算法通过对所有可能的样本组合求取中位数值作为最终的结果,从而有效降低了极端值的影响程度[^1]。
#### 应用场景
- 当研究对象呈现出长期稳定增长/衰退模式;
- 数据集中可能存在大量噪声干扰项;
- 关心的是整体变动方向而非短期波动细节之处。
```python
def sen_slope(data_series):
slopes = []
N = len(data_series)
for i in range(N):
for j in range(i+1,N):
slope = (data_series[j][1]-data_series[i][1])/(j-i)
slopes.append(slope)
median_slope = sorted(slopes)[len(slopes)//2]
return median_slope
```
### 实际案例分析
在实际应用中,经常将这两种技术结合起来使用——先采用Sen斜率估计获得潜在的趋势信息,再借助MK检验验证这些发现是否具备统计学意义。例如,在气候变化领域,科学家们会运用这种方法论探讨气温升高现象的真实性及其背后的原因;而在水资源管理方面,则可用于监测河流流量随时间推移所发生的变化情况等[^3]。
阅读全文
相关推荐


















