library(tidyverse)
library(caret)
library(leaps)
library(MASS)
# Fit the full model 
full.model <- lm(Fertility ~., data = swiss)
# Stepwise regression model
step.model <- stepAIC(full.model, direction = "both", 
                      trace = FALSE)
summary(step.model)

Call:
lm(formula = Fertility ~ Agriculture + Education + Catholic + 
    Infant.Mortality, data = swiss)

Residuals:
     Min       1Q   Median       3Q      Max 
-14.6765  -6.0522   0.7514   3.1664  16.1422 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)      62.10131    9.60489   6.466 8.49e-08 ***
Agriculture      -0.15462    0.06819  -2.267  0.02857 *  
Education        -0.98026    0.14814  -6.617 5.14e-08 ***
Catholic          0.12467    0.02889   4.315 9.50e-05 ***
Infant.Mortality  1.07844    0.38187   2.824  0.00722 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.168 on 42 degrees of freedom
Multiple R-squared:  0.6993,    Adjusted R-squared:  0.6707 
F-statistic: 24.42 on 4 and 42 DF,  p-value: 1.717e-10
models <- regsubsets(Fertility~., data = swiss, nvmax = 5,
                     method = "forward")
summary(models)
Subset selection object
Call: regsubsets.formula(Fertility ~ ., data = swiss, nvmax = 5, method = "forward")
5 Variables  (and intercept)
                 Forced in Forced out
Agriculture          FALSE      FALSE
Examination          FALSE      FALSE
Education            FALSE      FALSE
Catholic             FALSE      FALSE
Infant.Mortality     FALSE      FALSE
1 subsets of each size up to 5
Selection Algorithm: forward
         Agriculture Examination Education Catholic Infant.Mortality
1  ( 1 ) " "         " "         "*"       " "      " "             
2  ( 1 ) " "         " "         "*"       "*"      " "             
3  ( 1 ) " "         " "         "*"       "*"      "*"             
4  ( 1 ) "*"         " "         "*"       "*"      "*"             
5  ( 1 ) "*"         "*"         "*"       "*"      "*"             
# Set seed for reproducibility
set.seed(123)
# Set up repeated k-fold cross-validation
train.control <- trainControl(method = "cv", number = 10)
# Train the model
step.model <- train(Fertility ~., data = swiss,
                    method = "leapForward", 
                    tuneGrid = data.frame(nvmax = 1:5),
                    trControl = train.control
                    )
step.model$results
step.model$bestTune
summary(step.model$finalModel)
Subset selection object
5 Variables  (and intercept)
                 Forced in Forced out
Agriculture          FALSE      FALSE
Examination          FALSE      FALSE
Education            FALSE      FALSE
Catholic             FALSE      FALSE
Infant.Mortality     FALSE      FALSE
1 subsets of each size up to 5
Selection Algorithm: forward
         Agriculture Examination Education Catholic Infant.Mortality
1  ( 1 ) " "         " "         "*"       " "      " "             
2  ( 1 ) " "         " "         "*"       "*"      " "             
3  ( 1 ) " "         " "         "*"       "*"      "*"             
4  ( 1 ) "*"         " "         "*"       "*"      "*"             
5  ( 1 ) "*"         "*"         "*"       "*"      "*"             
coef(step.model$finalModel, 4)
     (Intercept)      Agriculture        Education         Catholic Infant.Mortality 
      62.1013116       -0.1546175       -0.9802638        0.1246664        1.0784422 
lm(Fertility ~ Agriculture + Education + Catholic + Infant.Mortality, 
   data = swiss)

Call:
lm(formula = Fertility ~ Agriculture + Education + Catholic + 
    Infant.Mortality, data = swiss)

Coefficients:
     (Intercept)       Agriculture         Education          Catholic  Infant.Mortality  
         62.1013           -0.1546           -0.9803            0.1247            1.0784  
LS0tDQp0aXRsZTogIkhvamEgZGUgVHJhYmFqbyAjIDYgRmlhYmlsaWRhZCAtIE9zY2FyIFBhZGlsbGEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY2FyZXQpDQpsaWJyYXJ5KGxlYXBzKQ0KbGlicmFyeShNQVNTKQ0KIyBGaXQgdGhlIGZ1bGwgbW9kZWwgDQpmdWxsLm1vZGVsIDwtIGxtKEZlcnRpbGl0eSB+LiwgZGF0YSA9IHN3aXNzKQ0KIyBTdGVwd2lzZSByZWdyZXNzaW9uIG1vZGVsDQpzdGVwLm1vZGVsIDwtIHN0ZXBBSUMoZnVsbC5tb2RlbCwgZGlyZWN0aW9uID0gImJvdGgiLCANCiAgICAgICAgICAgICAgICAgICAgICB0cmFjZSA9IEZBTFNFKQ0Kc3VtbWFyeShzdGVwLm1vZGVsKQ0KbW9kZWxzIDwtIHJlZ3N1YnNldHMoRmVydGlsaXR5fi4sIGRhdGEgPSBzd2lzcywgbnZtYXggPSA1LA0KICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImZvcndhcmQiKQ0Kc3VtbWFyeShtb2RlbHMpDQojIFNldCBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCiMgU2V0IHVwIHJlcGVhdGVkIGstZm9sZCBjcm9zcy12YWxpZGF0aW9uDQp0cmFpbi5jb250cm9sIDwtIHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCkNCiMgVHJhaW4gdGhlIG1vZGVsDQpzdGVwLm1vZGVsIDwtIHRyYWluKEZlcnRpbGl0eSB+LiwgZGF0YSA9IHN3aXNzLA0KICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAibGVhcEZvcndhcmQiLCANCiAgICAgICAgICAgICAgICAgICAgdHVuZUdyaWQgPSBkYXRhLmZyYW1lKG52bWF4ID0gMTo1KSwNCiAgICAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW4uY29udHJvbA0KICAgICAgICAgICAgICAgICAgICApDQpzdGVwLm1vZGVsJHJlc3VsdHMNCnN0ZXAubW9kZWwkYmVzdFR1bmUNCnN1bW1hcnkoc3RlcC5tb2RlbCRmaW5hbE1vZGVsKQ0KY29lZihzdGVwLm1vZGVsJGZpbmFsTW9kZWwsIDQpDQpsbShGZXJ0aWxpdHkgfiBBZ3JpY3VsdHVyZSArIEVkdWNhdGlvbiArIENhdGhvbGljICsgSW5mYW50Lk1vcnRhbGl0eSwgDQogICBkYXRhID0gc3dpc3MpDQpgYGANCg0KDQo=