Verzerrter Schätzer für die Regression, der bessere Ergebnisse erzielt als der unverzerrte Schätzer im Modell für Fehler in Variablen

13

Ich arbeite an einigen syntaktischen Daten für das Error-In-Variable-Modell für einige Untersuchungen. Derzeit habe ich eine einzige unabhängige Variable und gehe davon aus, dass ich die Varianz für den wahren Wert der abhängigen Variablen kenne.

Mit diesen Informationen kann ich also einen unverzerrten Schätzer für den Koeffizienten der abhängigen Variablen erzielen.

Das Model:

y=0,5x-10+e2x~=x+e1
y=0.5x10+e2
Wobei: für etwas e_2 \ text {~} N (0,1)
σ e 2 ~ N ( 0 , 1 )e1~N(0,σ2)σ
e2~N(0,1)

Wobei die Werte von y,x~ nur für jede Stichprobe bekannt sind und auch die Standardabweichung des realen Wertes von x für die Stichprobe bekannt ist: σx .

Ich erhalte den voreingenommenen ( β^ ) Koeffizienten mit OLS und nehme dann Anpassungen vor mit:

β=β^σ^x~2σx2

Ich sehe, dass mein neuer, unvoreingenommener Schätzer für den Koeffizienten mit diesem Modell viel besser (näher am realen Wert) ist, aber die MSE wird schlechter als die Verwendung des voreingenommenen Schätzers.

Was ist los? Ich habe erwartet, dass ein voreingenommener Schätzer bessere Ergebnisse liefert als der voreingenommene.

Matlab-Code:

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)

Ergebnisse:

voreingenommene Schätzer MSE:

ans =

  Columns 1 through 7

    1.2171    1.6513    1.9989    2.3914    2.5766    2.6712    2.5997

  Column 8

    2.8346

Unvoreingenommene Schätzer MSE:

ans =

  Columns 1 through 7

    1.2308    2.0001    2.9555    4.9727    7.6757   11.3106   14.4283

  Column 8

   11.5653

Darüber hinaus ist das Drucken der Werte von bund bFixed- meiner bFixedAnsicht nach in der Tat näher an den tatsächlichen Werten 0.5,-10als der voreingenommene Schätzer (wie erwartet).

PS: Die Ergebnisse des unverzerrten Abschätzers sind statistisch signifikant schlechter als der verzerrte Abschätzer. Der Test dafür wird im Code weggelassen, da es sich um eine Vereinfachung des Codes der "Vollversion" handelt.

