Ayuda para escribir una regresión lineal - página 6

 

Probablemente lo mejor en este caso sea hallar la media aritmética de todas las X[i], restarla de los propios valores, calcular los coeficientes de regresión y volver a corregirlos. En principio, nada impide hacer lo mismo con Y[i]. Pero no he intentado encontrar la fórmula, aunque obviamente no es difícil. Obviamente hay algún truco con las matrices débilmente condicionadas.

P.D. También puedes normalizar las series de datos más o menos en el mismo orden.

 
Mathemat писал (а) >>

Probablemente lo mejor en este caso sea hallar la media aritmética de todas las X[i], restarla de los propios valores, calcular los coeficientes de regresión y volver a corregirlos. En principio, nada impide hacer lo mismo con Y[i]. Pero no he intentado encontrar la fórmula, aunque obviamente no es difícil. Obviamente hay algún truco con las matrices débilmente condicionadas.

P.D. También puedes normalizar las series de datos más o menos en el mismo orden.

Y lo he hecho y sugerido a través de MOJ. Fórmula sencilla que no necesita corrección.

Ahora puedes poner el ACF en la base de código también. Revisado de nuevo, todo coincide con una precisión de 8 caracteres, pero lo más probable es que se deba a la entrada en el archivo de valores de ACF calculados en MQL.

 

Sergei, ya me tropecé con esto hace un par de años cuando escribía mi LR. La salida es sencilla: escuchar la recomendación de Candid. Lo único que especificaría en esta recomendación es restar no el Tiempo[Bars-1], sino el tiempo del primer valor X[]. En primer lugar, hace que el código del procedimiento sea universal, ya que el inicio X se desplaza dentro del procedimiento. En segundo lugar, si hay muchas barras en el gráfico (3 años son 1000000 minutos, es decir, 60000000 segundos), restar el tiempo de la primera barra del gráfico no cambiará fundamentalmente la situación. En tercer lugar, podrá volver a sus fórmulas originales sin ninguna MO, lo que significa que podrá eliminar la repetición de ciclos manteniendo la precisión.

Una cosa más. Me he dado cuenta de que tu X[] es la hora de los minutos. Es decir, las X están dispuestas de forma equidistante. Lo que significa que puedes prescindir del tiempo y utilizar el número de barra. Si hace esta transición, todo se contará con precisión y rapidez. Puedes comprobarlo. Esto también es preferible desde el punto de vista de que su LR funcionará igual en M1 y D1 (imagínese lo diferentes que serán los valores X en D1 si se trata del Tiempo, no del número de compás).

 
Yurixx писал (а) >>

Sergei...

Gracias. Lo he probado todo.

Acabo de exponer mi versión del cálculo, tal vez alguien lo encuentre útil. No necesito mover nada. No me siento cómodo moviendo X a 0. Utilizo esta función para calcular el ACF, debería estar limitada en el tiempo (hay algunas dependencias).

 

En general, no es necesario mover la propia X al punto 0. Para ello, basta con utilizar una matriz interna desplazada por X[1] en la función LR en lugar de la propia X. Incluso se puede prescindir de una matriz: basta con restar el valor de X[1] en el momento de calcular las sumas.

Por cierto, si lo has probado, ¿no te ha servido de nada?

 
Yurixx писал (а) >>

En general, no es necesario mover la propia X al punto 0. Para ello, basta con utilizar una matriz interna desplazada por X[1] en la función LR en lugar de la propia X. Incluso se puede prescindir de una matriz: basta con restar el valor de X[1] en el momento de calcular las sumas.

Por cierto, si lo has probado, ¿te ha funcionado?

Lo he probado y parece que funciona. Pero hay un matiz: si el algoritmo da ese error para una matriz de 6 números, no tenemos ninguna garantía de que el error no se acumule incluso con un desplazamiento. La matriz con la que trabajo es de 7200 (minutos). Por eso encontré este algoritmo, y funciona correctamente. Tuve que renunciar a esa, porque ya no confío en ella.

//+------------------------------------------------------------------+
//| Формула предлагаемая мной                                        |
//| Рассчет коэффициентов A и B в уравнении                          |
//| y(x)=A*x+B                                                       |
//| используються формулы https://forum.mql4.com/ru/10780/page5       |
//+------------------------------------------------------------------+

void LinearRegr(double X[], double Y[], int N, double& A, double& B)
{
      double mo_X = 0.0, mo_Y = 0.0, var_0 = 0.0, var_1 = 0.0;
      
    for ( int i = 0; i < N; i ++ )
      {
        mo_X +=X[i];
        mo_Y +=Y[i];
      }
    mo_X /=N;
    mo_Y /=N;
        
    for ( i = 0; i < N; i ++ )
      {
        var_0 +=(X[i]-mo_X)*(Y[i]-mo_Y);
        var_1 +=(X[i]-mo_X)*(X[i]-mo_X);
      }
        A = var_0 / var_1;
        B = mo_Y - A * mo_X;
}

>> No necesito ningún turno.

 

No hay problema, Sergei, usa lo que quieras. Sólo quiero llamar su atención sobre un pequeño detalle.

Como seguramente entenderás, MO está entre el máximo y el mínimo de cualquier fila. El código que has dado en realidad significa mover el punto de partida a [mo_X, mo_Y]. Y para hacer esto, se hace un bucle a través de todos sus 7200 valores. Y luego restas, mientras calculas las sumas, las coordenadas del punto cero de las coordenadas de la fila. También podrías tomar cualquier punto de la serie [Xm, Ym] como origen y realizar el cálculo del segundo ciclo, sustituyendo [mo_X, mo_Y] por [Xm, Ym].

El parámetro A de una regresión lineal es invariante con respecto a los traslados de origen. El modus operandi no tiene nada que ver.

Puedes comprobar este hecho en 3 minutos en papel.

Por eso el ciclo de cálculo de la IR es innecesario. Sólo tenemos que llevar los valores de X e Y a las órdenes de cierre.

 
Prival писал (а) >>

Si el algoritmo da ese error para una matriz de 6 números, no hay garantía de que el error no se acumule ni siquiera con un desplazamiento.

La cuestión aquí no es el número de números, sino el hecho de que en cada uno de esos 6 se encuentra como aditivo permanente (inútil) 1216600000. Simplemente no contiene ninguna información. Pero son 10 dígitos significativos. Que sea 9, el último 0 no es informativo porque los 6 están presentes también. Cuando se eleva al cuadrado, esta basura bloqueará 17 dígitos significativos de la mantisa. Y sólo hay 15 en él. Es decir, que arrojará los dígitos más bajos (por el retrete). Mientras tanto, son estos dígitos descartados los que contienen la información necesaria (contienen parte de la información sobre el componente variable X).

 

Así que no me he inventado esta fórmula. Está en los libros. Y de esa fórmula, que utiliza cuadrados, se deriva ésta (sin cuadrados). Sólo siéntate con un lápiz. Cuando llegue al escáner, publicaré una página de Tikhonov V.I. "Statistical Radio Engineering" p.446.

 
Exactamente, siéntate con un lápiz y verás que si sustituyes Xi -> Xi-X0 e Yi -> Yi-Y0 en tu fórmula original para la pendiente b, entonces esta nueva fórmula es equivalente a la original. Para cualquier valor de X0 e Y0. Por lo tanto, las sumas Xi e Yi (que es el cálculo de MO) pueden moverse dentro del segundo ciclo, lo que reduce a la mitad el tiempo de cálculo de LR. Y para obtener precisión debemos elegir X0 e Y0 adecuados. Y es mejor hacerlo de manera que los órdenes de las series X e Y estén más próximos entre sí.