R语言lm()拟合相同线性模型得到不一致R平方值的原因咨询
R语言lm()函数相同模型不同写法R²、F统计量差异原因
这是R语言的正常设计,不是Bug,差异来自R平方、F统计量的计算规则会根据模型公式是否显式声明无截距自动切换,具体逻辑如下:
1. R平方的两种计算规则
summary.lm()计算R平方时会自动判断模型公式是否包含~0/~-1(无截距声明),采用不同计算逻辑:
- 带截距模型(你的代码
m1 <- lm(stack.loss ~ ., data = stackloss)属于这类,R默认公式加截距):
R平方公式为 $R^2 = \frac{\sum(\hat{y}-\bar{y})2}{\sum(y-\bar{y})2}$,衡量的是模型对y围绕样本均值的变异的解释比例,是我们常规认知里的R平方。 - 显式声明无截距的模型(你的代码
m2 <- lm(y ~ 0 + X)属于这类):
R会默认你要拟合过原点的模型,R平方公式切换为 $R^2 = \frac{\sum \hat{y}^2}{\sum y^2}$,衡量的是模型对y的原始平方和的解释比例,和带截距模型的R平方没有可比性。
2. 你的场景的特殊性
你在m2的公式里声明了无截距,但传入的X = model.matrix(m1)本身已经包含了截距列,所以m2本质上和m1拟合的是完全相同的模型,系数、残差、残差标准误差自然完全一致。但R因为检测到公式里的~0声明,依然用无截距规则计算R平方和F统计量,才会出现数值差异。
3. F统计量差异的原因
两个模型的F检验原假设不同:
m1的F检验原假设为除截距外所有自变量系数为0,分子自由度为3(对应3个预测变量),所以输出F统计量自由度为3和17m2的F检验原假设为传入的X矩阵所有列的系数都为0(包括截距列在内共4个系数),分子自由度为4,所以输出F统计量自由度为4和17,数值和p值都和m1不同。
解决方案
如果要让m2输出和m1一致的统计量,把公式改为lm(y ~ X)即可,R会自动识别X中的截距列,放弃默认生成的截距,同时采用带截距模型的统计量计算规则。
内容的提问来源于stack exchange,提问作者jochen
相关产品推荐
相关产品推荐

