我想使用F统计数据比较两个模型的性能。这是一个可重复的例子和预期的结果:
load carbig
tbl = table(Acceleration,Cylinders,Horsepower,MPG);
% Testing separetly both models
mdl1 = fitlm(tbl,'MPG~1+Acceleration+Cylinders+Horsepower');
mdl2 = fitlm(tbl,'MPG~1+Acceleration');
% Comparing both models using the F-test and p-value
numerator = (mdl2.SSE-mdl1.SSE)/(mdl1.NumCoefficients-mdl2.NumCoefficients);
denominator = mdl1.SSE/mdl1.DFE;
F = numerator/denominator;
p = 1-fcdf(F,mdl1.NumCoefficients-mdl2.NumCoefficients,mdl1.DFE);
我们最终得到F = 298.75
和p = 0
,表明mdl1明显优于mdl2,正如F统计数据所评估的那样。
无论如何获得F和p值而不执行两次fitlm并进行所有计算?
我按照@Glen_b的建议尝试运行coefTest,但是功能记录不清,结果不是我期望的结果。
[p,F] = coefTest(mdl1); % p = 0, F = 262.508 (this F test mdl1 vs constant mdl)
[p,F] = coefTest(mdl1,[0,0,1,1]); % p = 0, F = 57.662 (not sure what this is testing)
[p,F] = coefTest(mdl1,[1,1,0,0]); % p = 0, F = 486.810 (idem)
我相信我应该使用函数[p,F] = coeffTest(mdl1,H,C)
使用不同的零假设(C)进行测试。但我真的不知道怎么做,也没有例子。
答案 0 :(得分:1)
这个答案是关于比较两个线性回归模型,其中一个模型是另一个模型的限制版本。
对估计的系数向量b
的第3和第4个元素为零的限制进行F检验:
[p, F] = coefTest(mdl1, [0, 0, 1, 0; 0, 0, 0, 1]);
让b
成为我们的估计向量。 b
的线性限制通常以矩阵形式编写:R*b = r
。 b
的第3和第4个元素为零的限制将被写为:
[0, 0, 1, 0 * b = [0
0, 0, 0, 1] 0];
矩阵[0, 0, 1, 0; 0, 0, 0, 1]
是coefTest在文档中调用H
矩阵的内容。
P = coefTest(M,H), with H a numeric matrix having one column for each
coefficient, performs an F test that H*B=0, where B represents the
coefficient vector.
有时候,通过这种计量经济学的惯例,只需自己写出来就可以了解它真正发生的事情。
删除带有NaN的行,因为它们只是添加了不相关的复杂性:
tbl_dirty = table(Acceleration,Cylinders,Horsepower,MPG);
tbl = tbl_dirty(~any(ismissing(tbl_dirty),2),:);
做估算等......
n = height(tbl); % number of observations
y = tbl.MPG;
X = [ones(n, 1), tbl.Acceleration, tbl.Cylinders, tbl.Horsepower];
k = size(X,2); % number of variables (including constant)
b = X \ y; % estimate b with least squares
u = y - X * b; % calculates residuals
s2 = u' * u / (n - k); % estimate variance of error term (assuming homoskedasticity, independent observations)
BCOV = inv(X'*X) * s2; % get covariance matrix of b assuming homoskedasticity of error term etc...
bse = diag(BCOV).^.5; % standard errors
R = [0, 0, 1, 0;
0, 0, 0, 1];
r = [0; 0]; % Testing restriction: R * b = r
num_restrictions = size(R, 1);
F = (R*b - r)'*inv(R * BCOV * R')*(R*b - r) / num_restrictions; % F-stat (see Hiyashi for reference)
Fp = 1 - fcdf(F, num_restrictions, n - k); % F p-val
供参考,请看p。 Hiyashi的65本书计量经济学。
答案 1 :(得分:0)
不,没有。
Fitlm适合任意模型。在您的情况下,回归模型具有拦截和一个或三个回归量。看起来具有三个回归量的模型可以使用来自模型的信息和一个回归量,但这仅在模型存在某些限制时才会出现,即使这种重叠信息有限。 Fitlm是一个非常通用的框架,可用于任意模型。因此,在共享信息的同时进行多次回归可能会非常复杂并且无法实现。 可以自己为这两个特定模型实现这一点。通常使用协方差矩阵来解决这种线性回归:
Beta = (X' X) ^-1 X' y
是X是变量为列的数据,y是目标变量。在这种情况下,您可以重用协方差矩阵的一部分,您只需要较小回归中的列:加速度的变化。由于添加2个新变量会在协方差矩阵中添加8个值,因此只能节省1/9的时间。此外,最重的部分是反转。因此,时间的改善非常少。
简而言之,只需做两次单独的回归