我使用Matlab的stepwiselm
找到适合我的训练数据。结果模型具有"总p值" Matlab展示的f统计数据。现在,我想在测试数据集上使用此模型并计算其p值,以确定预测的重要程度。
Matlab有3个命令来评估新数据(link)上的模型。但是这些命令都不会自动报告f统计p值。例如,使用predict
和stepwiselm
中的模型返回预测的响应。现在的问题是我如何从测试集的预测值及其真实值中找到p值。
感谢。
答案 0 :(得分:1)
我还没有看到内置的LinearModel class函数来评估外推数据的解释方差(看起来很奇怪)。
F统计量比较完整模型(由stepwiselm
创建)与简化模型(y_hat = mean(y)
)的残差的残差。这个计算很好described here。
确定完整模型和简化模型的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
将取决于训练数据,而不是测试数据。如果您不确定,我会仔细检查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
现在我们可以比较完整模型和简化模型
MSR = (SSE_R - SSE_F) / (df_R - df_F);
MSE = SSE_ F/df_F;
F = MSR/MSE;
现在我们有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
p_val = fcdf(F,df_num,df_den);