P-значение прогнозируемых данных в пошаговой линейной регрессии Matlab

Я использую Matlab's stepwiselm чтобы найти соответствие моим тренировочным данным. Модель результата имеет "общее значение p" f-статистики, которую показывает Matlab. Теперь я хочу использовать эту модель в тестовом наборе данных и рассчитать ее значение p, чтобы определить, насколько значим прогноз.

Matlab имеет 3 команды для оценки модели по новым данным ( ссылка). Но ни одна из этих команд автоматически не сообщает значение p-статистики. С помощью predict и модель из stepwiselm например, возвращает предсказанный ответ. Теперь вопрос в том, как я могу найти p-значение из прогнозируемых значений тестового набора и их истинных значений.

Благодарю.

1 ответ

Решение

Я не видел встроенной функции класса LinearModel, которая оценивает объясненную дисперсию экстраполированных данных (что кажется странным).

F-статистика сравнивает остаточные ошибки полной модели (созданной stepwiselm) к остаточным ошибкам уменьшенной модели (y_hat = mean(y)). Этот расчет хорошо описан здесь.

Сумма в квадрате ошибок (SSE)

Определите SSE для полной модели и уменьшенной модели

[Ypred] = predict(mdl,Xnew);

SSE_F = sum((Ynew - Ypred).^2); % full model SSE
SSE_R = sum((Ynew - mean(Ynew)).^2); % reduced model SSE

Степени свободы (df)

Я не уверен, но я думаю df будет определяться данными обучения, а не данными испытаний. Я бы перепроверил с Cross Validated, если вы не уверены.

% Change Xold,Xold to XNew,YNew if df is determined  by test-data
mdl_F = stepwiselm(Xold,Yold,...); % same parameters as original mdl
mdl_R = stepwiselm(Xold,Yold,'constant');

df_F = mdl_F.DFE; % n - p
df_R = mdl_R.DFE; % n - 1

F* Статистика

Теперь мы можем сравнить полную модель и уменьшенную модель

MSR = (SSE_R - SSE_F) / (df_R - df_F);
MSE = SSE_ F/df_F;

F = MSR/MSE;

Значение P

Теперь, когда у нас есть F* статистика, мы сравним это с F распределение для определения P-значения.
здесь

df_num = mdl_F.NumPredictors; % p - 1 + 1 (matlab doesn't include intercept as a predictor)
df_den = mdl_F.DFE; % n - p

F* к F здесь

p_val = fcdf(F,df_num,df_den);
Другие вопросы по тегам