2010-05-09 25 views
12

sorunoptimum iki değişkenli doğrusal regresyon hesaplama

Am SQL kod gösterildiği gibi alınan bir veri kümesi için (m SLOPE burada b INTERCEPT olan) y = mx + b denklem uygulamak için ideal. (MySQL) sorgudan değerler şunlardır:

SLOPE = 0.0276653965651912 
INTERCEPT = -57.2338357550468 

SQL Kodu

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 

Soru

aşağıdaki sonuçlarla (çizginin başlangıç ​​ve bitiş noktalarını hesaplamak için) yanlış görünüyor. Sonuçlar neden yaklaşık 10 derecedir (ör., Verileri ayıklayan aykırı değerler)?

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

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

-1,65405406 (Not = Veri yok olduğu görüntü ile daha uzun eşleşir, kod.)

1900 sonucunun 10 civarında olacağını (-4.67 değil) ve 2009 sonucunun 11.50 (-1.65 değil) olmasını beklerdim.

İlgili Siteler

cevap

0

Bu artık doğru olarak doğrulanmıştır:

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 

eğim, kesişim noktası ile ilgili ayrıntılar için resme bakın, ve (Pearson) korelasyonu.

+3

Tebrikler:

aşağıdaki (kod aslında yanlış olabilir bu yüzden, SQL sözdizimi ve geçici değişkenler hakkında çok hatırlamıyorum lütfen bağışlayın aslında) gibi bir şey yapardı. Belki birileri sizinle R hakkında konuşmalıdır. Http://www.r-project.org/ Tek liner ile yapabilirsin –

+0

Regresyondaki yanıt değişkenlerinin birbirinden bağımsız olduğu varsayılsın. Bu varsayım, verilerin zaman içinde toplanması (sizin durumunuzda doğru olanı) ve birbirine yakın olan gözlemlerin birbiriyle ilişkili olması durumunda bazen uygun değildir. Bağımsızlık eksikliği, katsayıların en küçük kareler tahminlerini göstermez, ancak standart hatalar ciddi şekilde etkilenir. –

+0

google "lineer regresyon varsayımları" bağımsızlığı için "seri korelasyon", yani http://www.basic.northwestern.edu/statguidefiles/mulreg_ass_viol.html # Lack% 20of% 20independence –

1

İşlevleri ayırmaya çalışın, parametreleri yanlış hesapladınız. Referans için here'a bakın.

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

Sayılar şimdi tamam; Daha önce bir yerde bir veri çatışması vardı. –

İlgili konular