Công cụ ước tính thiên vị cho hồi quy đạt được kết quả tốt hơn so với công cụ không thiên vị trong Mô hình Lỗi trong Biến


13

Tôi đang làm việc trên một số dữ liệu tổng hợp cho mô hình Error In Var biến cho một số nghiên cứu. Hiện tại tôi có một biến độc lập duy nhất và tôi giả sử tôi biết phương sai cho giá trị thực của biến phụ thuộc.

Vì vậy, với thông tin này, tôi có thể đạt được một công cụ ước tính không thiên vị cho hệ số của biến phụ thuộc.

Ngươi mâu:

y=0,5x-10+e2x~=x+e1
y=0.5x10+e2
Trong đó: đối với một số \ sigma e_2 \ text {~} N (0,1)
σ e 2 ~ N ( 0 , 1 )e1~N(0,σ2)σ
e2~N(0,1)

Trong đó các giá trị của y,x~ chỉ được biết cho mỗi mẫu và độ lệch chuẩn của giá trị thực của x cho mẫu được biết: σx .

Tôi nhận được hệ số thiên vị ( ) bằng OLS và sau đó thực hiện điều chỉnh bằng cách sử dụng:β^

β'= =β^*σ^x~2σx2

Tôi thấy rằng công cụ ước tính mới, không thiên vị cho hệ số của tôi tốt hơn nhiều (gần với giá trị thực) với mô hình này, nhưng MSE đang trở nên tồi tệ hơn so với việc sử dụng công cụ ước tính sai lệch.

Chuyện gì đang xảy ra vậy? Tôi mong đợi một công cụ ước tính có mặt để mang lại kết quả tốt hơn so với ước tính sai lệch.

Mã Matlab:

reg_mse_agg = [];
fixed_mse_agg = [];
varMult = 1;
numTests = 60;
for dataNumber=1:8
    reg_mses = [];
    fixed_mses = [];

    X = rand(1000,1);
    X(:,1) = X(:,1) * 10;
    X(:,1) = X(:,1) + 5;

    varX = var(X);
    y = 0.5 * X(:,1) -10;

    y = y + normrnd(0,1,size(y));    
    origX = X;
    X = X + normrnd(0,dataNumber * varMult ,size(X));
    train_size = floor(0.5 * length(y));
    for t=1:numTests,
        idx = randperm(length(y));
        train_idx = idx(1:train_size);
        test_idx = idx(train_size+1:end);
        Xtrain = X(train_idx,:);
        ytrain = y(train_idx);        
        Xtest = X(test_idx,:);
        ytest = y(test_idx);

        b = OLS_solver(Xtrain, ytrain);
        %first arg of evaluate returns MSE, working correctly.
        [ reg_mse, ~ ] = evaluate( b,Xtest,ytest);
        reg_mses = [reg_mses ; reg_mse];

        varInd = var(Xtrain);
        varNoise = varInd - varX;
        bFixed = [0 0]';
        bFixed(1) = b(1) * varInd / varX;
        bFixed(2) = mean(ytrain - bFixed(1)*Xtrain);
        [fixed_mse,~ ] = evaluate( bFixed,Xtest,ytest);
        fixed_mses = [fixed_mses ; fixed_mse];

        dataNumber * varMult
        b
        bFixed

    end
    reg_mse_agg = [reg_mse_agg , reg_mses];
    fixed_mse_agg = [fixed_mse_agg , fixed_mses];

end

mean(reg_mse_agg)
mean(fixed_mse_agg)

Các kết quả:

MSE ước tính thiên vị:

ans =

  Columns 1 through 7

    1.2171    1.6513    1.9989    2.3914    2.5766    2.6712    2.5997

  Column 8

    2.8346

MSE ước tính không thiên vị:

ans =

  Columns 1 through 7

    1.2308    2.0001    2.9555    4.9727    7.6757   11.3106   14.4283

  Column 8

   11.5653

Ngoài ra, in các giá trị của bbFixed- tôi thấy điều đó bFixedthực sự gần với các giá trị thực 0.5,-10hơn so với công cụ ước tính sai lệch (như mong đợi).

PS Kết quả của việc không thiên vị là tồi tệ hơn công cụ ước tính sai lệch có ý nghĩa thống kê - thử nghiệm cho nó được bỏ qua từ mã, vì nó là đơn giản hóa mã "phiên bản đầy đủ".

