Skip to the content.

Multiple Regression

Dieter 2022-08-26

Data used

Read in some data

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0      ✔ purrr   1.0.2 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.3      ✔ forcats 0.5.2 
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
body_data <-read_csv('data/body.csv')
## Rows: 507 Columns: 25
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (25): Biacromial, Biiliac, Bitrochanteric, ChestDepth, ChestDia, ElbowDi...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Revisit the simple linear model

This is q quick recap of the simple linear regression model.

model <- lm(Weight ~ Waist, data=body_data)
summary(model)
## 
## Call:
## lm(formula = Weight ~ Waist, data = body_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -16.3211  -3.5995  -0.0936   3.6932  19.0536 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -15.18382    1.79291  -8.469 2.72e-16 ***
## Waist         1.09550    0.02306  47.514  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.712 on 505 degrees of freedom
## Multiple R-squared:  0.8172, Adjusted R-squared:  0.8168 
## F-statistic:  2258 on 1 and 505 DF,  p-value: < 2.2e-16

The anova table shows more details about the components calculating the F-value

anova(model)
## Analysis of Variance Table
## 
## Response: Weight
##            Df Sum Sq Mean Sq F value    Pr(>F)    
## Waist       1  73649   73649  2257.6 < 2.2e-16 ***
## Residuals 505  16475      33                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Manual calculation of the F value

As we mentioned before, R automatically calculates the F-value. But we can also do this manually. You an inspect this code if you want to understand the calculation of the F value in more detail.

predicted <- predict(model)
mn_predicted <-mean(predicted)
resids <- model$residuals


captured_variance <- sum((predicted - mn_predicted)^2)
uncaptured_variance <- sum((resids)^2)

n_predictors <- 1
manual_f <- (captured_variance / n_predictors)/ (uncaptured_variance/ model$df.residual)
captured_variance
## [1] 73648.74
uncaptured_variance
## [1] 16474.61
manual_f
## [1] 2257.572

Intro to the multiple linear regression

A first example

Here I use data provided by Vik 2013 (Table 9.2 in Vik, Peter. Regression, ANOVA, and the General Linear Model, 2013.). This allows double checking the calculating provided in this book.

vik_data <-read_csv('data/vik_table_9_2.csv')
## Rows: 12 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (4): Person, Y, X1, X2
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(vik_data)
## # A tibble: 6 × 4
##   Person     Y    X1    X2
##    <dbl> <dbl> <dbl> <dbl>
## 1      1     2     8     1
## 2      2     3     9     2
## 3      3     3     9     2
## 4      4     4    10     3
## 5      5     7     6     8
## 6      6     5     7     9
model <- lm(Y ~ X1 + X2, data=vik_data)
summary(model)
## 
## Call:
## lm(formula = Y ~ X1 + X2, data = vik_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.45564 -0.24631  0.03248  0.54747  1.52060 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   9.2014     1.5185   6.060 0.000188 ***
## X1           -0.7085     0.1481  -4.783 0.000997 ***
## X2            0.1209     0.1486   0.813 0.436963    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.271 on 9 degrees of freedom
## Multiple R-squared:  0.8182, Adjusted R-squared:  0.7777 
## F-statistic: 20.25 on 2 and 9 DF,  p-value: 0.0004663

Manual calculation of the F value

Just as before, we can calculate the F value manually to get a better understanding of the calculation of F.

predicted <- predict(model)
mn_predicted <-mean(predicted)
resids <- model$residuals

captured_variance <- sum((predicted - mn_predicted)^2)
uncaptured_variance <- sum((resids)^2)

n_predictors <- 2
manual_F <- (captured_variance / n_predictors)/ (uncaptured_variance/ model$df.residual)
captured_variance
## [1] 65.45267
uncaptured_variance
## [1] 14.54733
manual_f
## [1] 2257.572

Visualizing the fitted model

