Matlab逐步线性回归中预测数据的P值

时间:2018-01-09 02:04:45

标签: matlab linear-regression p-value

我使用Matlab的stepwiselm找到适合我的训练数据。结果模型具有"总p值" Matlab展示的f统计数据。现在,我想在测试数据集上使用此模型并计算其p值,以确定预测的重要程度。

Matlab有3个命令来评估新数据(link)上的模型。但是这些命令都不会自动报告f统计p值。例如,使用predictstepwiselm中的模型返回预测的响应。现在的问题是我如何从测试集的预测值及其真实值中找到p值。

感谢。

1 个答案:

答案 0 :(得分:1)

我还没有看到内置的LinearModel class函数来评估外推数据的解释方差(看起来很奇怪)。

F统计量比较完整模型(由stepwiselm创建)与简化模型(y_hat = mean(y))的残差的残差。这个计算很好described here

求和误差(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 here

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

F* to F here

p_val = fcdf(F,df_num,df_den);