爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 22325|回复: 25

[求助] 有关MK检验的问题

[复制链接]
发表于 2011-12-8 14:55:56 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
请问有人对魏凤英老师在《现代气候统计诊断与预测技术》一书中讲解MK检验时用到的上海1900-1990年91年平均温度的例子做过实习吗?

为什么我用书中的数据作出的检验结果和书中不一致,但是用同事已经做过的MK检验数据和结果对比是一致的。
出现这种情况要么就是我和同事关于MK检验的算法编写有错误,要么就是书中的数据和检验结果不一致。

1.png 3.png 2.png
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2011-12-8 15:00:19 | 显示全部楼层
第二章图中红色的为UB线黑色的为UF线

对比两张图中UB和UF交点位置不一样,书中为1921,而我检验的结果是1931

本以为可能是我的程序写的有问题,但是拿同事已经做过检验的数据经行对比,得出的UF\UB数据是一致的。

密码修改失败请联系微信:mofangbao
 楼主| 发表于 2011-12-8 15:10:56 | 显示全部楼层
这里是有关MK检验的代码
  1. class Mann_Kendall
  2.     {        
  3.         private float[] _myUF;
  4.         private float[] _myUB;

  5.         public float[] UF
  6.         { get { return _myUF; } }

  7.         public float[] UB
  8.         { get { return _myUB; } }

  9.         public Mann_Kendall(List<float> list)
  10.         {
  11.             float[] myArry = list.ToArray();
  12.             list.Reverse();
  13.             float[] myRevArry = list.ToArray();

  14.             CalculateUF(myArry);
  15.             CalculateUB(myRevArry);
  16.         }

  17.         public Mann_Kendall(float[] arry)
  18.         {           
  19.             float[] tempArry = new float[arry.Length];
  20.             Array.Copy(arry, tempArry, arry.Length);
  21.             Array.Reverse(tempArry);

  22.             CalculateUF(arry);
  23.             CalculateUB(tempArry);
  24.         }

  25.         private void CalculateUF(float[] x)
  26.         {
  27.             _myUF = GetResult(x);
  28.         }

  29.         private void CalculateUB(float[] x)
  30.         {
  31.             float[] result = GetResult(x);
  32.             List<float> listUB = new List<float>();
  33.             foreach (float item in result.Reverse())
  34.             {
  35.                 listUB.Add(-item);
  36.             }
  37.             _myUB = listUB.ToArray();
  38.         }

  39.         private float[] GetResult(float[] x)
  40.         {
  41.             List<int> listR = new List<int>();
  42.             for (int i = 0; i < x.Length; i++)
  43.             {
  44.                 int sum = 0;
  45.                 for (int j = 0; j <= i; j++)
  46.                 {
  47.                     sum = x[i] > x[j] ? sum + 1 : sum;
  48.                 }
  49.                 listR.Add(sum);
  50.             }

  51.             float[] U = new float[listR.Count];
  52.             for (int i = 0; i < listR.Count; i++)
  53.             {
  54.                 if (i == 0)
  55.                 { U[i] = 0; }
  56.                 else
  57.                 {
  58.                     int s = 0, n = i + 1;
  59.                     float e = 0, var = 0;
  60.                     e = n * (n - 1) / 4f;
  61.                     var = n * (n - 1) * (2 * n + 5) / 72f;
  62.                     for (int j = 0; j <= i; j++)
  63.                     {
  64.                         s = s + listR[j];
  65.                     }
  66.                     U[i] = Convert.ToSingle(Math.Round((s - e) / Convert.ToSingle(Math.Sqrt(Convert.ToDouble(var))), 2));
  67.                 }
  68.             }

  69.             return U;
  70.         }  

  71.     }
复制代码
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2011-12-8 17:18:15 | 显示全部楼层
同样的数据,做的滑动T检验,取滑动步长为10年,虚线为0.05水准线-2.89。
分析结果显示突变年份应该在1930年左右,
可以看出我的MK检验结果应该没问题
4.png
密码修改失败请联系微信:mofangbao
 成长值: 0
发表于 2011-12-8 22:03:56 | 显示全部楼层
麻烦楼主把你的测试数据传上来吧,我做过mk,曾经也把mk的程序发在论坛了,刚刚,不,从下午开始就想来测试一下,但是却发现敲了几个小时,还是没敲对!!!!!!!!!!!
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2011-12-8 22:24:55 | 显示全部楼层

数据在单位电脑,明天上班发。
麻烦版主帮忙检验下看看到底是我的问题还是书上的图有问题。
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2011-12-9 08:42:24 | 显示全部楼层
数据如下,麻烦版主帮忙测试一下

data.txt

975 Bytes, 下载次数: 79, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao
发表于 2011-12-12 14:17:15 | 显示全部楼层
baonan0811 发表于 2011-12-9 08:42
数据如下,麻烦版主帮忙测试一下

楼主,我给你做了一下MK检验,结果与魏凤英老师的相同,结果见附件j:\m-k.png
密码修改失败请联系微信:mofangbao
发表于 2011-12-12 14:42:23 | 显示全部楼层
累计距平结果见下图:大概1935年为突变明显年,所以各种统计方法结果不一致,多互相比较,采取一种有效的,另外亦可以用小波分析查看突变年,这里我就不做了j:\累计距平.png
密码修改失败请联系微信:mofangbao
发表于 2011-12-12 15:02:11 | 显示全部楼层
另外,按照你的滑动T检验,你取的是两边10年步长,如1900-1909--1910-1919,求得的第一个统计值赋给了1909年,既然是滑动,所以这里我赋给1901-1909里面任何一年都是可以的,所以你说通过滑动T检验的结果来验证你的MK结果是正确的是不合理的。还是那句话,多比较几种检验方法,找个合适的。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表