# library(plotly)
# library(pracma)
# coeffs <- model$coefficient
# xi <- seq(min(vik_data$X1), max(vik_data$X1), length.out=100)
# yi <- seq(min(vik_data$X2), max(vik_data$X2), length.out=100)
# grid <- meshgrid(xi,yi)
# xi <- grid[[1]]
# yi <- grid[[2]]
# 
# 
# zi <- coeffs[1] + coeffs[2] * xi + coeffs[3] * yi
# 
# my_plot <- plot_ly(vik_data, x = ~X1,  y = ~X2, z = ~Y, type = "scatter3d", mode = "markers")
# my_plot <- add_trace(p = my_plot, z = zi, x = xi, y = yi, type = "surface")
# my_plot

Manually running the omnibus test

I fit the full model and the base model (which is usually only done implicitly). We fit the following two models:

\[y_i = \bar{y}\] \[y_i = \beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i}\]

Next, we explicitly compare their performances using the anova function. This results in the same F-value as the one calculated by R when fitting the full model.

vik_data$mean_y <- mean(vik_data$Y)


model_base <- lm(Y ~ mean_y, data=vik_data)
model_full <- lm(Y ~ X1 + X2, data=vik_data)

Let’s look at the full model’s F value.

summary(model_full)
## 
## Call:
## lm(formula = Y ~ X1 + X2, data = vik_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.45564 -0.24631  0.03248  0.54747  1.52060 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   9.2014     1.5185   6.060 0.000188 ***
## X1           -0.7085     0.1481  -4.783 0.000997 ***
## X2            0.1209     0.1486   0.813 0.436963    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.271 on 9 degrees of freedom
## Multiple R-squared:  0.8182, Adjusted R-squared:  0.7777 
## F-statistic: 20.25 on 2 and 9 DF,  p-value: 0.0004663

Let’s now explicitly compare the base and the full model. This results in the same F-value! So, we could run the omnibus test by comparing the base model, $y_i = \bar{x}$, with the full model. But this is done implicitly by R when fitting the full model.

anova(model_base, model_full)
## Analysis of Variance Table
## 
## Model 1: Y ~ mean_y
## Model 2: Y ~ X1 + X2
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1     11 80.000                                  
## 2      9 14.547  2    65.453 20.247 0.0004663 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Manually calculating the F ratio for the omnibus test

full_model_predictions <- predict(model_full)
mean_full_model_predictions <-mean(full_model_predictions)

base_model_predictions <- predict(model_base)

captured_variance <- sum((full_model_predictions - mean_full_model_predictions)^2) 
uncaptured_variance <- sum((base_model_predictions- vik_data$Y)^2) 
test <- sum((model_full$residuals)^2) 
test
## [1] 14.54733
captured_variance
## [1] 65.45267
uncaptured_variance
## [1] 80
manual_f <- captured_variance/uncaptured_variance
manual_f
## [1] 0.8181584

Model comparison

Here, we fit two nested models and compare their peformance using the anova function.

A simple and a complex model

state_data <- as.data.frame(state.x77)
colnames(state_data) <- make.names(colnames(state_data))
head(state_data)
##            Population Income Illiteracy Life.Exp Murder HS.Grad Frost   Area
## Alabama          3615   3624        2.1    69.05   15.1    41.3    20  50708
## Alaska            365   6315        1.5    69.31   11.3    66.7   152 566432
## Arizona          2212   4530        1.8    70.55    7.8    58.1    15 113417
## Arkansas         2110   3378        1.9    70.66   10.1    39.9    65  51945
## California      21198   5114        1.1    71.71   10.3    62.6    20 156361
## Colorado         2541   4884        0.7    72.06    6.8    63.9   166 103766

Let’s fit two (nested) models,

simple_model <- lm(state_data$Murder ~ state_data$Illiteracy)
complex_model <- lm(state_data$Murder ~ state_data$Illiteracy + state_data$Income + state_data$Population)

Let’s look at their summaries:

