Stimatore distorto per la regressione che ottiene risultati migliori di quello imparziale nel modello Error In Variables


13

Sto lavorando ad alcuni dati sintatici per il modello Error In Variable per alcune ricerche. Attualmente ho una singola variabile indipendente e presumo di conoscere la varianza per il valore reale della variabile dipendente.

Quindi, con queste informazioni, posso ottenere uno stimatore imparziale per il coefficiente della variabile dipendente.

Il modello:

y=0,5x-10+e2X~=X+e1
y=0.5X-10+e2
Dove: per alcuni e_2 \ text {~} N (0,1)
σ e 2 ~ N ( 0 , 1 )e1~N(0,σ2)σ
e2~N(0,1)

Dove i valori di y,x~ sono noti solo per ciascun campione, e anche la deviazione standard del valore reale di x per il campione è nota: σx .

Ottengo il coefficiente distorto ( β^ ) usando OLS, e quindi eseguendo le regolazioni usando:

β=β^σ^x~2σx2

Vedo che il mio nuovo stimatore imparziale per il coefficiente è molto meglio (più vicino al valore reale) con questo modello, ma l'MSE sta peggiorando rispetto all'utilizzo dello stimatore distorto.

Che cosa sta succedendo? Mi aspettavo che uno stimatore ub distorto producesse risultati migliori di quello distorto.

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

risultati:

MSE dello stimatore distorto:

ans =

  Columns 1 through 7

    1.2171    1.6513    1.9989    2.3914    2.5766    2.6712    2.5997

  Column 8

    2.8346

MSE dello stimatore non distorto:

ans =

  Columns 1 through 7

    1.2308    2.0001    2.9555    4.9727    7.6757   11.3106   14.4283

  Column 8

   11.5653

Inoltre, stampando i valori di be bFixed- vedo che bFixedè davvero più vicino ai valori reali di 0.5,-10rispetto allo stimatore distorto (come previsto).

PS I risultati dell'opinione imparziale peggiori dello stimatore distorto sono significativi dal punto di vista statistico: il test viene omesso dal codice, poiché si tratta di una semplificazione del codice "versione completa".

AGGIORNAMENTO: ho aggiunto un test che controlla e e lo stimatore distorto è effettivamente significativamente peggiore (valore maggiore) di quello imparziale secondo questa metrica, anche se l'MSE dello stimatore distorto (sul set di test) è significativamente migliore. Dove è il coefficiente reale della variabile dipendente, è lo stimatore distorto per e è lo stimatore imparziale per . Σ per ogni prova ( β ' - β ) 2 β = 0.5 β β β ' βfor each test(β^β)2for each test(ββ)2
β=0.5β^βββ

Questo credo che mostra che la ragione dei risultati NON è la maggiore varianza dello stimatore imparziale, poiché è ancora più vicino al valore reale.

Ringraziamento: utilizzo degli appunti di Steve Pischke come risorsa


Sarebbe utile se hai pubblicato anche i risultati e non solo il codice.
Alecos Papadopoulos,

@AlecosPapadopoulos L'ha aggiunto, non ha aggiunto la stampa di tutti i valori di be bFixed, ma ha spiegato cosa mostrano.
Amit

Risposte:


2

Riepilogo: i parametri corretti sono per la previsione in funzione del vero predittore . Se viene utilizzato nella previsione, i parametri originali funzionano meglio.˜ xxx~

Si noti che ci sono due diversi modelli di previsione lineare in agguato. In primo luogo, dato , secondo, dato , x y x = βyxy ~ x y ~ x = ~ β

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

Anche se avessimo accesso ai parametri reali, la previsione lineare ottimale in funzione di sarebbe diversa dalla previsione lineare ottimale in funzione di . Il codice nella domanda fa quanto segue˜ xXx~

  1. Stimare i parametriβ~^,α~^
  2. Calcola le stimeβ^,α^
  3. Confronta le prestazioni di ey 2= ~ βy^1=β^x~+α^y^2=β~^x~+α~^

Dato che nel passaggio 3 stiamo prevedendo come una funzione di , non come una funzione di , l'utilizzo dei coefficienti (stimati) del secondo modello funziona meglio. xx~x

In effetti, se avessimo accesso a , e ma non , potremmo sostituire uno stimatore lineare di nel primo modello, Se eseguiamo prima la forma di trasformazione in e quindi eseguiamo il calcolo nell'ultima equazione, recuperiamo i coefficientiβ ˜ x x x ^ ^ y x = βαβx~xx

yx^^=βx^(x~)+α=β(μx+(x^μx)σx2σx~2)+α=σx2σx~2β+αβ(1σx2σx~2)μx.
α~,β~α,βα~,β~. Quindi, se l'obiettivo è fare una previsione lineare data la versione rumorosa del predittore, dovremmo semplicemente adattare un modello lineare ai dati rumorosi. I coefficienti corretti sono interessanti se siamo interessati al vero fenomeno per ragioni diverse dalla previsione.α,β

analisi

Ho modificato il codice in OP per valutare anche gli MSE per le previsioni usando la versione non rumorosa della previsione (codice alla fine della risposta). I risultati sono

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

Cioè, quando si utilizza anziché , i parametri corretti in effetti battono i parametri non corretti, come previsto. Inoltre, la previsione con ( ), ovvero parametri fissi e predittore vero, è migliore di ( ), che è, i parametri reg e il predittore rumoroso, poiché ovviamente il rumore danneggia un po 'la precisione della previsione. Gli altri due casi corrispondono all'utilizzo dei parametri di un modello sbagliato e quindi producono risultati più deboli.xx~α,β,xα~,β~,x~

Avvertenza sulla non linearità

In realtà, anche se la relazione tra è lineare, la relazione tra e potrebbe non esserlo. Questo dipende dalla distribuzione di . Ad esempio, nel presente codice, è tratto dalla distribuzione uniforme, quindi non importa quanto sia alto , conosciamo un limite superiore per e quindi la prevista in funzione di dovrebbe saturare. Una possibile soluzione in stile bayesiano sarebbe quella di posizionare una distribuzione di probabilità per e quindi collegare quando si ricavay,xyx~xxx~xyx~xE(xx~)y^^x- Invece della previsione lineare che ho usato in precedenza. Tuttavia, se si è disposti a sostenere una distribuzione di probabilità per , suppongo che si dovrebbe optare per una soluzione bayesiana completa invece di un approccio basato sulla correzione delle stime OLS in primo luogo.x

Codice MATLAB per la replica del risultato del test

Si noti che questo contiene anche le mie implementazioni per assess e OLS_solver poiché non sono state fornite nella domanda.

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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.