ตัวประมาณแบบเอนเอียงสำหรับการถดถอยบรรลุผลลัพธ์ที่ดีกว่าแบบไม่เอนเอียงในแบบจำลองข้อผิดพลาดในตัวแปร


13

ฉันกำลังทำงานกับข้อมูล syntatic สำหรับข้อผิดพลาดในตัวแปรแบบจำลองสำหรับการวิจัยบางอย่าง ขณะนี้ฉันมีตัวแปรอิสระเดี่ยวและฉันคาดว่าฉันรู้ถึงความแปรปรวนสำหรับมูลค่าที่แท้จริงของตัวแปรตาม

ดังนั้นด้วยข้อมูลนี้ฉันสามารถบรรลุตัวประมาณค่าแบบไม่เอนเอียงสำหรับค่าสัมประสิทธิ์ของตัวแปรตาม

นางแบบ:

โดยที่: สำหรับบางx~=x+e1
e 1 ~ N ( 0 , σ 2 ) σ e 2 ~ N ( 0 , 1 )y=0.5x10+e2

e1~N(0,σ2)σ
e2~N(0,1)

ไหนค่าของเป็นที่รู้จักสำหรับแต่ละตัวอย่างเท่านั้นและยังเบี่ยงเบนมาตรฐานของมูลค่าที่แท้จริงของตัวอย่างเป็นที่รู้จักกัน: \ x σ xy,x~xσx

ฉันได้รับค่าความเอนเอียง ( ) โดยใช้ OLS แล้วทำการปรับโดยใช้:β^

β=β^σ^x~2σx2

ฉันเห็นว่าตัวประมาณค่าใหม่ที่ไม่เอนเอียงสำหรับค่าสัมประสิทธิ์ดีกว่ามาก (ใกล้เคียงกับมูลค่าที่แท้จริง) ของรุ่นนี้ แต่ MSE แย่ลงกว่าการใช้ตัวประมาณแบบเอนเอียง

เกิดอะไรขึ้น? ฉันคาดว่าตัวประมาณ ubiased จะให้ผลลัพธ์ที่ดีกว่าตัวเอนเอียง

รหัส 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)

ผล:

MSE ประมาณของเอนเอียง:

ans =

  Columns 1 through 7

    1.2171    1.6513    1.9989    2.3914    2.5766    2.6712    2.5997

  Column 8

    2.8346

MSE ที่ไม่เอนเอียง

ans =

  Columns 1 through 7

    1.2308    2.0001    2.9555    4.9727    7.6757   11.3106   14.4283

  Column 8

   11.5653

นอกจากนี้การพิมพ์ค่าของbและbFixed- ฉันเห็นว่าbFixedใกล้เคียงกับมูลค่าที่แท้จริงของ0.5,-10กว่าตัวประมาณค่าเอนเอียง (ตามที่คาดไว้)

ป.ล. ผลที่ได้จากการเป็นกลางที่เลวร้ายยิ่งกว่าตัวประมาณค่าเอนเอียงนั้นมีนัยสำคัญทางสถิติ - การทดสอบสำหรับการละเว้นจากโค้ดเนื่องจากเป็นการทำให้เข้าใจง่ายของโค้ด "เวอร์ชันเต็ม"

UPDTAE:ฉันเพิ่มการทดสอบที่ตรวจสอบและและตัวประมาณค่าแบบเอนเอียงนั้นแย่กว่าค่าที่ไม่เอนเอียงอย่างมีนัยสำคัญตามตัวชี้วัดนี้ถึงแม้ว่าค่า MSE ของตัวประมาณแบบลำเอียง (บนชุดทดสอบ) จะดีกว่าอย่างมาก ที่ไหนเป็นค่าสัมประสิทธิ์ที่แท้จริงของตัวแปรตามเป็นประมาณการลำเอียงสำหรับและเป็นประมาณการที่เป็นกลางสำหรับ\for each test(β^β)2for each test(ββ)2
β=0.5β^βββ

ฉันเชื่อว่านี่แสดงให้เห็นว่าเหตุผลสำหรับผลลัพธ์ไม่ใช่ความแปรปรวนที่สูงขึ้นของตัวประมาณที่ไม่เอนเอียงเนื่องจากยังใกล้เคียงกับมูลค่าที่แท้จริง

เครดิต: การใช้บันทึกการบรรยายของ Steve Pischkeเป็นทรัพยากร


มันจะมีประโยชน์ถ้าคุณโพสต์ผลลัพธ์ด้วยไม่ใช่แค่รหัส
Alecos Papadopoulos

@AlecosPapadopoulos เพิ่มแล้วไม่ได้เพิ่มการพิมพ์ค่าทั้งหมดbและbFixedแต่อธิบายสิ่งที่แสดง
amit

คำตอบ:


2

สรุป: พารามิเตอร์การแก้ไขที่มีการทำนายเป็นหน้าที่ของการทำนายเป็นจริงxหากใช้ในการทำนายพารามิเตอร์ดั้งเดิมจะทำงานได้ดีขึ้นxx~

