基于python滑动T检验的实现--结合MK突变确定突变点

滑动T检验

前面做了基于python的mk突变检验发现UF,UB曲线有较多相交点,于是通过查询相关代码,最终基于python实现了滑动T检验方法,用来检验MK趋势检验中突变点的显著性,确定突变点。

由于该结果用于论文,故最终结果图整体配色为黑色。

如果代码有什么不足之处,请大家指正。

原理

python代码

# coding:utf-8
from matplotlib import pyplot as plt
from tqdm import tqdm
import pandas as pd
import numpy as np
import os
import xlwt


# v:自由度
def get_tvalue(v, sig_level):
    t_values = pd.read_excel(r'../t_values.xlsx')
    return t_values[t_values['n'] == v][sig_level].values


# 传入时间序列以及待检验数据
# data:数据, step:步长, sig_level:显著水平
def huaTTest(data, step, sig_level):
    datacount = len(data)
    v = 2*step-2  # 自由度
    t_value = get_tvalue(v, sig_level)  # t检验值
    n1 = step
    n2 = step
    t = np.zeros(len(data))
    c = 1.0 / n1 + 1.0 / n2

    for i in range(step-1, datacount-step):
        data1 = data[i-step+1:i+1]
        data2 = data[i+1:i+step+1]
        # 计算均值
        x1_mean = data1.mean()
        x2_mean = data2.mean()
        # 计算方差
        s1 = data1.var()
        s2 = data2.var()
        sw2 = (n1*s1 + n2*s2)/(n1+n2-2.0)
        t[i - step + 1] = (x1_mean - x2_mean) / np.sqrt(sw2 * c)
    return t, t_value

plt.rcParams['font.family'] = ['SimHei']  # 设置字体
plt.rcParams['axes.unicode_minus'] = False

# 获取数据
path = ur'../单年均值.xlsx'
data_xls = pd.read_excel(path)

# 获取时间列以及casa模拟值
time = np.array(data_xls['year'])
casa = np.array(data_xls['casa'])
datacount = len(casa)

# 计算步长范围
if datacount % 2 == 0:
    steps = range(2, datacount/2)
else:
    steps = range(2, datacount/2+1)

dict = {}  # 存储显著变化的点信息
# 按照可取步长计算
for step in tqdm(steps, ncols=80, desc=u'滑动T检验进度'):
    t, t_value = huaTTest(casa, step, 0.05)

    t = t[t != 0]

    sig_values = []  # 存储显著变化值
    for i in range(len(t)):
        if np.abs(t[i]) > t_value:
            sig_values.append(time[i + step - 1])
    if sig_values:
        # 将结果存入词典
        dict_key = 'step'+str(step)
        dict[dict_key] = sig_values

    fig, ax = plt.subplots(figsize=(9, 5), sharey=True)

    fontdict = {'size': 12, 'color': 'k'}

    x = time[step-1:datacount-step]
    ax.set_xticks(x[::2])
    # ax.set_xlim((time[0], time[datacount-step]))
    ax.plot(x, t, c='k', linewidth=1.5, label=u'滑动T值', zorder=1)
    # 添加显著水平线
    ax.hlines(y=t_value, xmin=np.min(x), xmax=np.max(x), linewidth=1.5, linestyles='--', label=u'0.05显著水平')
    ax.hlines(y=-t_value, xmin=np.min(x), xmax=np.max(x), linewidth=1.5, linestyles='--', label=None)
    # 修改刻度线指向
    ax.tick_params(left=True, bottom=True, direction='in', labelsize=12)
    # 添加坐标轴标签
    ax.set_xlabel(u'年份 Year', fontdict=fontdict)
    ax.set_ylabel('T', fontdict=fontdict)
    # 设置图例
    ax.legend(bbox_to_anchor=(0.95, 0.95), facecolor='w', frameon=False)

    # 保存文件
    basepath = r'../IMG/huaT'
    filename = r'/huaTstep%d.png'%step
    savepath = basepath + filename

    # 检查保存目录是否存在
    if not os.path.exists(basepath):
        print('创建保存目录')
        os.mkdir(basepath)
        print('创建完成!')

    plt.savefig(savepath)

# 写入数据
# 创建workbool和sheet对象
workbook = xlwt.Workbook()
sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True)

# 写入头部信息
for head in range(len(dict.keys())):
    sheet1.write(0, head, label=dict.keys()[head])

# 写入数据
# 获取最大行数
max_row = max([len(dict.values()[i]) for i in range(len(dict.values()))])
for row in range(max_row):
    for col in range(len(dict.keys())):
        if row < len(dict.values()[col]):
            sheet1.write(row+1, col, label=int(dict.values()[col][row]))  # 将np.int32转换为int

# 保存结果
workbook.save(r'..\IMG\huaT\huaTSig.xls')

结果

在这里插入图片描述
结果文件
在这里插入图片描述

结果图: step==3

在这里插入图片描述

结果图: step==2

在这里插入图片描述

相关数据可查看

基于python的滑动T检验及相应数据

  • 3
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 滑动t检验是一种统计检验方法,通常用来比较在一个时间序列中不同时间的两组数据是否存在显著差异。在Excel中,可以使用Data Analysis工具中的“t检验:配对两样本”来实现滑动t检验。 首先,需要在Excel中准备好两组要比较的数据,并按照时间顺序排列。然后,打开Excel的“数据”选项卡,击“数据分析”按钮,在弹出的对话框中选择“t检验:配对两样本”,确定。 在弹出的窗口中,需要设置各参数。首先,选择需要比较的两列数据,再选择假设检验的类型和显著性水平。在“输出到”选项中,可以选择输出到现有工作表或新工作簿中。 除了常规的参数设置,滑动t检验还需要设置窗口大小和窗口步长。窗口大小是指每次比较所选取的数据数量,而窗口步长则是指窗口在时间序列中的移动距离。这两个参数的设置需要根据具体数据和问题进行调整。 最后,确定即可得到滑动t检验的结果。在结果中,会显示每个窗口下的t值和p值,以及是否显著差异的判断。根据结果的分析,可以得出不同时间的两组数据是否存在显著差异的结论。 ### 回答2: 滑动t检验是一种用于时间序列数据的统计方法。它主要用于检测某个时间段内的均值是否与整体均值有显著差异。在Excel中,可以使用数据分析工具中的t检验进行计算。 首先,需要准备数据,并在Excel中打开数据分析工具。在工具中找到“t检验”选项并击进入。在弹出的窗口中,选择需要检验的数据范围和置信水平,通常为95%或99%。如果是进行滑动t检验,则需要选择“滑动均值t检验”选项,并设置滑动窗口的大小。设置好参数后,可以击“确定”进行计算。 计算出结果后,Excel会输出t值、p值和置信区间等数据。其中,t值代表检验统计量的大小,p值代表检验结果的显著性,置信区间则代表均值的可信程度。如果p值较小(通常小于0.05),则意味着数据的均值在该时间段内与整体均值有显著差异。如果p值较大,则意味着两者均值差异不显著。 在实际应用中,滑动t检验可用于检测某个时间段内的销售量、股票涨跌幅、气温变化等数据的均值差异。通过该方法的应用,可以帮助我们更好地理解数据的趋势和变化,以指导我们的决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值