zakrapovic
zakrapovic

Reputation: 433

How to manually calculate the residuals of linear model in R

I am trying to calculate manually the r-squared given by lm() in R

Considering:

fit <- lm(obs_values ~ preds_values, df) with sd(df$obs_values) == sd(df$preds_values) and mean(df$obs_values) == mean(df$preds_values)

To do so I can extract the residuals by doing res_a = residuals(fit) and then inject them in the formula as :

y = sum( (df$obs_values - mean(df$obs_values))^2 ) r-squared = 1 - sum(res_a^2)/y

Here I get the expected r-squared

Now, I would like to get the residual manually.
It should be as trivial as : res_b = df$obs_values - df$predss_values, but for some reason, res_b is different than res_a...

Upvotes: 0

Views: 7377

Answers (2)

nghauran
nghauran

Reputation: 6778

You have many options:

## Residuals manually
# option 1
beta_hat <- coef(fit)
obs_values_hat <- beta_hat["(Intercept)"] + beta_hat["preds_values"] * preds_values
u_hat <- obs_values - obs_values_hat # residuals
# option 2
obs_values_hat <- fitted(fit)
u_hat <- obs_values - obs_values_hat # residuals
# (option 3 - not manually) or just u_hat <- resid(fit) 

## R-squared manually
# option 1
var(obs_values_hat) / var(obs_values)
# option 2
1 - var(u_hat) / var(obs_values)
# option 3
cor(obs_values, obs_values_hat)^2

Upvotes: 0

Zheyuan Li
Zheyuan Li

Reputation: 73405

You can't just do y - x in a regression y ~ x to get residuals. Where have regression coefficients gone?

fit <- lm(y ~ x)
b <- coef(fit)
resi <- y - (b[1] + b[2] * x)

Upvotes: 1

Related Questions