UPDTAE: Ich habe einen Test hinzugefügt, der und prüft , und der verzerrte Schätzer ist in der Tat signifikant schlechter (größerer Wert) als der unverzerrte Schätzer gemäß dieser Metrik, obwohl der MSE des verzerrten Schätzers (auf der Testmenge) signifikant besser ist. Wobei der reale Koeffizient der abhängigen Variablen ist, der voreingenommene Schätzer für ; ist und ; der unvoreingenommene Schätzer für . Σ für jeden Test ( β ' - β ) 2 β = 0,5 β β β ' βfor each test(β^β)2for each test(ββ)2
β=0.5β^βββ

Dies zeigt meines Erachtens, dass der Grund für die Ergebnisse NICHT die höhere Varianz des unverzerrten Schätzers ist, da sie immer noch näher am tatsächlichen Wert liegt.

Kredit: Mit Vorlesungsunterlagen von Steve Pischke als Ressource

amit
quelle
Es wäre hilfreich, wenn Sie auch die Ergebnisse und nicht nur den Code veröffentlichen würden.
Alecos Papadopoulos
@AlecosPapadopoulos Fügte hinzu, fügte nicht den Ausdruck aller Werte von bund hinzu bFixed, sondern erklärte, was sie anzeigen .
amit

Antworten:

2

Zusammenfassung: Die korrigierten Parameter dienen zur Vorhersage als Funktion des wahren Prädiktors . Wenn für die Vorhersage verwendet wird, erzielen die ursprünglichen Parameter eine bessere Leistung.˜ xxx~

Beachten Sie, dass es zwei verschiedene lineare Vorhersagemodelle gibt. Erstens, gegeben , zweitens, gegeben , x y x = βyxy ~ x y ~ x = ~ β

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

Selbst wenn wir Zugriff auf die wahren Parameter hätten, würde sich die optimale lineare Vorhersage als Funktion von der optimalen linearen Vorhersage als Funktion von . Der Code in der Frage bewirkt Folgendes˜ xxx~

  1. Schätzen Sie die Parameterβ~^,α~^
  2. Schätzungen berechnenβ^,α^
  3. Vergleichen Sie die Leistung von undy 2= ~ βy^1=β^x~+α^y^2=β~^x~+α~^

Da wir in Schritt 3 als Funktion von und nicht als Funktion von vorhersagen , funktioniert die Verwendung von (geschätzten) Koeffizienten des zweiten Modells besser. xx~x

In der Tat, wenn wir Zugriff auf , und aber nicht auf , könnten wir im ersten Modell einen linearen Schätzer für : Wenn wir zuerst die Transformationsform nach ausführen und dann die Berechnung in der neuesten Gleichung durchführen, erhalten wir die Koeffizientenβ ~ x x x ^ ^ y x = βαβx~xx

yx^^=βx^(x~)+α=β(μx+(x^μx)σx2σx~2)+α=σx2σx~2β+αβ(1σx2σx~2)μx.
α~,β~α,βα~,β~. Wenn das Ziel eine lineare Vorhersage angesichts der verrauschten Version des Prädiktors ist, sollten wir nur ein lineares Modell an die verrauschten Daten anpassen. Die korrigierten Koeffizienten sind von Interesse, wenn wir uns aus anderen Gründen als der Vorhersage für das wahre Phänomen interessieren.α,β

Testen

Ich habe den Code in OP bearbeitet, um auch MSEs für Vorhersagen zu bewerten, indem ich die nicht verrauschte Version der Vorhersage verwendete (Code am Ende der Antwort). Die Ergebnisse sind

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

Wenn also anstelle von , schlagen die korrigierten Parameter erwartungsgemäß die nicht korrigierten Parameter. Darüber hinaus ist die Vorhersage mit ( ), dh festen Parametern und wahrem Prädiktor, besser als ( ) is, reg parameter und noisy predictor, da offensichtlich das rauschen die prädiktionsgenauigkeit etwas beeinträchtigt. Die beiden anderen Fälle entsprechen der Verwendung der Parameter eines falschen Modells und führen somit zu schwächeren Ergebnissen.xx~α,β,xα~,β~,x~

Einschränkung der Nichtlinearität

Selbst wenn die Beziehung zwischen linear ist, kann es sein, dass die Beziehung zwischen und nicht linear ist . Dies hängt von der Verteilung von . Zum Beispiel in dem vorliegenden Code, wird von der Gleichverteilung gezogen, so egal wie hoch ist, wissen wir eine obere für gebundenen und damit die vorhergesagte als Funktion von sollte sättigen. Eine mögliche Bayes'sche Lösung wäre, eine Wahrscheinlichkeitsverteilung für zu setzen und dann einzufügen, wenny,xyx~xxx~xyx~xE(xx~)y^^x- Anstelle der zuvor verwendeten linearen Vorhersage. Wenn man jedoch bereit ist, eine Wahrscheinlichkeitsverteilung für zu setzen , sollte man sich für eine vollständige Bayes'sche Lösung entscheiden, anstatt zunächst auf der Korrektur von OLS-Schätzungen zu beruhen.x

MATLAB-Code zum Replizieren des Testergebnisses

Beachten Sie, dass dies auch meine eigenen Implementierungen für Evaluate und OLS_solver enthält, da diese in der Frage nicht angegeben wurden.

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
quelle