Değişkenlerde Hata Modelinde tarafsız olandan daha iyi sonuçlar elde etmek için regresyon için önyargılı tahminci


13

Bazı araştırmalar için Değişken Hatası modelinde bazı sözdizim verileri üzerinde çalışıyorum. Şu anda tek bir bağımsız değişkenim var ve bağımlı değişkenin gerçek değeri için varyansı bildiğimi varsayıyorum.

Böylece, bu bilgilerle, bağımlı değişkenin katsayısı için tarafsız bir tahminci elde edebilirim.

Model:

y=0,5x-10+e2x~=x+e1
y=0.5x10+e2
Burada: bazı için
σ E 2 ~ , N ( 0 , 1 )e1~N(0,σ2)σ
e2~N(0,1)

Değerleri Burada sadece her bir örnek, aynı zamanda gerçek değerinin standart sapmasına ait bilinmektedir örnek için bilinen: . x σ xy,x~xσx

OLS kullanarak önyargılı ( ) katsayısını alıyorum ve sonra kullanarak ayarlamalar yapıyorum:β^

β=β^σ^x~2σx2

Görüyorum ki, katsayı için yeni, tarafsız tahmincim bu modelle çok daha iyi (gerçek değere daha yakın), ancak MSE önyargılı tahminciyi kullanmaktan daha da kötüye gidiyor.

Ne oluyor? Şüpheli bir tahmincinin taraflı olandan daha iyi sonuçlar vermesini bekledim.

Matlab kodu:

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)

Sonuçlar:

önyargılı tahmin edicinin MSE'si:

ans =

  Columns 1 through 7

    1.2171    1.6513    1.9989    2.3914    2.5766    2.6712    2.5997

  Column 8

    2.8346

Tarafsız tahmin edicinin MSE'si:

ans =

  Columns 1 through 7

    1.2308    2.0001    2.9555    4.9727    7.6757   11.3106   14.4283

  Column 8

   11.5653

Buna ek olarak, bve bFixed- değerlerini yazdırmak, bFixedbunun aslında 0.5,-10önyargılı tahmin ediciden (beklendiği gibi) gerçek değerlere daha yakın olduğunu görüyorum .

PS Tarafsız öngörüden daha kötü olanın sonuçları istatistiksel olarak anlamlıdır - "tam sürüm" kodunun basitleştirilmesinden dolayı, test koddan çıkarılmıştır.

GÜNCELLEME: test ve , ve önyargılı tahmin edici gerçekten de bu metriğe göre tarafsız olandan daha büyüktür (daha büyük değer), ancak önyargılı tahmincinin MSE'si (test setinde) önemli ölçüde daha iyi olsa da. Burada , bağımlı değişken, gerçek katsayısıdır, için yanlı kestiricisi olduğu ve için tarafsız tahmin olan . Σ her test için ( β ' - β ) 2 β = 0.5 β β β ' βfor each test(β^β)2for each test(ββ)2
β=0.5β^βββ

Bu, sonuçların nedeninin, hala gerçek değere daha yakın olduğu için tarafsız tahmin edicinin daha yüksek varyansı OLMADIĞINI gösterdiğine inanıyorum.

Kredi: Steve Pischke'nin ders notlarını kaynak olarak kullanma


Yalnızca kodu değil, sonuçları da gönderirseniz yardımcı olur.
Alecos Papadopoulos

@AlecosPapadopoulos Ekledi, bve değerlerinin tümünün yazdırılmasını eklemedi bFixed, ancak ne gösterdiklerini açıkladı.
amit

Yanıtlar:


2

Özet: düzeltilmiş parametreler, gerçek yordayıcı bir fonksiyonu olarak tahmin içindir . Eğer tahmin kullanılır, orijinal parametreler daha iyi performans.xx~

Dikkat çeken iki farklı doğrusal tahmin modeli olduğunu unutmayın. İlk olarak, verilen , , ikinci, verilen , yx

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

Gerçek parametrelere erişimimiz olsa bile, bir fonksiyonu olarak optimal doğrusal tahmin, nin bir fonksiyonu olarak optimal lineer tahminden farklı olacaktır . Sorudaki kod aşağıdakileri yaparxx~

  1. parametrelerini tahmin edinβ~^,α~^
  2. Hesaplama tahminleriβ^,α^
  3. Performansını karşılaştırın vey^1=β^x~+α^y^2=β~^x~+α~^

Adım 3 de bir fonksiyonu olarak tahmin edildiğinden değil, bir fonksiyonu olarak , ikinci modeli kullanılarak (tahmin edilen) katsayıları daha iyi çalışır.x~x

Gerçekten de, , ve erişimimiz varsa , ancak olmasaydı , ilk modelde doğrusal bir tahmincisini değiştirebiliriz , öncelikle dönüşüm formu gerçekleştirirseniz için ve ardından son denklemde hesaplama yapmak, biz katsayıları geri almakαβx~xx˜ α , ˜ β α,β ˜ α , ˜ β α,β

yx^^=βx^(x~)+α=β(μx+(x^μx)σx2σx~2)+α=σx2σx~2β+αβ(1σx2σx~2)μx.
α~,β~α,βα~,β~. Dolayısıyla, eğer hedef öngörücünün gürültülü versiyonu göz önüne alındığında doğrusal tahmin yapmaksa, gürültülü verilere sadece doğrusal bir model yerleştirmeliyiz. Tahminden başka nedenlerle gerçek fenomenle ilgilenirsek düzeltilmiş katsayılar ilgilenir.α,β

Test yapmak

Ayrıca, gürültünün gürültülü olmayan versiyonunu (cevabın sonunda kod) kullanarak MSE'leri tahminler için değerlendirmek üzere OP'de kodu düzenledim. Sonuçlar

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

Yani, yerine kullanıldığında , düzeltilen parametreler gerçekten de düzeltilmemiş parametreleri beklendiği gibi atar. Ayrıca, ( ), yani sabit parametreler ve gerçek öngörücü ile tahmin, ( ) ' den daha iyidir . reg parametreleri ve gürültülü kestirimcidir, çünkü gürültü belli ki tahmin kestirimine biraz zarar verir. Diğer iki durum, yanlış bir modelin parametrelerinin kullanılmasına karşılık gelir ve dolayısıyla daha zayıf sonuçlar verir.˜ x α , β , x ˜ α , ˜ β , ˜ xxx~α,β,xα~,β~,x~

Doğrusalsızlık hakkında uyarı

Aslında, arasındaki ilişki doğrusal olsa bile , ve arasındaki ilişki olmayabilir. Bu dağılımına bağlıdır . Örneğin, mevcut kodda, tekdüze dağılımdan çekilir, bu nedenle ne kadar yüksek olursa olsun , için bir üst sınır biliyoruz ve bu nedenle nin bir fonksiyonu olarak tahmin edilen Doymuş. Olası bir Bayes tarzı çözeltisi için bir olasılık dağılımını varsaymak olacaktır ve fiş türetilmesi-Y ~ x x x ~ x x y ~ x x D ( x | ~ x ) y x xy,xyx~xxx~xyx~xE(xx~)y^^x- daha önce kullandığım doğrusal tahmin yerine. Bununla birlikte, eğer biri için bir olasılık dağılımı ortaya koymaya istekli ise, ilk etapta OLS tahminlerini düzeltmeye dayanan bir yaklaşım yerine tam bir Bayesian çözümü için gitmek gerektiğini varsayalım.x

Test sonucunu çoğaltmak için MATLAB kodu

Bunun, soruda verilmediği için değerlendirme ve OLS_solver uygulamalarını da içerdiğini unutmayın.

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.