lm() 中的 R 平方,用于零截距模型

Posted

技术标签:

【中文标题】lm() 中的 R 平方,用于零截距模型【英文标题】:R-squared in lm() for zero-intercept model 【发布时间】:2019-12-16 08:29:12 【问题描述】:

我在 R 中运行 lm(),这是摘要的结果:

Multiple R-squared:  0.8918,    Adjusted R-squared:  0.8917 
F-statistic:  9416 on 9 and 10283 DF,  p-value: < 2.2e-16

它似乎是一个很好的模型,但如果我手动计算 R^2,我会得到这个:

model=lm(S~0+C+HA+L1+L2,data=train)
pred=predict(model,train)
rss <- sum((model$fitted.values - train$S) ^ 2)
tss <- sum((train$S - mean(train$S)) ^ 2)
1 - rss/tss
##[1] 0.247238
rSquared(train$S,(train$S-model$fitted.values))
##          [,1]
## [1,] 0.247238

怎么了?

str(train[,c('S','Campionato','HA','L1','L2')])
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   10292 obs. of  5 variables:
 $ S         : num  19 18 9 12 12 8 21 24 9 8 ...
 $ C         : Factor w/ 6 levels "D","E","F","I",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ HA        : Factor w/ 2 levels "A","H": 1 2 1 1 2 1 2 2 1 2 ...
 $ L1        : num  0.99 1.41 1.46 1.43 1.12 1.08 1.4 1.45 0.85 1.44 ...
 $ L2        : num  1.31 0.63 1.16 1.15 1.29 1.31 0.7 0.65 1.35 0.59 ...

【问题讨论】:

欢迎来到 SO!在train中提供你输入数据的例子,另外,你的“手动R2计算公式”是从哪里得到的? 你为什么要运行模型而不拦截?请参阅@jludewig 答案 我使用了第三个答案***.com/questions/40901445/… 因为截距我在摘要中获得了 0.24752 的 R2(lm()) 0.24752 是您手动计算的 R2 值。 【参考方案1】:

您正在运行一个没有截距的模型(公式右侧的 ~0)。对于这些类型的模型,R^2 的计算是有问题的,并且会产生误导性的值。这个帖子解释的很好:https://stats.stackexchange.com/a/26205/99681

【讨论】:

还有 stats.idre.ucla.edu/other/mult-pkg/faq/general/… 和 cran.r-project.org/doc/FAQ/… 。我不一定将此归咎于 R:零截距模型中的 R^2必然有问题(即,有不同的坏解决方案,但没有好的解决方案) @BenBolker 好点。我编辑了我的答案以更好地反映这一点 关键是 R 平方是基于将模型与最小子模型进行比较。在模型具有截距的情况下,要与之比较的逻辑子模型是仅包含截距的模型,即 R 模型符号中的 y ~ 1;但是,如果模型没有截距,那么它就不再是子模型,并且要使用的逻辑子模型是 y ~ 0。这就是为什么 R 平方需要不同的公式。

以上是关于lm() 中的 R 平方,用于零截距模型的主要内容,如果未能解决你的问题,请参考以下文章

在线性模型中用 R 提取 R 平方值

怎样用SPSS做一元线性回归?具体怎么检验相关性

线性回归中的截距

如何使用R中的createFolds函数处理lm.fit(0个非na情况)中的错误

spss回归分析结果图,帮忙看一下,麻烦详细地解释解释

用微表格能做回归分析?