easystats / easystats/performance
Alternative R2?
Nobody has claimed this yet.
- Dominant language
- R
- Stars
- 1.2k
- Forks
- 109
- Avg merge
- 6h 34m
- Merged PRs (30d)
- 8
Description
Problem
R2 is affected by the absence of an intercept:
data <- mtcars |>
within({
M = model.matrix(~1 + hp)
})
m1 <- lm(mpg ~ 1 + hp, data = data)
m2 <- lm(mpg ~ 0 + M, data = data) # same model?
Same parameters…
parameters::compare_parameters(m1, m2)
#> Warning in mapply(function(.d, .l) {: longer argument not a multiple of length
#> of shorter
#> Warning: Some model terms could not be found in model data.
#> You probably need to load the data into the environment.
#> Parameter | m1 | m2
#> ----------------------------------------------------------
#> (Intercept) | 30.10 (26.76, 33.44) |
#> hp | -0.07 (-0.09, -0.05) |
#> M(Intercept) | | 30.10 (26.76, 33.44)
#> Mhp | | -0.07 (-0.09, -0.05)
#> ----------------------------------------------------------
#> Observations | 32 | 32
Same dfs…
df.residual(m1)
#> [1] 30
df.residual(m2)
#> [1] 30
Same predictions…
all.equal(predict(m1), predict(m2))
#> [1] TRUE
But…
performance::r2(m1)
#> # R2 for Linear Regression
#> R2: 0.602
#> adj. R2: 0.589
performance::r2(m2)
#> # R2 for Linear Regression
#> R2: 0.968
#> adj. R2: 0.966
This isn’t an issue in performace, but R seems to give different values based on whether or not there is an intercept in the model
summary(m1)$r.squared
#> [1] 0.6024373
summary(m2)$r.squared
#> [1] 0.9681196
Created on 2022-10-14 by the reprex package (v2.0.1)
Solution
Perhaps we can add an r2_prediction which computes the R2 values based on the prediction?
Either as: $R^2 = r_{\hat{y},y}^2$
Or (my preferred method) as $R^2 = 1 - \frac{Var(y - \hat{y})}{Var(y)}$
This will allow for correct R2 for transformed outcomes (using smearing), for non-linear models, etc...
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing the existing performance::r2 entry point and how it handles intercept-free models. Compare the proposed prediction-based formulas with current R2 behavior for the supplied m1 and m2 examples, then define the expected result and tests for transformed outcomes and non-linear models.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- r
- Domain
- data
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100