Penaksir yang bias untuk regresi mencapai hasil yang lebih baik daripada yang tidak bias dalam Error In Variables Model

13

Saya sedang mengerjakan beberapa data sintaksis untuk model Error In Variable untuk beberapa penelitian. Saat ini saya memiliki satu variabel independen, dan saya berasumsi saya tahu varians untuk nilai sebenarnya dari variabel dependen.

Jadi, dengan informasi ini, saya dapat mencapai estimator yang tidak bias untuk koefisien variabel dependen.

Model:

y=0,5x-10+e2x~=x+e1
y=0.5x10+e2
Di mana: untuk beberapa
σ e 2 ~ N ( 0 , 1 )e1~N(0,σ2)σ
e2~N(0,1)

Di mana nilai y,x~ hanya diketahui untuk setiap sampel, dan juga standar deviasi dari nilai riil x untuk sampel diketahui: σx .

Saya mendapatkan koefisien bias ( β^ ) menggunakan OLS, dan kemudian membuat penyesuaian menggunakan:

β=β^σ^x~2σx2

Saya melihat bahwa estimator baru saya yang tidak bias untuk koefisien jauh lebih baik (lebih dekat dengan nilai sebenarnya) dengan model ini, tetapi MSE semakin buruk daripada menggunakan estimator yang bias.

Apa yang terjadi? Saya mengharapkan estimator yang ada di mana-mana untuk menghasilkan hasil yang lebih baik daripada yang bias.

Kode 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)

Hasil:

MSE estimator yang bias:

ans =

  Columns 1 through 7

    1.2171    1.6513    1.9989    2.3914    2.5766    2.6712    2.5997

  Column 8

    2.8346

MSE estimator yang tidak sesuai:

ans =

  Columns 1 through 7

    1.2308    2.0001    2.9555    4.9727    7.6757   11.3106   14.4283

  Column 8

   11.5653

Selain itu, mencetak nilai-nilai bdan bFixed- Saya melihat bahwa bFixedmemang lebih dekat dengan nilai riil dari 0.5,-10estimator yang bias (seperti yang diharapkan).

PS Hasil yang tidak bias lebih buruk daripada penaksir yang bias signifikan secara statistik - tes untuk itu dihilangkan dari kode, karena ini adalah penyederhanaan kode "versi lengkap".

UPDTAE: Saya menambahkan tes yang memeriksa dan , dan estimator yang bias memang jauh lebih buruk (nilai lebih besar) daripada yang tidak bias menurut metrik ini, meskipun MSE dari estimator yang bias (pada set-test) secara signifikan lebih baik. Di mana adalah koefisien nyata dari variabel dependen, adalah penaksir yang bias untuk , dan adalah penaksir yang tidak bias untuk .untuk setiap tes(β^-β)2untuk setiap tes(β-β)2
β=0,5β^βββ

Ini saya percaya menunjukkan bahwa alasan untuk hasil BUKAN varians yang lebih tinggi dari penaksir tidak bias, karena masih lebih dekat dengan nilai sebenarnya.

Kredit: Menggunakan catatan Kuliah Steve Pischke sebagai sumber

ya
sumber
Akan sangat membantu jika Anda memposting juga hasilnya, dan bukan hanya kode.
Alecos Papadopoulos
@AlecosPapadopoulos Menambahkannya, tidak menambahkan pencetakan semua nilai bdan bFixed, tetapi menjelaskan apa yang ditampilkan.
amit

Jawaban:

2

Ringkasan: parameter yang dikoreksi adalah untuk memprediksi sebagai fungsi dari predictor sejati . Jika digunakan dalam prediksi, parameter asli berkinerja lebih baik.xx~

Perhatikan bahwa ada dua model prediksi linear yang bersembunyi. Pertama, diberikan , kedua, diberikan , yx

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

Bahkan jika kita memiliki akses ke parameter sebenarnya, prediksi linear optimal sebagai fungsi akan berbeda dari prediksi linear optimal sebagai fungsi dari . Kode dalam pertanyaan berikut:xx~

  1. Perkirakan parameterβ~^,α~^
  2. Hitung taksiranβ^,α^
  3. Bandingkan kinerja dany^1=β^x~+α^y^2=β~^x~+α~^

Karena pada langkah 3 kami memperkirakan sebagai fungsi , bukan sebagai fungsi , menggunakan (estimasi) koefisien dari model kedua berfungsi lebih baik.x~x

Memang, jika kita memiliki akses ke , dan tetapi tidak , kita mungkin mengganti penaksir linier dalam model pertama, Jika kita pertama kali melakukan bentuk transformasi menjadi dan kemudian melakukan perhitungan dalam persamaan terbaru, kita mendapatkan kembali koefisienαβx~xx

yx^^=βx^(x~)+α=β(μx+(x^-μx)σx2σx~2)+α=σx2σx~2β+α-β(1-σx2σx~2)μx.
α~,β~α,βα~,β~. Jadi, jika tujuannya adalah untuk melakukan prediksi linier mengingat versi prediktor yang berisik, kita harus menyesuaikan model linier dengan data yang berisik. Koefisien terkoreksi menarik jika kita tertarik pada fenomena sebenarnya karena alasan lain selain prediksi.α,β

Pengujian

Saya mengedit kode di OP untuk juga mengevaluasi UMK untuk prediksi menggunakan versi prediksi yang tidak berisik (kode di akhir jawaban). Hasilnya

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

Yaitu, ketika menggunakan bukannya , parameter yang diperbaiki memang mengalahkan parameter yang tidak dikoreksi, seperti yang diharapkan. Selain itu, prediksi dengan ( ), yaitu, parameter tetap dan prediktor sebenarnya, lebih baik daripada ( ), yang adalah, parameter reg dan prediktor bising, karena jelas derau itu merusak akurasi prediksi. Dua kasus lainnya sesuai dengan menggunakan parameter model yang salah dan dengan demikian menghasilkan hasil yang lebih lemah.xx~α,β,xα~,β~,x~

Peringatan tentang nonlinier

Sebenarnya, bahkan jika hubungan antara adalah linier, hubungan antara dan mungkin tidak. Ini tergantung pada distribusi . Misalnya, dalam kode ini, diambil dari distribusi seragam, jadi tidak peduli seberapa tinggi adalah, kita tahu batas atas untuk dan dengan demikian diprediksi sebagai fungsi dari harus jenuh. Solusi Bayesian-style yang mungkin adalah menempatkan distribusi probabilitas untuk dan kemudian memasukkan saat memperolehy,xyx~xxx~xyx~xE(xx~)y^^x- Alih-alih prediksi linear yang saya gunakan sebelumnya. Namun, jika seseorang berkeinginan menempatkan distribusi probabilitas untuk , saya kira orang harus pergi untuk solusi Bayesian penuh daripada pendekatan yang didasarkan pada mengoreksi estimasi OLS di tempat pertama.x

Kode MATLAB untuk mereplikasi hasil tes

Perhatikan bahwa ini juga berisi implementasi saya sendiri untuk evaluasi dan OLS_solver karena tidak diberikan dalam pertanyaan.

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))
Juho Kokkala
sumber