2010-05-09 3 views
12

문제최적 개의 가변 선형 회귀 계산

오전 SQL 코드에 도시 ​​된 바와 같이, 검색되는 데이터 세트에 (m은 SLOPE이고, B는 INTERCEPT 임) y = mx + b 방정식을 적용하고자. 제 (MySQL의) 쿼리의 값은 다음과 같습니다

SLOPE = 0.0276653965651912 
INTERCEPT = -57.2338357550468 

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 

질문

다음 결과 (라인의 시작과 끝 지점을 계산하기 위해) 잘못된 것으로 나타납니다. 결과가 ~ 10도 정도 떨어져있는 이유는 무엇입니까 (예 : 데이터를 왜곡하는 이상 치)?

(1,900 * 0.0276653965651912) + (-57.2338357550468)는 -4.66958228

(2,009 * 0.0276653965651912) + (-57.2338357550468) =

-1.65405406는 (주 = 데이터없이 그 더 일치하는 이미지 : 코드)

나는 1900 년 결과가 약 10 (-4.67이 아님)이고 2009 년 결과는 11.50 (-1.65가 아님)이 될 것으로 예상했을 것이다.

관련 사이트

답변

0

이 이제 올바른 것으로 확인되었습니다

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 

기울기, 절편에 대한 자세한 내용은 이미지보기, 및 (Pearson 's) 상관 관계.

+3

축하 :

나는 다음 (코드가 실제로 잘못 될 수 있도록 내가, SQL 구문 및 임시 변수에 대한 많은 기억하지 않는 것이 실례 사실) 같은 것을 할 것입니다. 어쩌면 누군가가 R에 대해 이야기해야 할 것입니다. http://www.r-project.org/ 한 줄로 할 수 있습니다 –

+0

회귀 분석에서 응답 변수는 서로 독립적이라고 가정합니다. 시간이 지남에 따라 데이터가 수집되고 (귀하의 경우에 해당) 관측치가 밀접하게 관련되어있는 경우이 가정은 때때로 적절하지 않습니다. 독립성 결여는 계수의 최소 자승 추정치에 편향을주지 않지만 표준 오류는 심각하게 영향을받습니다. –

+0

google for 'linear regression assumptions'독립성 'serial correlation'즉 http://www.basic.northwestern.edu/statguidefiles/mulreg_ass_viol.html # Lack % 20of % 20independence –

1

함수를 분리하려고하면 매개 변수가 잘못 계산되었습니다. 참조 용으로 here을보십시오.

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

숫자는 이제 괜찮습니다. 이전에 데이터 충돌이있었습니다. –

관련 문제