Estimateur biaisé pour la régression obtenant de meilleurs résultats que celui non biaisé dans le modèle d'erreur dans les variables

13

Je travaille sur certaines données syntaxiques pour le modèle Error In Variable pour certaines recherches. Actuellement, j'ai une seule variable indépendante et je suppose que je connais la variance pour la vraie valeur de la variable dépendante.

Donc, avec cette information, je peux obtenir un estimateur sans biais pour le coefficient de la variable dépendante.

Le modèle:

y=0,5x-10+e2x~=x+e1
y=0.5x10+e2
Où: pour certains \ sigma e_2 \ text {~} N (0,1)
σ e 2 ~ N ( 0 , 1 )e1~N(0,σ2)σ
e2~N(0,1)

Lorsque les valeurs de y,x~ sont connues pour chaque échantillon uniquement, et que l'écart-type de la valeur réelle de x pour l'échantillon est connu: σx .

J'obtiens le coefficient biaisé ( β^ ) en utilisant OLS, puis en faisant des ajustements en utilisant:

β=β^σ^x~2σx2

Je vois que mon nouvel estimateur sans biais pour le coefficient est beaucoup mieux (plus proche de la valeur réelle) avec ce modèle, mais le MSE devient pire que l'utilisation de l'estimateur biaisé.

Qu'est-ce qui se passe? Je m'attendais à ce qu'un estimateur biaisé produise de meilleurs résultats que celui biaisé.

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

Résultats:

MSE de l'estimateur biaisé:

ans =

  Columns 1 through 7

    1.2171    1.6513    1.9989    2.3914    2.5766    2.6712    2.5997

  Column 8

    2.8346

MSE de l'estimateur impartial:

ans =

  Columns 1 through 7

    1.2308    2.0001    2.9555    4.9727    7.6757   11.3106   14.4283

  Column 8

   11.5653

De plus, l'impression des valeurs de bet bFixed- je vois que bFixedc'est en effet plus proche des valeurs réelles 0.5,-10que de l'estimateur biaisé (comme prévu).

PS Les résultats de l'estimateur sans biais étant pire que l'estimateur biaisé sont statistiquement significatifs - le test pour celui-ci est omis du code, car il s'agit d'une simplification du code "version complète".

UPDTAE: j'ai ajouté un test qui vérifie et , et l'estimateur biaisé est en effet significativement pire (valeur plus grande) que celui sans biais selon cette métrique, même si le MSE de l'estimateur biaisé (sur le test) est significativement meilleur. Où est le coefficient réel de la variable dépendante, est l'estimateur biaisé pour et est l'estimateur sans biais pour . Σ pour chaque essai ( β ' - β ) 2 β = 0,5 β β β ' βfor each test(β^β)2for each test(ββ)2
β=0.5β^βββ

Cela, je crois, montre que la raison des résultats n'est PAS la variance plus élevée de l'estimateur sans biais, car il est encore plus proche de la valeur réelle.

Crédit: Utilisation des notes de cours de Steve Pischke comme ressource

amit
la source
Il serait utile que vous publiiez également les résultats, et pas seulement le code.
Alecos Papadopoulos
@AlecosPapadopoulos L'ajoute, n'ajoute pas l'impression de toutes les valeurs de bet bFixed, mais explique ce qu'elles montrent.
2015

Réponses:

2

Résumé: les paramètres corrigés sont pour la prédiction en fonction du vrai prédicteur . Si est utilisé dans la prédiction, les paramètres d'origine fonctionnent mieux.˜ xxx~

Notez qu'il existe deux modèles de prédiction linéaire différents qui se cachent. Premièrement, étant donné , second, étant donné , x y x = βyxy ~ x y ~ x = ~ β

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

Même si nous avions accès aux vrais paramètres, la prédiction linéaire optimale en fonction de serait différente de la prédiction linéaire optimale en fonction de . Le code dans la question fait ce qui suit˜ xxx~

  1. Estimez les paramètresβ~^,α~^
  2. Calculer les estimationsβ^,α^
  3. Comparer les performances de ety 2= ~ βy^1=β^x~+α^y^2=β~^x~+α~^

Comme à l'étape 3, nous prédisons en fonction de , et non en fonction de , l'utilisation de coefficients (estimés) du deuxième modèle fonctionne mieux. xx~x

En effet, si nous avions accès à , et mais pas , nous pourrions substituer un estimateur linéaire de dans le premier modèle, Si nous effectuons d'abord la forme de transformation en puis effectuons le calcul dans la dernière équation, nous récupérons les coefficientsβ ˜ x x x ^ ^ y x = βαβx~xx

yx^^=βx^(x~)+α=β(μx+(x^μx)σx2σx~2)+α=σx2σx~2β+αβ(1σx2σx~2)μx.
α~,β~α,βα~,β~. Donc, si le but est de faire une prédiction linéaire étant donné la version bruyante du prédicteur, nous devons simplement ajuster un modèle linéaire aux données bruyantes. Les coefficients corrigés sont intéressants si l'on s'intéresse au vrai phénomène pour d'autres raisons que la prédiction.α,β

Essai

J'ai édité le code dans OP pour également évaluer les MSE pour les prédictions en utilisant la version non bruyante de la prédiction (code à la fin de la réponse). Les résultats sont

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

Autrement dit, lorsque vous utilisez au lieu de , les paramètres corrigés battent en effet les paramètres non corrigés, comme prévu. De plus, la prédiction avec ( ), c'est-à-dire des paramètres fixes et un vrai prédicteur, est meilleure que ( ), qui est, paramètres reg et prédicteur bruyant, car évidemment le bruit nuit quelque peu à la précision de la prédiction. Les deux autres cas correspondent à l'utilisation des paramètres d'un mauvais modèle et produisent donc des résultats plus faibles.xx~α,β,xα~,β~,x~

Avertissement sur la non-linéarité

En fait, même si la relation entre est linéaire, la relation entre et pourrait ne pas l'être. Cela dépend de la distribution de . Par exemple, dans le code actuel, est tiré de la distribution uniforme, donc quelle que soit la hauteur de , nous connaissons une limite supérieure pour et donc le prévu en fonction de devrait saturer. Une solution possible de style bayésien serait de poser une distribution de probabilité pour puis de brancher lors de la dérivation dey,xyx~xxx~xyx~xE(xx~)y^^x- au lieu de la prédiction linéaire que j'ai utilisée précédemment. Cependant, si l'on est disposé à poser une distribution de probabilité pour , je suppose que l'on devrait opter pour une solution bayésienne complète au lieu d'une approche basée sur la correction des estimations OLS en premier lieu.x

Code MATLAB pour répliquer le résultat du test

Notez que cela contient également mes propres implémentations pour evaluer et OLS_solver car elles n'ont pas été fournies dans la question.

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
la source