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
p_val = fcdf(F,df_num,df_den);