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

问题描述 投票:2回答:1

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

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

谢谢。

matlab linear-regression p-value
1个回答
1
投票

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

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

Sum-squared errors (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

Degrees of Freedom (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* Statistic

现在我们可以比较全模型和简化模型

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

F = MSR/MSE;

P Value

现在我们有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);
© www.soinside.com 2019 - 2024. All rights reserved.