summary(simple_model)
## 
## Call:
## lm(formula = state_data$Murder ~ state_data$Illiteracy)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.5315 -2.0602 -0.2503  1.6916  6.9745 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             2.3968     0.8184   2.928   0.0052 ** 
## state_data$Illiteracy   4.2575     0.6217   6.848 1.26e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.653 on 48 degrees of freedom
## Multiple R-squared:  0.4942, Adjusted R-squared:  0.4836 
## F-statistic: 46.89 on 1 and 48 DF,  p-value: 1.258e-08
summary(complex_model)
## 
## Call:
## lm(formula = state_data$Murder ~ state_data$Illiteracy + state_data$Income + 
##     state_data$Population)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.7846 -1.6768 -0.0839  1.4783  7.6417 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           1.3402721  3.3694210   0.398   0.6926    
## state_data$Illiteracy 4.1109188  0.6706786   6.129 1.85e-07 ***
## state_data$Income     0.0000644  0.0006762   0.095   0.9245    
## state_data$Population 0.0002219  0.0000842   2.635   0.0114 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.507 on 46 degrees of freedom
## Multiple R-squared:  0.5669, Adjusted R-squared:  0.5387 
## F-statistic: 20.07 on 3 and 46 DF,  p-value: 1.84e-08
anova(simple_model, complex_model)
## Analysis of Variance Table
## 
## Model 1: state_data$Murder ~ state_data$Illiteracy
## Model 2: state_data$Murder ~ state_data$Illiteracy + state_data$Income + 
##     state_data$Population
##   Res.Df    RSS Df Sum of Sq      F  Pr(>F)  
## 1     48 337.76                              
## 2     46 289.19  2    48.574 3.8633 0.02812 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

What if the models only differ by one variable

In this case, the p-value associated with the newly introduced variable is equal to the p value of the anova comparison. In fact the $F$ value is equal to $t^2$ value.

simple_model <- lm(state_data$Murder ~ state_data$Illiteracy)
complex_model <- lm(state_data$Murder ~ state_data$Illiteracy + state_data$Income)
summary(complex_model)
## 
## Call:
## lm(formula = state_data$Murder ~ state_data$Illiteracy + state_data$Income)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.6343 -1.9289 -0.0171  1.6779  6.7349 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           -0.4409926  3.5034602  -0.126    0.900    
## state_data$Illiteracy  4.5099882  0.6934465   6.504 4.63e-08 ***
## state_data$Income      0.0005731  0.0006879   0.833    0.409    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.661 on 47 degrees of freedom
## Multiple R-squared:  0.5015, Adjusted R-squared:  0.4803 
## F-statistic: 23.64 on 2 and 47 DF,  p-value: 7.841e-08
anova(simple_model, complex_model)
## Analysis of Variance Table
## 
## Model 1: state_data$Murder ~ state_data$Illiteracy
## Model 2: state_data$Murder ~ state_data$Illiteracy + state_data$Income
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1     48 337.76                           
## 2     47 332.85  1    4.9163 0.6942 0.4089

Interactions

Model without interaction

library(gapminder)
gap <- gapminder
model <- lm(lifeExp ~ gdpPercap + year, data = gap)
summary(model)
## 
## Call:
## lm(formula = lifeExp ~ gdpPercap + year, data = gap)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -67.262  -6.954   1.219   7.759  19.553 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -4.184e+02  2.762e+01  -15.15   <2e-16 ***
## gdpPercap    6.697e-04  2.447e-05   27.37   <2e-16 ***
## year         2.390e-01  1.397e-02   17.11   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.694 on 1701 degrees of freedom
## Multiple R-squared:  0.4375, Adjusted R-squared:  0.4368 
## F-statistic: 661.4 on 2 and 1701 DF,  p-value: < 2.2e-16

Model with interaction

model <- lm(lifeExp ~ gdpPercap * year, data = gap)
summary(model)
## 
## Call:
## lm(formula = lifeExp ~ gdpPercap * year, data = gap)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -54.234  -7.314   1.002   7.951  19.780 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -3.532e+02  3.267e+01 -10.811  < 2e-16 ***
## gdpPercap      -8.754e-03  2.547e-03  -3.437 0.000602 ***
## year            2.060e-01  1.653e-02  12.463  < 2e-16 ***
## gdpPercap:year  4.754e-06  1.285e-06   3.700 0.000222 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.658 on 1700 degrees of freedom
## Multiple R-squared:  0.442,  Adjusted R-squared:  0.441 
## F-statistic: 448.8 on 3 and 1700 DF,  p-value: < 2.2e-16