โปรดทราบว่ามีตัวแบบทำนายผลแบบเส้นตรงสองแบบที่ซุ่มซ่อนอยู่ อันดับแรกได้รับ , วินาทีที่สอง,ได้รับ , yx

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

แม้ว่าเราจะมีการเข้าถึงพารามิเตอร์จริงที่ดีที่สุดเชิงเส้นทำนายเป็นฟังก์ชั่นของการเป็นจะแตกต่างกว่าที่เหมาะสมเชิงเส้นทำนายเป็นหน้าที่ของที่{x} รหัสในคำถามดังต่อไปนี้xx~

  1. β~^,α~^
  2. β^,α^
  3. เปรียบเทียบประสิทธิภาพของและy^1=β^x~+α^y^2=β~^x~+α~^

เนื่องจากในขั้นตอนที่ 3 เราคาดการณ์ว่าฟังก์ชันของไม่ใช่ฟังก์ชันของโดยใช้สัมประสิทธิ์ (ประมาณ) ของโมเดลที่สองทำงานได้ดีขึ้นx~x

แน่นอนถ้าเราเข้าถึง ,และแต่ไม่ใช่เราอาจแทนที่ตัวประมาณแบบเชิงเส้นของในรูปแบบแรก ถ้าเราทำการแปลงรูปแบบเป็นจากนั้นทำการคำนวณในสมการล่าสุดเราจะได้ค่าสัมประสิทธิ์αβx~xx

yx^^=βx^(x~)+α=β(μx+(x^μx)σx2σx~2)+α=σx2σx~2β+αβ(1σx2σx~2)μx.
α~,β~α,βα~,β~. ดังนั้นหากเป้าหมายคือการทำนายเชิงเส้นตามตัวพยากรณ์ที่มีเสียงรบกวนเราควรจะใส่โมเดลเชิงเส้นกับข้อมูลที่มีเสียงดัง ค่าสัมประสิทธิ์ที่ถูกต้องเป็นที่สนใจถ้าเราสนใจปรากฏการณ์ที่แท้จริงด้วยเหตุผลอื่นนอกเหนือจากการทำนายα,β

การทดสอบ

ฉันแก้ไขโค้ดใน OP เพื่อประเมิน MSE สำหรับการคาดการณ์โดยใช้การทำนายที่ไม่รบกวน (รหัสท้ายคำตอบ) ผลที่ได้คือ

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

นั่นคือเมื่อใช้แทนพารามิเตอร์ที่แก้ไขจะชนะพารามิเตอร์ที่ไม่ถูกแก้ไขตามที่คาดไว้ นอกจากนี้การทำนายด้วย ( ) นั่นคือพารามิเตอร์คงที่และตัวทำนายที่แท้จริงนั้นดีกว่า ( ) ที่ คือพารามิเตอร์ reg และตัวพยากรณ์ที่มีเสียงรบกวนเนื่องจากเสียงรบกวนทำให้การคาดคะเนค่อนข้างแม่นยำ อีกสองกรณีสอดคล้องกับการใช้พารามิเตอร์ของตัวแบบที่ไม่ถูกต้องและทำให้เกิดผลลัพธ์ที่อ่อนแอกว่าxx~α,β,xα~,β~,x~

คำเตือนเกี่ยวกับความไม่เชิงเส้น

ที่จริงแล้วแม้ว่าความสัมพันธ์ระหว่างจะเป็นเชิงเส้นความสัมพันธ์ระหว่างและอาจไม่เป็นเช่นนั้น นี้ขึ้นอยู่กับการกระจายของxตัวอย่างเช่นในโค๊ดปัจจุบันถูกดึงมาจากการแจกแจงแบบสม่ำเสมอดังนั้นไม่ว่าจะสูงแค่ไหนเรารู้ขอบเขตบนของดังนั้นทำนายไว้เป็นหน้าที่ของควร เปียกโชก วิธีแก้ปัญหาแบบเบย์ที่เป็นไปได้คือการวางการแจกแจงความน่าจะเป็นสำหรับแล้วเสียบเมื่อได้รับY ~ x x x ~ x x Y ~ x x E ( x | ~ x ) Y x xy,xyx~xxx~xyx~xE(xx~)y^^x- แทนที่จะใช้การทำนายเชิงเส้นที่ฉันใช้ก่อนหน้านี้ อย่างไรก็ตามหากมีใครเต็มใจที่จะวางการแจกแจงความน่าจะเป็นสำหรับฉันคิดว่าควรจะใช้วิธีการแก้ปัญหาแบบเบย์แบบเต็มรูปแบบแทนวิธีการตามการแก้ไขการประมาณค่า OLS ในครั้งแรกx

รหัส MATLAB สำหรับการจำลองผลการทดสอบ

โปรดทราบว่านี่ยังมีการใช้งานของฉันเองสำหรับการประเมินและ OLS_solver เนื่องจากพวกเขาไม่ได้รับคำถาม

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))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.