2010-05-09 10 views
12

ProblemaOptimal cálculo de regresión lineal de dos variables

Busco para aplicar la ecuación y = mx + b (donde m es SLOPE, b es INTERCEPT) a un conjunto de datos, que se recupera como se muestra en el código SQL. Los valores de la consulta (MySQL) son:

SLOPE = 0.0276653965651912 
INTERCEPT = -57.2338357550468 

Código SQL

SELECT 
    ((sum(t.YEAR) * sum(t.AMOUNT)) - (count(1) * sum(t.YEAR * t.AMOUNT)))/
    (power(sum(t.YEAR), 2) - count(1) * sum(power(t.YEAR, 2))) as SLOPE, 

    ((sum(t.YEAR) * sum(t.YEAR * t.AMOUNT)) - 
    (sum(t.AMOUNT) * sum(power(t.YEAR, 2))))/
    (power(sum(t.YEAR), 2) - count(1) * sum(power(t.YEAR, 2))) as INTERCEPT, 
FROM 
(SELECT 
    D.AMOUNT, 
    Y.YEAR 
FROM 
    CITY C, STATION S, YEAR_REF Y, MONTH_REF M, DAILY D 
WHERE 
    -- For a specific city ... 
    -- 
    C.ID = 8590 AND 
    -- Find all the stations within a 15 unit radius ... 
    -- 
    SQRT(POW(C.LATITUDE - S.LATITUDE, 2) + POW(C.LONGITUDE - S.LONGITUDE, 2)) < 15 AND 
    -- Gather all known years for that station ... 
    -- 
    S.STATION_DISTRICT_ID = Y.STATION_DISTRICT_ID AND 
    -- The data before 1900 is shaky; insufficient after 2009. 
    -- 
    Y.YEAR BETWEEN 1900 AND 2009 AND 
    -- Filtered by all known months ... 
    -- 
    M.YEAR_REF_ID = Y.ID AND 
    -- Whittled down by category ... 
    -- 
    M.CATEGORY_ID = '001' AND 
    -- Into the valid daily climate data. 
    -- 
    M.ID = D.MONTH_REF_ID AND 
    D.DAILY_FLAG_ID <> 'M' 
    GROUP BY Y.YEAR 
    ORDER BY Y.YEAR 
) t 

Pregunta

los siguientes resultados (para el cálculo de los puntos de inicio y final de la línea) aparece incorrecto ¿Por qué los resultados se desactivan en ~ 10 grados (p. Ej., Valores atípicos sesgando los datos)?

(1900 * 0,0276653965651912) + (-57,2338357550468) = -4,66958228

(2009 * 0,0276653965651912) + (-57,2338357550468) = -1,65405406

(Tenga en cuenta que los datos no se más coincide con la imagen; el código.)

Hubiera esperado que el resultado de 1900 fuera alrededor de 10 (no -4.67) y el resultado de 2009 fuera de 11.50 (no -1.65).

Sitios relacionados

Respuesta

0

Esto ha sido verificado como correcto:

SELECT 
    ((sum(t.YEAR) * sum(t.AMOUNT)) - (count(1) * sum(t.YEAR * t.AMOUNT)))/
    (power(sum(t.YEAR), 2) - count(1) * sum(power(t.YEAR, 2))) as SLOPE, 

    ((sum(t.YEAR) * sum(t.YEAR * t.AMOUNT)) - 
    (sum(t.AMOUNT) * sum(power(t.YEAR, 2))))/
    (power(sum(t.YEAR), 2) - count(1) * sum(power(t.YEAR, 2))) as INTERCEPT, 

    ((avg(t.AMOUNT * t.YEAR)) - avg(t.AMOUNT) * avg(t.YEAR))/
    (stddev(t.AMOUNT) * stddev(t.YEAR)) as CORRELATION 
FROM (
    SELECT 
    AVG(D.AMOUNT) as AMOUNT, 
    Y.YEAR as YEAR 
    FROM 
    CITY C, 
    STATION S, 
    YEAR_REF Y, 
    MONTH_REF M, 
    DAILY D 
    WHERE 
    C.ID = 8590 AND 

    SQRT(
     POW(C.LATITUDE - S.LATITUDE, 2) + 
     POW(C.LONGITUDE - S.LONGITUDE, 2)) < 15 AND 

    S.STATION_DISTRICT_ID = Y.STATION_DISTRICT_ID AND 

    Y.YEAR BETWEEN 1900 AND 2009 AND 

    M.YEAR_REF_ID = Y.ID AND 

    M.CATEGORY_ID = '001' AND 

    M.ID = D.MONTH_REF_ID AND 
    D.DAILY_FLAG_ID <> 'M' 
    GROUP BY 
    Y.YEAR 
) t 

Ver la imagen para obtener más información sobre rasante, interceptar, y (Pearson) correlación.

+3

Felicidades. Tal vez alguien debería hablar con usted acerca de R http://www.r-project.org/. Podría hacerlo con un solo trazo –

+0

Tenga en cuenta que se supone que las variables de respuesta en regresión son independientes entre sí. Esta suposición no es adecuada a veces, si los datos se recopilan a lo largo del tiempo (lo que es cierto en su caso) y las observaciones que se toman juntas están relacionadas. La falta de independencia no causa sesgos en las estimaciones de mínimos cuadrados de los coeficientes, pero los errores estándar se ven seriamente afectados. –

+0

google para "supuestos de regresión lineal" independencia "correlación serial", es decir, http://www.basic.northwestern.edu/statguidefiles/mulreg_ass_viol.html # Lack% 20of% 20independence –

1

Intenta dividir la función, has calculado mal los parámetros. Eche un vistazo here de referencia.

me gustaría hacer algo como lo siguiente (por favor excusa el hecho de que yo no recuerdo mucho acerca de la sintaxis SQL y variables temporales, por lo que el código podría ser en realidad mal):

SELECT 

sum(t.YEAR)/count(1) AS avgX, 

sum(t.AMOUNT)/count(1) AS avgY, 

sum(t.AMOUNT*t.YEAR)/count(1) AS avgXY, 

sum(power(t.YEAR, 2))/count(1) AS avgXsq, 

(avgXY - avgX * avgY)/(avgXsq - power(avgX, 2)) as SLOPE, 

avgY - SLOPE * avgX as INTERCEPT, 
+0

Los números están bien ahora; hubo un conflicto de datos en algún lugar antes. –

Cuestiones relacionadas