精华内容
下载资源
问答
  • Sen趋势分析.txt

    2020-07-29 14:20:53
    植被覆盖度,气温、降水、相对湿度等气象数据的变化趋势,对于具有空间信息的栅格数据(遥感影像)来说,ENVI可以基于栅格进行计算,将二者相结合,则可以计算具有地理信息的栅格数据的Sen趋势分析。文本文件详细...
  • 【Matlab】 多年NDVI数据的sen趋势分析

    千次阅读 2021-01-17 14:39:24
    具体内容及详细教程请关注微信公众号:夫也的笔记 ...趋势分析有很多种,今天介绍的是Theil-Sen median趋势分析,一般还要结合Mann-Kendall建议,这个MK检验后续文章会写。 Theil-Sen median趋势分析是一种稳健的非

    具体内容及详细教程请关注微信公众号:夫也的笔记

    最近老师在课上安排了一个汇报作业,要求对某一地区的多年NDVI数据进行趋势分析,对于小白的我来说,真是!唉!但是功夫不负有心人,在我充分利用百度搜索、谷歌搜索和Bing搜索后,终于让我找到了相关教程和知识。只是需要用Matlab软件进行一系列操作,废话不多说上代码。
    趋势分析有很多种,今天介绍的是Theil-Sen median趋势分析,一般还要结合Mann-Kendall建议,这个MK检验后续文章会写。
    Theil-Sen median趋势分析是一种稳健的非参数计算方法,计算式如下

    公式中SET指计算n(n-1)/2 个数据组合的斜率的中位数,ETi和ETj代表i和j年的ET值。如果SET>0,则ET呈上升趋势,否则,ET呈下降趋势。
    Matlab具体代码如下:

    % @author 1154318421@qq.com
    [a,R]=geotiffread('E:\GIS\NDVI\2000.tif');%先导入投影信息
    info=geotiffinfo('E:\GIS\NDVI\2000.tif');
    [m,n]=size(a);
    cd=2020-2000+1;%时间跨度,根据需要自行修改
    datasum=zeros(m*n,cd)+NaN; 
    k=1;
    for year=2000:2020 %起始年份
        filename=['E:\GIS\ENVI\xinjiang',int2str(year),'2000.tif'];
        data=importdata(filename);
        data=reshape(data,m*n,1);
        datasum(:,k)=data;
        k=k+1;
    end
    result=zeros(m,n)+NaN;
    for i=1:size(datasum,1)
        data=datasum(i,:);
        if min(data)>0 %判断是否是有效值,我这里的有效值必须大于0
            valuesum=[];
            for k1=2:cd
                for k2=1:(k1-1)
                    cz=data(k1)-data(k2);
                    jl=k1-k2;
                    value=cz./jl;
                    valuesum=[valuesum;value];
                end
            end
            value=median(valuesum);
            result(i)=value;
        end
    end
    filename=['E:\GIS\基于SEN的NDVI变化趋势.tif'];
    geotiffwrite(filename,result,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag)在这里插入代码片
    
    
    
    展开全文
  • Sen+MK趋势分析

    千次阅读 2020-06-23 17:28:53
    Sen+MK趋势分析

    ​Sen 斜率估计用于计算趋势值,通常与MK非参数检验结合使用。即首先计算Sen趋势值,然后使用MK方法判断趋势显著性。

    结果

    在这里插入图片描述

    去看原文

    原理

    Theil-Sen Median方法又被称为 Sen 斜率估计,是一种稳健的非参数统计的趋势计算方法。该方法计算效率高,对于测量误差和离群数据不敏感,常被用于长时间序列数据的趋势分析中。
    β = m e a n ( x j − x i j − i ) , ∀ j > i \beta=mean(\frac{x_j-x_i}{j-i}),\forall{j>i} β=mean(jixjxi),j>i

    式中: x j x_j xj x i x_i xi为时间序列数据。β大于0表示时间序列呈现上升趋势;β小于0表示时间序列呈现下降趋势。

    Mann-Kendall是一种非参数统计检验方法,最初由Mann在1945年提出,后由Kendall和Sneyers进一步完善,其优点是不需要测量值服从正态分布,也不要求趋势是线性的,并且不受缺失值和异常值的影响,在长时间序列数据的趋势显著检验中得到了十分广泛的应用。其统计检验方法如下:

    对于时间序列 X i , i = 1 , 2 , . . . i , . . . j , . . . , n X_i,i=1, 2, ...i, ...j, ..., n Xii=1,2,...i,...j,...,n。定义标准化检验统计量 Z:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    式中: x j x_j xj x i x_i xi为时间序列数据, n n n为数据个数;当 n ≥ 8 n≥8 n8时,检验统计量 S S S近似为正态分布,其均值和方差如下:

    在给定显著性水平α下,如果 ∣ Z ∣ > Z 1 − α 2 |Z|>Z_{1-\frac{α}{2}} Z>Z12α,表明不存在趋势的假设被拒绝,时间序列数据存在明显的趋势变化。 Z 1 − α 2 Z_{1-\frac{α}{2}} Z12α为在置信水平α下,标准正态函数分布表对应的值。当 Z Z Z的绝对值大于1.65、1.96和2.58时,表示趋势分别通过了信度为90%、95%和99%的显著性检验。

    实现

    Sen趋势值计算:

    % @author geo_data_analysis@163.com
    % 基于Sen的趋势值
    [a,R]=geotiffread('C:\Users\ca\Desktop\sen+mk趋势分析\data\1982_mvc.tif');  
    info=geotiffinfo('C:\Users\ca\Desktop\sen+mk趋势分析\data\1982_mvc.tif');
    [m,n]=size(a);
    datasum=zeros(m*n,34)+NaN; 
    k=1;
    for year=1982:2015 
        filename=['C:\Users\ca\Desktop\sen+mk趋势分析\data\',int2str(year),'_mvc.tif'];
        data=importdata(filename);
        data=reshape(data,m*n,1);
        datasum(:,k)=data;
        k=k+1;
    end
    % ...完整源码见原文
    

    MK检验结果:

    % @author geo_data_analysis@163.com
    % MK趋势显著性检验
    [a,R]=geotiffread('C:\Users\ca\Desktop\sen+mk趋势分析\data\1982_mvc.tif');  
    info=geotiffinfo('C:\Users\ca\Desktop\sen+mk趋势分析\data\1982_mvc.tif');
    [m,n]=size(a);  
    cd=34;
    datasum=zeros(m*n,cd)+NaN; 
    p=1;
    for year=1982:2015      
        filename=['C:\Users\ca\Desktop\sen+mk趋势分析\data\',int2str(year),'_mvc.tif'];
        data=importdata(filename);
        data=reshape(data,m*n,1);
        datasum(:,p)=data;      
        p=p+1;
    end
    % ...完整源码见原文
    

    去看原文

    非平稳时间序列突变检测 – Bernaola Galvan分割算法

    非平稳时间序列突变检测 – Bernaola Galvan分割算法

    原文有源码,更多内容,请关注地学分析与算法。
    在这里插入图片描述

    展开全文
  • 并行计算Sen+MK趋势分析 前面的推文中讲过Sen+MK分析 NDVI时间序列分析之Sen+MK分析全过程梳理 上面的方法有个很大的缺点就是R语言计算过程太慢,对此我改进了前面的代码,使用terra包重写,开启并行计算,提高...

    并行计算Sen+MK趋势分析

    前面的推文中讲过Sen+MK分析

    上面的方法有个很大的缺点就是R语言计算过程太慢,对此我改进了前面的代码,使用terra包重写,开启并行计算,提高计算速度。

    并行计算Sen+MK

    • rast读取栅格数据
    • function中长度、年份需要根据实际情况修改
    • 输出结果包含三个波段,Z值、slope和p值(详细看参考文献推文)
    library(terra)
    library(trend)
    #输入一个文件夹内的单波段TIFF数据,在这里是历年的NDVI年最大值
    flnames <- list.files(path = './ChinaYearMean/', pattern = '.tif$')
    fl <- paste0("./ChinaYearMean/", flnames)
    firs <- rast(fl)
    
    #Sen+MK计算
    fun_sen <- function(x){
      if(length(na.omit(x)) <34) return(c(NA, NA, NA))   #删除数据不连续含有NA的像元
      MK_estimate <- trend::sens.slope(ts(na.omit(x), start = 1982, end = 2015, frequency = 1), conf.level = 0.95) #Sen斜率估计
    
    #部分代码省略,完整代码请关注微信公众号,搜索同名文章获取
    #部分代码省略,完整代码请关注微信公众号,搜索同名文章获取
    #部分代码省略,完整代码请关注微信公众号,搜索同名文章获取
      return(c(Zs, slope, MK_test))
    }
    
    #部分代码省略,完整代码请关注微信公众号,搜索同名文章获取
    
    #显示输出
    plot(firs_sen)
    writeRaster(firs_sen, filename = "./firs_sen.tif", names=firs_sen@ptr[["names"]])
    

    计算结果

    参考文献

    1. 对比R语言Raster包和Terra包栅格计算
    2. NDVI时间序列分析之Sen+MK分析全过程梳理
    3. NDVI时间序列逐像元计算Hurst指数
    展开全文
  • 基于MATLAB进行长时间序列数据的MK趋势检验,程序书写简易,且循环操作简单,结果以矩阵形式输出,极大的方便初学者的实验进行。本文实验数据为所有站点的1961-2018年时间序列的SPI3数据:SPI3hebing.xls。结果显示...
  • 该方法计算效率高,对于测量误差和利群数据不敏感,适用于长时间序列数据的趋势分析。其计算公式为: Mann-Kendall(MK)检验是一种非参数的时间序列趋势性检验方法,其不需要测量值服从正太分布,不受缺失值和异常值...

     一、理论

             Theil-Sen Median方法又称为Sen斜率估计,是一种稳健的非参数统计的趋势计算方法。该方法计算效率高,对于测量误差和利群数据不敏感,适用于长时间序列数据的趋势分析。其计算公式为:          Mann-Kendall(MK)检验是一种非参数的时间序列趋势性检验方法,其不需要测量值服从正太分布,不受缺失值和异常值的影响,适用于长时间序列数据的趋势显著检验。其过程如下:对 Xt = x1,x2,xn,先确定所有对偶值( xi , xj , j > i )中xixj的大小关系(设为S)。做如下假设:H0,序列中的数据随机排列,即无显著趋势;H1,序列存在上升或下降趋势。检验统计量S计算公式为

            同样采用双边趋势检验,在给定显著性水平下,在正态分布表中查得临界值 Z1-α/2。当|Z|Z1α/2时,接受原假设,即趋势不显著; |Z| Z1α/2,则拒绝原假设,即认为趋势显著。本文给定显著性水平 α = 0.05,则临界值 Z1-α/2 = ±1.96,当Z的绝对值大于1.651.962.58时,表示趋势分别通过了信度为90%95%99%的显著性检验。趋势显著性的判断方法见表1。

          二、代码

    clear
    [a,R]=geotiffread('E:\Tool\Matlab\MK_Sen\NPP_CASA\NPP_2000.tif'); %先导入投影信息
    info=geotiffinfo('E:\Tool\Matlab\MK_Sen\NPP_CASA\NPP_2000.tif');%先导入投影信息
    [m,n]=size(a);
    cd=2020-2000+1;      %21年,时间跨度  
    datasum=zeros(m*n,cd)+0;   %生成一个像素个数*年数的矩阵
    p=1;
    for year=2000:2020      %起止年份
        filename=['E:\Tool\Matlab\MK_Sen\NPP_CASA\NPP_',int2str(year),'.tif'];     %读入文件名 如D:\qixiang\年全国8kmPET\china2000.pet.tif(china2000pet.tif)
        data=importdata(filename);  %导入数据
        data=reshape(data,m*n,1);   %reshape 改变矩阵形式为m*n行、1列
        datasum(:,p)=data;          %把每年的数据依次放到datasum的每一列
        p=p+1;
    end
    sresult=zeros(m,n);
    result=zeros(m,n);
    for i=1:size(datasum,1)
        data=datasum(i,:);
        if min(data)>0       % 有效格点判定,我这里有效值在0以上
            sgnsum=[];  
            for k=2:cd       %作用类似于sgn函数    xj-xi>0,sgn=1; xj-xi=0,sgn=0; xj-xi<0,sgn=-1;   (后减前)
                for j=1:(k-1)
                    sgn=data(k)-data(j);
                    if sgn>0
                        sgn=1;
                    else
                        if sgn<0
                            sgn=-1;
                        else
                            sgn=0;
                        end
                    end
                    sgnsum=[sgnsum;sgn];  %在sgnsum后面再加上sgn
                end
            end  
            add=sum(sgnsum);
            sresult(i)=add;  %检验统计量S
        end
    end
    for i=1:size(datasum,1)         
        data=datasum(i,:);          %第i列赋值给data
        if min(data)>0              %判断是否是有效值,我这里的有效值必须大于0  
            valuesum=[];
            for k1=2:cd
                for k2=1:(k1-1)
                    cz=data(k1)-data(k2);    %(后减前)
                    jl=k1-k2;
                    value=cz./jl;
                    valuesum=[valuesum;value];  %在valuesum后面再加上value
                end
            end
            value=median(valuesum);   
            result(i)=value;   %Sen趋势度B  B>0上升   B<0下降
         end
    end
    
    vars=cd*(cd-1)*(2*cd+5)/18;
    zc=zeros(m,n);
    sy=find(sresult==0);    %|Z|>1.96变化显著,|Z|<=1.96时变化不显著
    zc(sy)=0;                             %S=0时
    sy=find(sresult>0);
    zc(sy)=(sresult(sy)-1)./sqrt(vars);   %S>0时       
    sy=find(sresult<0);
    zc(sy)=(sresult(sy)+1)./sqrt(vars);   %S<0时
    
    result1=reshape(result,m*n,1);
    zc1=reshape(zc,m*n,1);
    tread=zeros(m,n);
    for i=1:size(datasum,1)
        %result1(i)
        if result1(i)>0   % Sen趋势B>0  上升     
            if abs(zc1(i))>=2.58    %极显著上升
                tread(i)=4;
            elseif (1.96<=abs(zc1(i)))&&(abs(zc1(i))<2.58)      %显著上升  
                tread(i)=3;
            elseif (1.645<=abs(zc1(i)))&&(abs(zc1(i))<1.96)     %微显著上升
                tread(i)=2;
            else		%不显著上升
                tread(i)=1;
            end
            elseif result1(i)<0  % Sen趋势B<0  下降 
            if abs(zc1(i))>=2.58   %极显著下降
                tread(i)=-4;
            elseif (1.96<=abs(zc1(i)))&&(abs(zc1(i))<2.58)  %显著下降
                tread(i)=-3;
            elseif (1.645<=abs(zc1(i)))&&(abs(zc1(i))<1.96)   %微显著下降
                tread(i)=-2;
            else			%不显著下降
                tread(i)=-1;
            end
            else
                tread(i)=0;      % 无变化
        end
    end
    geotiffwrite('E:\Tool\Matlab\MK_Sen\NPP_CASA\NPPtread.tif',tread,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag)%注意修改路径

      三、结果

    展开全文
  • SEN的MATLAB实现代码

    2019-02-05 21:25:02
    该代码可以实现基于遥感图像做SEN,在MATLAB2016a版本可以试下
  • Sen+MK长时间序列趋势分析----基于python的代码实现

    千次阅读 多人点赞 2021-04-12 15:18:01
    python开源社区公布了进行sen+mk趋势性检验的官方包,有关该官方包的主要内容详见:https://github.com/Coder2cdb/pyMannKendall,开源不易,有些人还收费查看,我觉得没必要,本次代码免费分享给大家,有需要的收藏...
  • 可针对遥感时序数据进行空间上的SEN趋势分析及MK显著性检验,亲测可用
  • 拓端tecdat|R语言中的Theil-Sen回归分析

    千次阅读 2020-01-13 17:11:06
    Theil-Sen估计器是一种在社会科学中不常用 的简单线性回归估计器 。三个步骤: 在数据中所有点之间绘制一条线 计算每条线的斜率 中位数斜率是 回归斜率 用这种方法计算斜率非常可靠。当误差呈正态分布且没有异常...
  • 中国气温日较差的变化趋势分析,陈铁喜,陈星,本文利用1950年至2001年的气温观测资料,对中国地区的气温日较差(DTR)的空间分布和时间序列变化特征进行了分析。同时分析了日最高�
  • Mann-Kendall趋势检验法的matlab代码用于检验时间序列的趋势性。程序经过调试,保证正确。
  • 2018年 草地学报论文 Mann-Kendall Theil-SenM edian R/S N D V I
  • 在前一篇文章中讲述了用sen法进行长时间的趋势分析,但并未对结果进行显著性检验,通常Sen与MK检验是结合在一起的, 因此本文主要讲述如何进行MK检验。具体代码如下 % @author yinlichang3064@163.com clear [a,R]...
  • 基于1998年到2011年长时序SPOT VEGETATION归一化植被指数数据,采用一元线性回归斜率变化法和Sen Mann-...同时,Sen Mann-Kendall法以其良好的抗噪性和对数据分布无要求性可广泛应用到其他区域的植被变化趋势分析中。
  • 参考文献《基于Sen+Mann-Kendall 的北京植被变化趋势分析》 针对一维数组: pro Mann_Kandall_Test_array COMPILE_OPT idl2 e = ENVI(/headless) tic ;----------------------------------------------------...
  • 这个命题源自我的博士同学,他在北京的儿科,和我问道,线性回归太不稳定,离群值都处理不了,问我有没有可替代的优异一些的方法,方法是有的,因为临床研究离不开连续变量的分析,所以我推荐稳健回归,稳健回归可以...
  • MATLAB泰森斜率+MK趋势分析函数代码 Mann-Kendall Tau (aka Tau-b) with Sen's Method (enhanced)
  • 一、趋势分析法简介 趋势分析法是一种通过对随时间变化的变量进行线性回归分析,从而来预测其变化趋势的方法。其计算方法如下: 式中,Slope为像元回归方程的斜率,NDVI i为第i年的NDVI的平均值,n为研究的时间长度...
  • ENVI时间序列趋势分析之一元线性回归分析

    千次阅读 热门讨论 2021-01-18 22:45:08
    ​课程作业中需要做一个多年NDVI趋势分析,以下内容仅提供简单的操作指导及大致思路流程。方便我以后再次使用时回忆。大神看到请回避,有错误也可以指出。 理论知识:一元线性回归方程反映一个因变量与一个自变量...
  • 实现m-k突变分析,m-k趋势分析sen's趋势分析,并画出m-k突变分析的图
  • 曼-肯德尔(Mann-Kendall)趋势检验法在matlab上的实现 有完整代码 Matlab部分代码如下 for i=2:n for j=1:i if y2(i)>y2(j) s=s+1; else s=s+0; end end Sk2(i)=s; E=i*(i-1)/4; Var=i*(i-1)*(2*i...
  • sen‘s斜率在matlab上的实现

    千次阅读 2020-05-02 12:47:09
    Sen’s斜率估计是Sen于1968提出并发展的一种非参数检验法,估计n个样本中N对数据的趋势斜率: 案例 对1960-2013年四季气温数据进行趋势检验,数据格式如下(部分数据): 时间 春季 夏季 秋季 ...
  • 批量处理sen's斜率数据,检测出时间序列降雨量或者径流量的变化趋势
  • 趋势分析 R包,用于时间序列数据的趋势分析。 使用不确定的Sen方法来计算趋势量和显着性值。
  • 参考文献《基于Sen+Mann-Kendall 的北京植被变化趋势分析》 针对二维数组/图像: function Sen_slope,x1,y1,x2,y2 s = (y2 - y1)/(x2 - x1) return,s pro Sen_slope_image COMPILE_OPT idl2 e = ENVI(/...
  • 采用分段线性回归模型、Sen趋势分析和Mann-Kendall统计检验方法,得到内蒙古寒潮频次的时间(年际、季节、月份)和空间变化数据集数据集包括:(1)内蒙古及周边121个气象台站位置数据;(2)1960-2012年内蒙古单站...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 331
精华内容 132
关键字:

sen趋势分析