CẬP NHẬT: Tôi đã thêm một thử nghiệm kiểm tra và và công cụ ước tính sai lệch thực sự kém hơn đáng kể (giá trị lớn hơn) so với giá trị không thiên vị theo số liệu này, mặc dù MSE của công cụ ước tính thiên vị (trên bộ kiểm tra) tốt hơn đáng kể. Trong đó là hệ số thực của biến phụ thuộc, là công cụ ước tính thiên vị cho và là công cụ ước tính không thiên vị cho . Σ cho mỗi bài kiểm tra ( β ' - β ) 2 β = 0,5 β β β ' βΣcho mỗi bài kiểm tra(β^-β)2Σcho mỗi bài kiểm tra(β'-β)2
β= =0,5β^ββ'β

Điều này tôi tin rằng cho thấy lý do cho kết quả KHÔNG phải là phương sai cao hơn của công cụ ước lượng không thiên vị, vì nó vẫn gần với giá trị thực hơn.

Tín dụng: Sử dụng các ghi chú bài giảng của Steve Pischke làm tài nguyên


Nó sẽ hữu ích nếu bạn cũng đăng kết quả, và không chỉ mã.
Alecos Papadopoulos

@AlecosPapadopoulos Đã thêm nó, không thêm việc in tất cả các giá trị của bbFixed, nhưng giải thích những gì chúng hiển thị.
amit

Câu trả lời:


2

Tóm tắt: các tham số đã sửa là để dự đoán là một hàm của bộ dự đoán đúng . Nếu được sử dụng trong dự đoán, các tham số ban đầu hoạt động tốt hơn.˜ xxx~

Lưu ý rằng có hai mô hình dự đoán tuyến tính khác nhau ẩn nấp xung quanh. Đầu tiên, cho , thứ hai, cho , x y x = βyxy ˜ x

y^x= =βx+α,
yx~
y^x~= =β~x~+α~.

Ngay cả khi chúng ta có quyền truy cập vào các tham số thực, dự đoán tuyến tính tối ưu là hàm của sẽ khác với dự đoán tuyến tính tối ưu là hàm của . Mã trong câu hỏi làm như sau˜ xxx~

  1. Ước tính các tham sốβ~^,α~^
  2. Tính toán ước tínhβ^,α^
  3. So sánh hiệu suất của vày^1= =β^x~+α^y^2= =β~^x~+α~^

Vì trong bước 3, chúng tôi dự đoán là một hàm của , không phải là hàm của , sử dụng các hệ số (ước tính) của mô hình thứ hai hoạt động tốt hơn.x~x

Thật vậy, nếu chúng tôi có quyền truy cập vào , và nhưng không phải , chúng tôi có thể thay thế một công cụ ước tính tuyến tính của trong mô hình đầu tiên, Nếu lần đầu tiên chúng tôi thực hiện dạng biến đổi thành và sau đó thực hiện tính toán trong phương trình mới nhất, chúng tôi sẽ lấy lại các hệ sốbeta ~ x xαβx~xx

yx^^= =βx^(x~)+α= =β(μx+(x^-μx)σx2σx~2)+α= =σx2σx~2β+α-β(1-σx2σx~2)μx.
α~,β~α,βα~,β~. Vì vậy, nếu mục tiêu là thực hiện dự đoán tuyến tính với phiên bản nhiễu của bộ dự đoán, chúng ta chỉ nên điều chỉnh mô hình tuyến tính với dữ liệu nhiễu. Các hệ số đã sửa được quan tâm nếu chúng ta quan tâm đến hiện tượng thực sự vì những lý do khác ngoài dự đoán.α,β

Kiểm tra

Tôi đã chỉnh sửa mã trong OP để đánh giá các MSE cho các dự đoán bằng cách sử dụng phiên bản dự đoán không gây ồn ào (mã ở cuối câu trả lời). Kết quả là

Reg parameters, noisy predictor
1.3387    1.6696    2.1265    2.4806    2.5679    2.5062    2.5160    2.8684

Fixed parameters, noisy predictor
1.3981    2.0626    3.2971    5.0220    7.6490   10.2568   14.1139   20.7604

Reg parameters, true predictor
1.3354    1.6657    2.1329    2.4885    2.5688    2.5198    2.5085    2.8676

Fixed parameters, true predictor
1.1139    1.0078    1.0499    1.0212    1.0492    0.9925    1.0217    1.2528

Đó là, khi sử dụng thay vì , các tham số đã sửa thực sự đánh bại các tham số không được quan tâm, như mong đợi. Hơn nữa, dự đoán với ( ), nghĩa là các tham số cố định và dự đoán đúng, tốt hơn ( ), rằng là, tham số reg và bộ dự báo nhiễu, vì rõ ràng nhiễu gây hại cho phần chính xác dự đoán. Hai trường hợp khác tương ứng với việc sử dụng các tham số của một mô hình sai và do đó tạo ra kết quả yếu hơn.xx~α,β,xα~,β~,x~

Hãy cẩn thận về phi tuyến

Trên thực tế, ngay cả khi mối quan hệ giữa là tuyến tính, mối quan hệ giữa và có thể không. Điều này phụ thuộc vào sự phân phối của . Ví dụ, trong đoạn code hiện tại, được rút ra từ sự phân bố đồng đều, do đó không có vấn đề như thế nào cao là, chúng ta biết một trên ràng buộc cho và do đó dự đoán như một chức năng của nên bão hòa. Một giải pháp theo kiểu Bayes có thể là đặt ra phân phối xác suất cho và sau đó cắm khi tạo ray,xyx~xxx~xyx~xE(x|x~)y^^x- thay vì dự đoán tuyến tính tôi đã sử dụng trước đây. Tuy nhiên, nếu một người sẵn sàng đưa ra phân phối xác suất cho , tôi cho rằng người ta nên tìm giải pháp Bayes đầy đủ thay vì cách tiếp cận dựa trên việc sửa các ước tính OLS ở vị trí đầu tiên.x

Mã MATLAB để sao chép kết quả thử nghiệm

Lưu ý rằng điều này cũng chứa các triển khai của riêng tôi để đánh giá và OLS_solver vì chúng không được đưa ra trong câu hỏi.

rng(1)

OLS_solver = @(X,Y) [X ones(size(X))]'*[X ones(size(X))] \ ([X ones(size(X))]' * Y);
evaluate = @(b,x,y)  mean(([x ones(size(x))]*b - y).^2);

reg_mse_agg = [];
fixed_mse_agg = [];
reg_mse_orig_agg = [];
fixed_mse_orig_agg = [];

varMult = 1;
numTests = 60;
for dataNumber=1:8
    reg_mses = [];
    fixed_mses = [];
    reg_mses_orig = [];
    fixed_mses_orig = [];

    X = rand(1000,1);
    X(:,1) = X(:,1) * 10;
    X(:,1) = X(:,1) + 5;

    varX = var(X);
    y = 0.5 * X(:,1) -10;

    y = y + normrnd(0,1,size(y));    
    origX = X;
    X = X + normrnd(0,dataNumber * varMult ,size(X));
    train_size = floor(0.5 * length(y));
    for t=1:numTests,
        idx = randperm(length(y));
        train_idx = idx(1:train_size);
        test_idx = idx(train_size+1:end);
        Xtrain = X(train_idx,:);
        ytrain = y(train_idx);        
        Xtest = X(test_idx,:);
        origXtest = origX(test_idx,:);
        ytest = y(test_idx);

        b = OLS_solver(Xtrain, ytrain);
        %first arg of evaluate returns MSE, working correctly.
        reg_mse = evaluate( b,Xtest,ytest);
        reg_mses = [reg_mses ; reg_mse];

        varInd = var(Xtrain);
        varNoise = varInd - varX;
        bFixed = [0 0]';
        bFixed(1) = b(1) * varInd / varX;
        bFixed(2) = mean(ytrain - bFixed(1)*Xtrain);
        fixed_mse = evaluate( bFixed,Xtest,ytest);
        fixed_mses = [fixed_mses ; fixed_mse];

        reg_mse_orig = evaluate(b, origXtest, ytest);
        reg_mses_orig = [reg_mses; reg_mses_orig];

        fixed_mse_orig = evaluate(bFixed, origXtest, ytest);
        fixed_mses_orig = [fixed_mses_orig; fixed_mse_orig];

    end
    reg_mse_agg = [reg_mse_agg , reg_mses];
    fixed_mse_agg = [fixed_mse_agg , fixed_mses];

    reg_mse_orig_agg = [reg_mse_orig_agg , reg_mses_orig];
    fixed_mse_orig_agg = [fixed_mse_orig_agg , fixed_mses_orig]; 
end

disp('Reg parameters, noisy predictor')
disp(mean(reg_mse_agg))
disp('Fixed parameters, noisy predictor')
disp(mean(fixed_mse_agg))
disp('Reg parameters, true predictor')
disp(mean(reg_mse_orig_agg))
disp('Fixed parameters, true predictor')
disp(mean(fixed_mse_orig_agg))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.