6 votos

Desvíos perpendiculares en una regresión de mínimos cuadrados ponderados

Perpendicular desplazamiento de mínimos cuadrados de montaje tiene un montón de ventajas en comparación con los nativos de mínimos cuadrados esquema de montaje. La siguiente figura ilustra la diferencia entre hay, y para una comparación más detallada de estos dos métodos, la que nos referimos aquí.

enter image description here

Perpendicular desplazamiento de mínimos cuadrados el ajuste, sin embargo, no es inmune a los valores atípicos( puntos que no deben ser utilizados para el modelo de estimación). Por lo tanto, ahora estoy considerando la posibilidad de utilizar un promedio ponderado de desplazamiento perpendicular de mínimos cuadrados el método de regresión. El método consta de dos pasos:

  1. Calcular el factor de ponderación para cada uno de los puntos que van a ser utilizados para la línea de estimación;
  2. Realizar perpendicular de desplazamiento en un promedio ponderado mínimo de cuadrados de regresión esquema.

Por el momento, mi mayor problema viene desde el paso 2. Supongamos que los factores de ponderación se han dado, ¿cómo puedo obtener la fórmula para la estimación de los parámetros de la línea? Muchas gracias!

EDITAR:

Basado en el tipo de sugerencia de @MvG he implementado el algoritmo en MATLAB:

function  line =  estimate_line_ver_weighted(pt_x, pt_y,w);
% pt_x  x coordinate
% pt_y  y coordinate
% w     weighting factor


pt_x = pt_x(:);
pt_y = pt_y(:);
w    = w(:);


% step 1: calculate n
n = sum(w(:));

% step 2: calculate weighted coordinates 
y_square = pt_y(:).*pt_y(:);
x_square = pt_x(:).*pt_x(:);
x_square_weighted = x_square.*w;  
y_square_weighted = y_square.*w;  
x_weighted        = pt_x.*w;
y_weighted        = pt_y.*w;

% step 3: calculate the formula
B_upleft = sum(y_square_weighted)-sum(y_weighted).^2/n;
B_upright = sum(x_square_weighted)-sum(x_weighted).^2/n;
B_down = sum(x_weighted(:))*sum(y_weighted(:))/n-sum(x_weighted.*pt_y);
B = 0.5*(B_upleft-B_upright)/B_down;

% step 4: calculate b
if B<0
    b       = -B+sqrt(B.^2+1);
else
    b       = -B-sqrt(B.^2+1);
end

% Step 5: calculate a
a = (sum(y_weighted)-b*sum(x_weighted))/n;

% Step 6: the model is y = a + bx, and now we transform the model to 
% a*x + b*y + c = 0;
c_ = a;
a_ = b;
b_ = -1;

line = [a_ b_ c_];

El resultado es tan bueno como se puede esperar, lo cual se ilustra en la siguiente secuencia de comandos:

%% Procedure 1: given the data
pt_x = [   692   692   693   692   693   693   750];
pt_y = [ 919         971        1022        1074        1126        1230        1289];

% Procedure 2: draw the point 
 close all; figure; plot(pt_x,pt_y,'b*');

% Procedure 3: estimate the line based on the weighted vertical offset
% least square method.
 weighting = ones(length(pt_x),1);
 weighting(end) = 0.01;  % we give the last point a low weighting because obvously it is an outlier
 myline =    estimate_line_ver_weighted(pt_x,pt_y,weighting); 
 a = myline(1); b = myline(2); c= myline(3);

 % Procedure 4: draw the line
 x_range = [min(pt_x):0.1:max(pt_x)];
 y_range = [min(pt_y):0.1:max(pt_y)];
 if length(x_range)>length(y_range)
        x_range_corrspond = -(a*x_range+c)/b;
        hold on; plot(x_range,x_range_corrspond,'r');
 else
        y_range_correspond = -(b*y_range+c)/a;
        hold on; plot(y_range_correspond,y_range,'r');
 end

La siguiente figura corresponde a la secuencia de comandos anterior: enter image description here.

3voto

BDGapps Puntos 219

Completamente revisado respuesta, ver la historia.

Tomar la fórmula de su enlace. Contiene una gran cantidad de sumas de iterar sobre sus puntos de entrada. Asegúrese de multiplicar los sumandos en todas estas sumas con tus pesas $w$:

\begin{align*} \sum_{i=1}^n x_i &\to \sum_{i=1}^n w_ix_i \\ \sum_{i=1}^n y_i &\to \sum_{i=1}^n w_iy_i \\ \sum_{i=1}^n x_i^2 &\to \sum_{i=1}^n w_ix_i^2 \\ \sum_{i=1}^n x_iy_i &\to \sum_{i=1}^n w_ix_iy_i \\ \sum_{i=1}^n y_i^2 &\to \sum_{i=1}^n w_iy_i^2 \\ n = \sum_{i=1}^n 1 &\to \sum_{i=1}^n w_i \end{align*}

Aviso que yo previamente sugerido la ponderación de las coordenadas, sino que lo hace a uno $w$ demasiados para el segundo orden de los términos. Para simular el efecto de la $w$ que denota la multiplicidad de puntos (es decir, $w_i=3$ debería tener el mismo efecto como punto de $i$ repitió $3$ a veces), debe tener exactamente una $w$ por cada suma de iterar sobre el conjunto de los puntos. El código todavía tiene un $w$ demasiados en la sum(x_weighted.*y_weighted) plazo de B_down.

Con esta solución, y el uso exacto de la aritmética de números algebraicos para evitar problemas numéricos, una de las dos soluciones de la ecuación cuadrática da un resultado bastante bueno en el ejemplo de los datos que usted proporcionó. Viendo como $B$ es sólo de alrededor de $22$ con el correcto cálculo numérico de problemas no debe ser serio un problema, al contrario de mis experiencias anteriores con la incorrecta ponderación. Todavía no sé cuál es la solución que va a ser la correcta, en general, si usted siempre puede elegir el uno con el positivo de la raíz cuadrada, o si usted tiene que examinar el signo de la segunda derivada.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X