2010-05-09 38 views
12

Vấn đềtính tối ưu hai biến tuyến tính hồi quy

Am tìm cách để áp dụng các phương trình y = mx + b (nơi m là SLOPE, b là INTERCEPT) vào một tập hợp dữ liệu, được lấy ra như thể hiện trong các mã SQL. Các giá trị từ (MySQL) truy vấn là:

SLOPE = 0.0276653965651912 
INTERCEPT = -57.2338357550468 

SQL Mã

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 

Câu hỏi

các kết quả như sau (để tính toán đầu và điểm cuối của đường) xuất hiện không đúng. Tại sao kết quả lại giảm ~ 10 độ (ví dụ: các ngoại lệ lệch dữ liệu)?

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

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

(Lưu ý rằng các dữ liệu không dài hơn khớp với hình ảnh; mã.)

Tôi đã mong đợi kết quả năm 1900 là khoảng 10 (không -4,67) và kết quả năm 2009 là khoảng 11,50 (không -1,65).

Sites liên quan

Trả lời

0

này hiện đã được xác nhận là đúng:

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 

Xem hình ảnh để biết chi tiết về độ dốc, đánh chặn, và (Pearson's) tương quan.

+3

Xin chúc mừng. Có lẽ ai đó nên nói chuyện với bạn về R http://www.r-project.org/ Bạn có thể làm điều đó với một lớp lót –

+0

Hãy nhớ rằng các biến trả lời trong hồi quy được giả định là độc lập với nhau. Giả thiết này đôi khi không thích hợp, nếu dữ liệu được thu thập theo thời gian (điều này đúng trong trường hợp của bạn) và các quan sát được lấy gần nhau có liên quan. Thiếu tính độc lập không gây ra sai lệch về ước lượng bình phương tối thiểu của các hệ số, nhưng các lỗi tiêu chuẩn bị ảnh hưởng nghiêm trọng. –

+0

google cho "các giả định hồi quy tuyến tính" độc lập "tương quan nối tiếp", tức là http://www.basic.northwestern.edu/statguidefiles/mulreg_ass_viol.html # Lack% 20of% 20independence –

1

Cố gắng chia nhỏ hàm, bạn đã tính toán sai các thông số. Có một cái nhìn here để tham khảo.

tôi sẽ làm một cái gì đó như sau (xin tha thực tế là tôi không nhớ nhiều về cú pháp SQL và các biến tạm thời, vì vậy mã thực sự có thể sai):

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

Các con số không sao; đã có xung đột dữ liệu ở đâu đó trước đó. –

Các vấn đề liên quan