爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 14155|回复: 6

线性回归去除enso等信号的影响(程序分享)

[复制链接]

新浪微博达人勋

发表于 2018-10-26 20:30:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 happyaliyun 于 2018-10-26 20:37 编辑

线性回归拟合去除ENSO信号:指数为自变量,对其做一元线性回归拟合,拟合方程的残差即表示统计上与ENSO 无关。
变量与ENSO做回归,再用原来的变量减去回归后的Y,
得到去ENSO趋势的变量:Y-(ax+b)
a=Cov(nino,z*)/Var(nino),协方差/方差
b=Ymean-aXmean
下面是ncl程序去除enso信号,对于去除iod等信号是一样的方法
;去除enso
  ;ts求回归方程的系数a,b。
cov=escovc(nino,ts({LAT|latS:latN},{LON|lonL:lonR},time|:));lat*lon
  var=variance(nino)                                         ;一个常数
  a=cov/var                    ;a=协方差/方差               ;lat*lon
  b=dim_avg_n(ts,0)-a*avg(nino);b=y(平均)-a*x(平均);注意此处ts平均仅是时间维度的平均;lat*lon
ts_guji=new((/ntime,nlat,nlon/),"float")
  do i=0,ntime-1
  ts_guji(i,:,:)=nino(i)*a(:,:)+b ;y=a*x+b
  end do
  ts_free=ts-ts_guji
  copy_VarMeta(ts,ts_free)

  printVarSummary(ts_free)
  printMinMax(ts_free, True)

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2023-8-11 20:29:18 | 显示全部楼层
楼主这个方法,结合楼上提到的escorc函数,可以写为:

  1. a= escorc_n(sst_DJF_ano(:,{latS:latN},{lonL:lonR}), ENSO, 0, 0)
  2. copy_VarMeta(sst_DJF_ano(0,:,:),a)
  3. b=dim_avg_n(sst_DJF_ano,0)-a*avg(ENSO)
  4. ;b=y(平均)-a*x(平均);注意此处ts平均仅是时间维度的平均;lat*lon
  5. dims = dimsizes(sst_DJF_ano)
  6. ntime = dims(0)
  7. ;nlat = dims(1)
  8. ;nlon = dims(2)
  9. ;sst_guji=new((/ntime,nlat,nlon/),"float")
  10. sst_guji=sst_DJF_ano
  11. do i=0,ntime-1
  12.         sst_guji(i,:,:)=ENSO(i)*a(:,:)+b ;y=a*x+b
  13. end do
  14. ;  printVarSummary(sst_guji)
  15. sst_free=sst_DJF_ano-sst_guji
  16. copy_VarMeta(sst_DJF_ano,sst_free)
复制代码




不过,上面这个方法,去除ENSO信号会去不干净。建议使用回归函数来做:

  1. a= regCoef_n(ENSO,sst_DJF_ano,0,0)
  2. copy_VarMeta(sst_DJF_ano(0,:,:),a)
  3. sst_guji=sst_DJF_ano
  4. dims = dimsizes(sst_DJF_ano)
  5. ntime = dims(0)
  6. do i=0,ntime-1
  7.         sst_guji(i,:,:)=ENSO(i)*a(:,:)
  8. end do
  9. ;  printVarSummary(sst_guji)
  10. sst_free=sst_DJF_ano-sst_guji
  11. copy_VarMeta(sst_DJF_ano,sst_free)
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 5 反对 0

使用道具 举报

新浪微博达人勋

发表于 2020-3-11 16:36:38 | 显示全部楼层
我试了一下用你的方法算的a和escorc函数求得不同,发现你少计算了ts的方差var2
应该是a=cov/sqrt(var1*var2)
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

新浪微博达人勋

发表于 2018-11-1 11:59:26 | 显示全部楼层
哇 感谢分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-3-11 10:40:14 | 显示全部楼层
感谢分享
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-11-7 21:42:02 | 显示全部楼层
感谢分享
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-10-17 10:08:16 | 显示全部楼层
叩容 发表于 2023-8-11 20:29
楼主这个方法,结合楼上提到的escorc函数,可以写为:

天哪这个楼主太宝藏了!!!!给你点赞
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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