This gives the same result:

gap$multi <- gap$gdpPercap * gap$year
model <- lm(lifeExp ~ gdpPercap + year + multi, data = gap)
summary(model)
## 
## Call:
## lm(formula = lifeExp ~ gdpPercap + year + multi, data = gap)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -54.234  -7.314   1.002   7.951  19.780 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -3.532e+02  3.267e+01 -10.811  < 2e-16 ***
## gdpPercap   -8.754e-03  2.547e-03  -3.437 0.000602 ***
## year         2.060e-01  1.653e-02  12.463  < 2e-16 ***
## multi        4.754e-06  1.285e-06   3.700 0.000222 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.658 on 1700 degrees of freedom
## Multiple R-squared:  0.442,  Adjusted R-squared:  0.441 
## F-statistic: 448.8 on 3 and 1700 DF,  p-value: < 2.2e-16
range(gap$gdpPercap)
## [1]    241.1659 113523.1329
range(gap$year)
## [1] 1952 2007

See this link for a plot of the model: https://www.wolframalpha.com/input?i=plot+-3.532e%2B02+%2B+x+*+-8.754e-03+%2B+y+*+2.060e-01+%2B+4.754e-06+*+%28x+*+y%29+with+x++%3D+241+to+113523+and+y+%3D+1952+to+2007

Using zeroed data

gap <- mutate(gap, year = scale(year))
gap <- mutate(gap, gdpPercap = scale(gdpPercap))
model <- lm(lifeExp ~ gdpPercap * year, data = gap)
range(gap$gdpPercap)
## [1] -0.7075012 10.7845089
range(gap$year)
## [1] -1.592787  1.592787
summary(model)
## 
## Call:
## lm(formula = lifeExp ~ gdpPercap * year, data = gap)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -54.234  -7.314   1.002   7.951  19.780 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     59.2906     0.2392  247.90  < 2e-16 ***
## gdpPercap        6.4680     0.2430   26.61  < 2e-16 ***
## year             4.1489     0.2404   17.26  < 2e-16 ***
## gdpPercap:year   0.8091     0.2187    3.70 0.000222 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.658 on 1700 degrees of freedom
## Multiple R-squared:  0.442,  Adjusted R-squared:  0.441 
## F-statistic: 448.8 on 3 and 1700 DF,  p-value: < 2.2e-16

The fitted model becomes,

\(z = 59.29 + 6.46 x + 4.14 y + 0.80 + x y\) with $x$ the gdpPercap and $y$ the year.

See this link for a graph: https://www.wolframalpha.com/input?i=plot+59.2906+%2B+6.4680+*+x+%2B+4.1489+*+y+%2B+0.8091+%2B+x+*+y+with+x+from+-+1+to+11+and+y+from+-2+to+2

Step

Using the Murder data

library(MASS)
## 
## Attaching package: 'MASS'

## The following object is masked from 'package:dplyr':
## 
##     select
full=lm(Murder~.,data=state_data)
stepAIC(full, direction="backward", trace = TRUE)
## Start:  AIC=63.01
## Murder ~ Population + Income + Illiteracy + Life.Exp + HS.Grad + 
##     Frost + Area
## 
##              Df Sum of Sq    RSS    AIC
## - Income      1     0.236 128.27 61.105
## - HS.Grad     1     0.973 129.01 61.392
## <none>                    128.03 63.013
## - Area        1     7.514 135.55 63.865
## - Illiteracy  1     8.299 136.33 64.154
## - Frost       1     9.260 137.29 64.505
## - Population  1    25.719 153.75 70.166
## - Life.Exp    1   127.175 255.21 95.503
## 
## Step:  AIC=61.11
## Murder ~ Population + Illiteracy + Life.Exp + HS.Grad + Frost + 
##     Area
## 
##              Df Sum of Sq    RSS    AIC
## - HS.Grad     1     0.763 129.03 59.402
## <none>                    128.27 61.105
## - Area        1     7.310 135.58 61.877
## - Illiteracy  1     8.715 136.98 62.392
## - Frost       1     9.345 137.61 62.621
## - Population  1    27.142 155.41 68.702
## - Life.Exp    1   127.500 255.77 93.613
## 
## Step:  AIC=59.4
## Murder ~ Population + Illiteracy + Life.Exp + Frost + Area
## 
##              Df Sum of Sq    RSS    AIC
## <none>                    129.03 59.402
## - Illiteracy  1     8.723 137.75 60.672
## - Frost       1    11.030 140.06 61.503
## - Area        1    15.937 144.97 63.225
## - Population  1    26.415 155.45 66.714
## - Life.Exp    1   140.391 269.42 94.213

