Об'єктивний оцінювач регресії для досягнення кращих результатів, ніж неупереджений у Моді помилок змінних


13

Я працюю над деякими синтатичними даними для моделі Error In Variable для деяких досліджень. В даний час у мене є одна незалежна змінна, і я припускаю, що знаю дисперсію для справжнього значення залежної змінної.

Отже, за допомогою цієї інформації я можу досягти неупередженого оцінки коефіцієнта залежної змінної.

Модель:

y=0,5x-10+e2x~=x+e1
y=0.5x10+e2
Де: для деяких
σ e 2 ~ N ( 0 , 1 )e1~N(0,σ2)σ
e2~N(0,1)

Там, де значення відомі лише для кожного зразка, а також відоме стандартне відхилення реального значення для вибірки: . x σ xy,x~xσx

Я отримую упереджений ( ) коефіцієнт за допомогою OLS, а потім вношу коригування, використовуючи:β^

β=β^σ^x~2σx2

Я бачу, що мій новий, неупереджений оцінювач коефіцієнта набагато кращий (ближче до реального значення) з цією моделлю, але MSE стає гіршим, ніж використання упередженого оцінювача.

Що відбувається? Я очікував, що неупереджений оцінювач дасть кращі результати, ніж упереджений.

Код 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ніж упереджений оцінювач (як очікувалося).

PS Результати неупередженості, які є гіршими, ніж упереджений оцінювач, є статистично значущими - тест на нього пропущено з коду, оскільки це спрощення коду "повної версії".

UPDTAE: Я додав тест, який перевіряє та , і зміщений оцінювач дійсно значно гірший (більше значення), ніж неупереджений відповідно до цієї метрики, навіть якщо MSE упередженого оцінювача (на тестовому наборі) значно кращий. Де - реальний коефіцієнт залежної змінної, є упередженим оцінником для , а - неупереджений оцінювач для . Σ для кожного тесту ( β ' - β ) 2for each test(β^β)2for each test(ββ)2
& beta ; & beta ; & beta ; ' & beta ;β=0.5β^βββ

Це, на мій погляд, показує, що причиною результатів НЕ є вища дисперсія неупередженого оцінювача, оскільки вона все ще наближається до реальної величини.

Кредит: Використання лекцій Стіва Пішке як ресурсу


Було б корисно, якщо ви опублікували також результати, а не лише код.
Алекос Пападопулос

@AlecosPapadopoulos Додав це, не додав до друку всіх значень bта bFixed, але пояснив, що вони показують.
Amit

Відповіді:


2

Короткий зміст: виправлені параметри призначені для прогнозування як функції справжнього предиктора . Якщо використовується для прогнозування, вихідні параметри працюють краще.xx~

Зауважте, що існують дві різні моделі лінійного прогнозування. По-перше, задано , секунда, дано , yx

y^x=βx+α,
yx~
y^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.
α~,β~α,βα~,β~. Отже, якщо мета полягає в тому, щоб зробити лінійне передбачення з огляду на шумну версію прогноктора, нам слід просто підлаштувати лінійну модель до галасливих даних. Коригувані коефіцієнти цікавлять, якщо нас цікавить справжнє явище з інших причин, ніж прогнозування.α,β

Тестування

Я відредагував код в ОП, щоб також оцінити 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~

Застереження про нелінійність

Насправді, навіть якщо відношення між є лінійним, співвідношення між та може не бути. Це залежить від розподілу . Наприклад, у цьому коді виводиться з рівномірного розподілу, тому незалежно від того, наскільки високий , ми знаємо верхню межу для і, отже, передбачуване як функція повинно наситити. Можливим рішенням байєсівського стилю було б встановити розподіл ймовірності для а потім підключити при виведенніу ~ х х х ~ х х у ~ х х Е ( х | ~ х ) уy,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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.