2010-05-09 6 views
12

ProblemOptimal zwei variable lineare Regressionsberechnung

Am sucht die y = mx + b Gleichung anzuwenden (wobei m SLOPE ist, b INTERCEPT) auf einen Datensatz, der in dem SQL-Code, wie gezeigt abgerufen wird. Die Werte aus der (MySQL) Abfrage sind:

SLOPE = 0.0276653965651912 
INTERCEPT = -57.2338357550468 

SQL-Code

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 

Frage

Die folgenden Ergebnisse (die Start- und Endpunkte der Linie zu berechnen) erscheint falsch. Warum sind die Ergebnisse um ~ 10 Grad (z. B. Ausreißer, die die Daten verzerren)?

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

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

(Beachten Sie, dass die Daten nicht länger passen das Bild, der Code.)

Ich hätte erwartet, dass das Ergebnis um 1900 um 10 (nicht -4,67) und das Ergebnis 2009 um 11,50 (nicht -1,65) zu sein.

Verwandte Seiten

Antwort

0

das wurde nun als korrekt überprüft:

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 

Siehe das Bild für Details auf Steigung, den Schnitt und (Pearsons) Korrelation.

+3

Gratulation. Vielleicht sollte jemand mit Ihnen über R http://www.r-project.org sprechen. Sie könnten es mit einem Einzeiler tun –

+0

Denken Sie daran, dass Antwortvariablen in der Regression als unabhängig voneinander angenommen werden. Diese Annahme ist manchmal nicht angebracht, wenn die Daten im Laufe der Zeit erhoben werden (was in Ihrem Fall der Fall ist) und die Beobachtungen, die nahe beieinander liegen, verwandt sind. Ein Mangel an Unabhängigkeit verursacht keine Verzerrung bei den kleinsten Quadraten der Koeffizienten, aber Standardfehler werden ernsthaft beeinträchtigt. –

+0

Google für "lineare Regression Annahmen" Unabhängigkeit "serielle Korrelation", d. H http://www.basic.northwestern.edu/statguidefiles/mulreg_ass_viol.html # Lack% 20of% 20independence –

1

Versuchen Sie, die Funktion aufzuteilen, Sie haben die Parameter falsch berechnet. Schauen Sie sich here als Referenz an.

würde ich so etwas wie die folgenden (bitte entschuldigen Sie, dass ich über SQL-Syntax und temporäre Variablen nicht mehr viel, so dass der Code tatsächlich falsch sein könnte) tun:

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

Die Zahlen sind jetzt in Ordnung; Irgendwo zuvor gab es einen Datenkonflikt. –

Verwandte Themen