## 
## Call:
## lm(formula = Murder ~ Population + Illiteracy + Life.Exp + Frost + 
##     Area, data = state_data)
## 
## Coefficients:
## (Intercept)   Population   Illiteracy     Life.Exp        Frost         Area  
##   1.202e+02    1.780e-04    1.173e+00   -1.608e+00   -1.373e-02    6.804e-06

Using the body data

library(MASS)
full=lm(Weight~.,data=body_data)
stepAIC(full, direction="backward", trace = TRUE)
## Start:  AIC=775.52
## Weight ~ Biacromial + Biiliac + Bitrochanteric + ChestDepth + 
##     ChestDia + ElbowDia + WristDia + KneeDia + AnkleDia + Shoulder + 
##     Chest + Waist + Navel + Hip + Thigh + Bicep + Forearm + Knee + 
##     Calf + Ankle + Wrist + Age + Height + Gender
## 
##                  Df Sum of Sq    RSS    AIC
## - Ankle           1      0.06 2120.8 773.54
## - Navel           1      0.49 2121.2 773.64
## - Biacromial      1      0.71 2121.5 773.69
## - AnkleDia        1      2.08 2122.8 774.02
## - WristDia        1      3.42 2124.2 774.34
## - Bitrochanteric  1      3.83 2124.6 774.44
## - Wrist           1      5.98 2126.7 774.95
## - ElbowDia        1      6.57 2127.3 775.09
## - Bicep           1      8.17 2128.9 775.47
## <none>                        2120.7 775.52
## - Biiliac         1     13.13 2133.9 776.65
## - ChestDia        1     15.71 2136.5 777.27
## - Shoulder        1     27.81 2148.6 780.13
## - Knee            1     30.39 2151.1 780.74
## - Gender          1     36.02 2156.8 782.06
## - KneeDia         1     43.48 2164.2 783.81
## - Chest           1     47.62 2168.4 784.78
## - Forearm         1     51.49 2172.2 785.69
## - ChestDepth      1     77.87 2198.6 791.81
## - Thigh           1     78.65 2199.4 791.99
## - Age             1     88.97 2209.7 794.36
## - Hip             1    108.21 2229.0 798.75
## - Calf            1    118.89 2239.6 801.18
## - Waist           1    797.97 2918.7 935.45
## - Height          1   1173.76 3294.5 996.85
## 
## Step:  AIC=773.54
## Weight ~ Biacromial + Biiliac + Bitrochanteric + ChestDepth + 
##     ChestDia + ElbowDia + WristDia + KneeDia + AnkleDia + Shoulder + 
##     Chest + Waist + Navel + Hip + Thigh + Bicep + Forearm + Knee + 
##     Calf + Wrist + Age + Height + Gender
## 
##                  Df Sum of Sq    RSS    AIC
## - Navel           1      0.46 2121.3 771.65
## - Biacromial      1      0.69 2121.5 771.70
## - AnkleDia        1      2.46 2123.3 772.13
## - WristDia        1      3.37 2124.2 772.34
## - Bitrochanteric  1      3.80 2124.6 772.45
## - Wrist           1      6.08 2126.9 772.99
## - ElbowDia        1      6.52 2127.3 773.09
## - Bicep           1      8.15 2129.0 773.48
## <none>                        2120.8 773.54
## - Biiliac         1     13.10 2133.9 774.66
## - ChestDia        1     15.71 2136.5 775.28
## - Shoulder        1     27.86 2148.7 778.15
## - Knee            1     32.75 2153.6 779.31
## - Gender          1     36.02 2156.8 780.08
## - KneeDia         1     43.87 2164.7 781.92
## - Chest           1     47.59 2168.4 782.79
## - Forearm         1     51.43 2172.2 783.69
## - ChestDepth      1     77.84 2198.6 789.81
## - Thigh           1     78.76 2199.6 790.02
## - Age             1     89.71 2210.5 792.54
## - Hip             1    108.59 2229.4 796.86
## - Calf            1    137.71 2258.5 803.44
## - Waist           1    798.17 2919.0 933.49
## - Height          1   1174.23 3295.0 994.93
## 
## Step:  AIC=771.65
## Weight ~ Biacromial + Biiliac + Bitrochanteric + ChestDepth + 
##     ChestDia + ElbowDia + WristDia + KneeDia + AnkleDia + Shoulder + 
##     Chest + Waist + Hip + Thigh + Bicep + Forearm + Knee + Calf + 
##     Wrist + Age + Height + Gender
## 
##                  Df Sum of Sq    RSS    AIC
## - Biacromial      1      0.66 2121.9 769.81
## - AnkleDia        1      2.22 2123.5 770.18
## - Bitrochanteric  1      3.57 2124.8 770.50
## - WristDia        1      3.64 2124.9 770.52
## - Wrist           1      6.05 2127.3 771.09
## - ElbowDia        1      6.26 2127.5 771.14
## - Bicep           1      7.75 2129.0 771.50
## <none>                        2121.3 771.65
## - Biiliac         1     12.67 2133.9 772.67
## - ChestDia        1     16.22 2137.5 773.51
## - Shoulder        1     28.62 2149.9 776.44
## - Knee            1     32.29 2153.6 777.31
## - Gender          1     36.57 2157.8 778.31
## - KneeDia         1     45.28 2166.6 780.36
## - Chest           1     47.13 2168.4 780.79
## - Forearm         1     52.51 2173.8 782.05
## - ChestDepth      1     77.39 2198.7 787.82
## - Thigh           1     81.25 2202.5 788.71
## - Age             1     96.82 2218.1 792.28
## - Hip             1    121.11 2242.4 797.80
## - Calf            1    140.97 2262.2 802.27
## - Waist           1    896.91 3018.2 948.44
## - Height          1   1174.61 3295.9 993.06
## 
## Step:  AIC=769.81
## Weight ~ Biiliac + Bitrochanteric + ChestDepth + ChestDia + ElbowDia + 
##     WristDia + KneeDia + AnkleDia + Shoulder + Chest + Waist + 
##     Hip + Thigh + Bicep + Forearm + Knee + Calf + Wrist + Age + 
##     Height + Gender
## 
##                  Df Sum of Sq    RSS    AIC
## - AnkleDia        1      2.48 2124.4 768.40
## - WristDia        1      3.67 2125.6 768.68
## - Bitrochanteric  1      4.29 2126.2 768.83
## - ElbowDia        1      6.13 2128.1 769.27
## - Wrist           1      6.92 2128.9 769.46
## - Bicep           1      8.26 2130.2 769.78
## <none>                        2121.9 769.81
## - Biiliac         1     12.23 2134.2 770.72
## - ChestDia        1     15.56 2137.5 771.51
## - Shoulder        1     28.16 2150.1 774.49
## - Knee            1     32.95 2154.9 775.62
## - Gender          1     40.48 2162.4 777.39
## - KneeDia         1     44.74 2166.7 778.39
## - Chest           1     48.22 2170.2 779.20
## - Forearm         1     52.71 2174.6 780.25
## - ChestDepth      1     77.31 2199.2 785.95
## - Thigh           1     81.31 2203.2 786.87
## - Age             1     96.41 2218.3 790.33
## - Hip             1    123.57 2245.5 796.50
## - Calf            1    140.68 2262.6 800.35
## - Waist           1    897.14 3019.1 946.59
## - Height          1   1219.78 3341.7 998.06
## 
## Step:  AIC=768.4
## Weight ~ Biiliac + Bitrochanteric + ChestDepth + ChestDia + ElbowDia + 
##     WristDia + KneeDia + Shoulder + Chest + Waist + Hip + Thigh + 
##     Bicep + Forearm + Knee + Calf + Wrist + Age + Height + Gender
## 
##                  Df Sum of Sq    RSS     AIC
## - Bitrochanteric  1      4.47 2128.9  767.46
## - WristDia        1      4.54 2129.0  767.48
## - Wrist           1      6.39 2130.8  767.92
## - Bicep           1      7.91 2132.3  768.28
## <none>                        2124.4  768.40
## - ElbowDia        1      9.46 2133.9  768.65
## - Biiliac         1     13.47 2137.9  769.60
## - ChestDia        1     15.43 2139.8  770.07
## - Shoulder        1     26.32 2150.7  772.64
## - Knee            1     31.67 2156.1  773.90
## - Gender          1     38.79 2163.2  775.57
## - Chest           1     51.66 2176.1  778.58
## - Forearm         1     51.96 2176.4  778.65
## - KneeDia         1     53.53 2177.9  779.02
## - ChestDepth      1     77.05 2201.5  784.46
## - Thigh           1     82.29 2206.7  785.67
## - Age             1     94.35 2218.8  788.43
## - Hip             1    122.97 2247.4  794.93
## - Calf            1    143.48 2267.9  799.53
## - Waist           1    896.31 3020.7  944.86
## - Height          1   1255.96 3380.4 1001.90
## 
## Step:  AIC=767.46
## Weight ~ Biiliac + ChestDepth + ChestDia + ElbowDia + WristDia + 
##     KneeDia + Shoulder + Chest + Waist + Hip + Thigh + Bicep + 
##     Forearm + Knee + Calf + Wrist + Age + Height + Gender
## 
##              Df Sum of Sq    RSS     AIC
## - WristDia    1      4.90 2133.8  766.63
## - Wrist       1      6.96 2135.8  767.12
## - Bicep       1      7.34 2136.2  767.21
## - ElbowDia    1      7.67 2136.6  767.29
## <none>                    2128.9  767.46
## - Biiliac     1      9.65 2138.5  767.76
## - ChestDia    1     12.91 2141.8  768.53
## - Shoulder    1     27.13 2156.0  771.88
## - Knee        1     33.25 2162.1  773.32
## - Gender      1     39.54 2168.4  774.79
## - KneeDia     1     51.57 2180.5  777.60
## - Forearm     1     54.44 2183.3  778.27
## - Chest       1     57.69 2186.6  779.02
## - ChestDepth  1     77.06 2205.9  783.49
## - Thigh       1     87.77 2216.7  785.95
## - Age         1     99.38 2228.3  788.60
## - Hip         1    127.01 2255.9  794.84
## - Calf        1    139.66 2268.5  797.68
## - Waist       1    911.72 3040.6  946.19
## - Height      1   1254.46 3383.3 1000.34
## 
## Step:  AIC=766.63
## Weight ~ Biiliac + ChestDepth + ChestDia + ElbowDia + KneeDia + 
##     Shoulder + Chest + Waist + Hip + Thigh + Bicep + Forearm + 
##     Knee + Calf + Wrist + Age + Height + Gender
## 
##              Df Sum of Sq    RSS     AIC
## - Wrist       1      3.97 2137.7  765.57
## - Bicep       1      7.13 2140.9  766.32
## <none>                    2133.8  766.63
## - Biiliac     1      9.23 2143.0  766.82
## - ElbowDia    1     12.10 2145.9  767.49
## - ChestDia    1     13.55 2147.3  767.84
## - Shoulder    1     26.56 2160.3  770.90
## - Knee        1     32.84 2166.6  772.37
## - Gender      1     39.48 2173.3  773.92
## - Forearm     1     54.13 2187.9  777.33
## - KneeDia     1     56.85 2190.6  777.96
## - Chest       1     60.08 2193.9  778.71
## - ChestDepth  1     73.88 2207.7  781.89
## - Thigh       1     85.73 2219.5  784.60
## - Age         1     97.74 2231.5  787.34
## - Hip         1    127.75 2261.5  794.11
## - Calf        1    142.03 2275.8  797.30
## - Waist       1    917.62 3051.4  945.99
## - Height      1   1271.05 3404.8 1001.55
## 
## Step:  AIC=765.57
## Weight ~ Biiliac + ChestDepth + ChestDia + ElbowDia + KneeDia + 
##     Shoulder + Chest + Waist + Hip + Thigh + Bicep + Forearm + 
##     Knee + Calf + Age + Height + Gender
## 
##              Df Sum of Sq    RSS     AIC
## - Bicep       1      6.68 2144.4  765.15
## <none>                    2137.7  765.57
## - ElbowDia    1     11.05 2148.8  766.18
## - Biiliac     1     11.41 2149.2  766.27
## - ChestDia    1     14.04 2151.8  766.89
## - Shoulder    1     26.62 2164.4  769.85
## - Knee        1     31.10 2168.8  770.89
## - Gender      1     39.75 2177.5  772.91
## - Forearm     1     50.51 2188.3  775.41
## - KneeDia     1     53.43 2191.2  776.09
## - Chest       1     58.40 2196.1  777.24
## - ChestDepth  1     73.15 2210.9  780.63
## - Thigh       1     99.26 2237.0  786.58
## - Age         1    101.33 2239.1  787.05
## - Hip         1    124.78 2262.5  792.33
## - Calf        1    138.06 2275.8  795.30
## - Waist       1    926.25 3064.0  946.08
## - Height      1   1279.67 3417.4 1001.42
## 
## Step:  AIC=765.15
## Weight ~ Biiliac + ChestDepth + ChestDia + ElbowDia + KneeDia + 
##     Shoulder + Chest + Waist + Hip + Thigh + Forearm + Knee + 
##     Calf + Age + Height + Gender
## 
##              Df Sum of Sq    RSS    AIC
## <none>                    2144.4 765.15
## - ElbowDia    1     11.03 2155.5 765.75
## - ChestDia    1     11.46 2155.9 765.86
## - Biiliac     1     12.19 2156.6 766.03
## - Knee        1     27.80 2172.2 769.68
## - Shoulder    1     32.32 2176.7 770.74
## - Gender      1     37.06 2181.5 771.84
## - KneeDia     1     54.73 2199.2 775.93
## - ChestDepth  1     71.64 2216.1 779.81
## - Chest       1     74.65 2219.1 780.50
## - Age         1     98.29 2242.7 785.88
## - Forearm     1    119.40 2263.8 790.63
## - Hip         1    121.76 2266.2 791.15
## - Thigh       1    123.73 2268.2 791.59
## - Calf        1    133.88 2278.3 793.86
## - Waist       1    929.27 3073.7 945.68
## - Height      1   1274.33 3418.8 999.62

## 
## Call:
## lm(formula = Weight ~ Biiliac + ChestDepth + ChestDia + ElbowDia + 
##     KneeDia + Shoulder + Chest + Waist + Hip + Thigh + Forearm + 
##     Knee + Calf + Age + Height + Gender, data = body_data)
## 
## Coefficients:
## (Intercept)      Biiliac   ChestDepth     ChestDia     ElbowDia      KneeDia  
##  -121.11380      0.09451      0.28004      0.12415      0.26400      0.45002  
##    Shoulder        Chest        Waist          Hip        Thigh      Forearm  
##     0.07936      0.14703      0.37465      0.20624      0.26130      0.52963  
##        Knee         Calf          Age       Height       Gender  
##     0.18622      0.34008     -0.05606      0.29486     -1.42332