Расчет показателя Херста - PullRequest
6 голосов
/ 25 мая 2011

Привет =) И извините за мой английский, заранее У меня есть задача вычислить показатель Херста методом линейной регрессии. И у меня есть текстовое описание решения. Это выглядит очень просто, но всегда я получаю значения, которые выходят из диапазона 0..1. Обычно значение составляет 1,9 или что-то подобное. Иногда он получает отрицательное значение, близкое к нулю. Я просмотрел код около тысячи раз, но не увидел ошибки.

var
max_z,min_z,x_m:real; //max and min of cumulative sum and mean value of X for every Tau
st,ss,sst,st2 :real;
Al, Herst: real;
x_vr:array of double;   //a piece of array with length=tau
i, j, nach: integer;
begin
    //file opening and getting values of X array are in another function
    nach:=3;    //initial value of tau
    Setlength(ln_rs,l-nach); //length of  ln(R/S) array
    Setlength(ln_t,l-nach);  //length of  ln(tau) array
    Setlength(r,l-nach);   //length of  R array
    Setlength(s,l-nach);   //length of S array


      //Let's start
    for tau:=nach to l do  //we will change tau
    begin
        Setlength(x_vr,tau+1); //set new local array (length=tau)
        for i:=0 to length(x_vr)-1 do
            x_vr[i]:=x[i];

        x_m:=Mean(x_vr);    //mean value
        Setlength(y,tau+1);   //length of array of difference from mean value
        Setlength(z,tau+1);   //length of array of cumulative sum

        for i:=0 to tau do
            y[i]:=x_vr[i]-x_m;      //difference from mean value

        z[0]:=y[0];
        for i:=1 to tau do      //cumulative sum
             for j :=i downto 0 do
                z[i]:=z[i]+y[j];

        max_z:=z[0];
        for i:=1 to tau do        //max of cumulative sum
            max_z:=max(max_z,z[i]);

        min_z:=z[0];
        for i:=1 to tau do        //min of cumulative sum
            min_z:=min(min_z,z[i]);

        r[tau-nach]:=max_z-min_z;    //R value
        s[tau-nach]:=0;
        for i:=0 to tau do
            s[tau-nach]:=power(y[i],2)+s[tau-nach];         //S value

        s[tau-nach]:=sqrt(s[tau-nach]/(tau+1));

        //new array values
        ln_rs[tau-nach]:=Ln(R[tau-nach]/S[tau-nach]);   // ln(R/S)
        ln_t[tau-nach]:=ln(tau);                        // ln (tau)

    end;    //End of calculating

    //Method of Least squares
    for i:=0 to length(ln_rs)-1 do  
        st:=st+ln_t[i];

    st:=(1/length(ln_rs))*st;

    for i:=0 to length(ln_rs)-1 do
        ss:=ss+ln_rs[i];

    ss:=(1/length(ln_rs))*ss;

    for i:=0 to length(ln_rs)-1 do
        sst:=sst+ln_t[i]*ln_rs[i];

    sst:=(1/length(ln_rs))*sst;

    for i:=0 to length(ln_rs)-1 do
        st2:=st2+ln_t[i]*ln_t[i];

    st2:=(1/length(ln_rs))*st2;


    Herst:=(sst-st*ss)/(st2-st*st);      //coefficient of approximal function
    al:=ss-st*Herst;

Спасибо всем =)

приписка

 for tau:=nach to l do

Существует L, а не 1. И L - длина массива X. И L> nach всегда помимо последнего шага, когда l = nach.

P.P.S. Это работает, ребята. Но ценности не верны. И они выходят из диапазона. Возможно, в алгоритме есть ошибка. Или, может быть, я пропустил какой-то шаг.

Последнее обновление

Это мистик, но я только изменил метод вычисления массива Z, и он начал работать правильно .... Спасибо всем =)

Ответы [ 3 ]

2 голосов
/ 25 мая 2011

Первое, что я вижу:

nach := 3;    
for tau := nach to l do  //w

Это считается. И поскольку nach> 1, тело этого цикла не будет выполнено.

Если вы ожидаете обратного отсчета. Используйте вариант downto. Для обратного отсчета:

for tau := nach downto l do  //w
0 голосов
/ 15 июля 2015

Если линия

z[i]:=z[i]+y[j];

не будет

z[i]:=z[i - 1]+y[j];

0 голосов
/ 25 мая 2011

Учитывая, что основной цикл (for tau) повторяется от nach до l, первые четыре вызова SetLength должны установить длину l - nach + 1 вместо l - nach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...