1 Load Libraries

# Loading necessary packages
## Markdown Update
if(! "rmarkdown" %in% installed.packages()) { install.packages("rmarkdown", dependencies = TRUE) }
library(rmarkdown)

## Loading other packages if not available
if(! "readxl" %in% installed.packages()) { install.packages("readxl", dependencies = TRUE) }
library(readxl)

if(! "tidyr" %in% installed.packages()) { install.packages("tidyr", dependencies = TRUE) }
library(tidyr)

if(! "zoo" %in% installed.packages()) { install.packages("zoo", dependencies = TRUE) }
library(zoo)

if(! "car" %in% installed.packages()) { install.packages("car", dependencies = TRUE) }
library(car)

2 Prepare Necessary Function

3 ANN for Cereals Data

3.1 Get Data for Cereals

# Setting working Directory
setwd("~/AC UNI-ORG/AB SIM/GDBA/R")

# Set number of decimals
options(digits = 4)              # Modify global options

# Download Data from URL

3.2 Explore Data for Cereals

# Loading other packages if not available
if(! "vtable" %in% installed.packages()) { install.packages("vtable", dependencies = TRUE) }
library(vtable)

# Add ID to Data Frame
Cereals$ID <- 1:nrow(Cereals)

# Show Characteristics of Data Frame
cat("\n\nColumns Available in Data Frame:\n")
## 
## 
## Columns Available in Data Frame:
names(Cereals)
##  [1] "X"        "name"     "mfr"      "type"     "calories" "protein" 
##  [7] "fat"      "sodium"   "fiber"    "carbo"    "sugars"   "potass"  
## [13] "vitamins" "shelf"    "weight"   "cups"     "rating"   "ID"
cat("\n\nShow Structure of the Data Frame:\n")
## 
## 
## Show Structure of the Data Frame:
str(Cereals)
## 'data.frame':    76 obs. of  18 variables:
##  $ X       : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ name    : Factor w/ 76 levels "100% Bran","100% Natural Bran",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ mfr     : Factor w/ 7 levels "A","G","K","N",..: 4 6 3 3 7 2 3 2 7 5 ...
##  $ type    : Factor w/ 2 levels "C","H": 1 1 1 1 1 1 1 1 1 1 ...
##  $ calories: int  70 120 70 50 110 110 110 130 90 90 ...
##  $ protein : int  4 3 4 4 2 2 2 3 2 3 ...
##  $ fat     : int  1 5 1 0 2 2 0 2 1 0 ...
##  $ sodium  : int  130 15 260 140 200 180 125 210 200 210 ...
##  $ fiber   : num  10 2 9 14 1 1.5 1 2 4 5 ...
##  $ carbo   : num  5 8 7 8 14 10.5 11 18 15 13 ...
##  $ sugars  : int  6 8 5 0 8 10 14 8 6 5 ...
##  $ potass  : int  280 135 320 330 -1 70 30 100 125 190 ...
##  $ vitamins: int  25 0 25 25 25 25 25 25 25 25 ...
##  $ shelf   : int  3 3 3 3 3 1 2 3 1 3 ...
##  $ weight  : num  1 1 1 1 1 1 1 1.33 1 1 ...
##  $ cups    : num  0.33 1 0.33 0.5 0.75 0.75 1 0.75 0.67 0.67 ...
##  $ rating  : num  68.4 34 59.4 93.7 34.4 ...
##  $ ID      : int  1 2 3 4 5 6 7 8 9 10 ...
cat("\n\nFirst 5 Rows of Data Frame:\n")
## 
## 
## First 5 Rows of Data Frame:
head(Cereals, 5)
##   X                      name mfr type calories protein fat sodium fiber carbo
## 1 1                 100% Bran   N    C       70       4   1    130    10     5
## 2 2         100% Natural Bran   Q    C      120       3   5     15     2     8
## 3 3                  All-Bran   K    C       70       4   1    260     9     7
## 4 4 All-Bran with Extra Fiber   K    C       50       4   0    140    14     8
## 5 5            Almond Delight   R    C      110       2   2    200     1    14
##   sugars potass vitamins shelf weight cups rating ID
## 1      6    280       25     3      1 0.33  68.40  1
## 2      8    135        0     3      1 1.00  33.98  2
## 3      5    320       25     3      1 0.33  59.43  3
## 4      0    330       25     3      1 0.50  93.70  4
## 5      8     -1       25     3      1 0.75  34.38  5
cat("\n\nDescriptive Statistics of Columns in Data Frame:\n")
## 
## 
## Descriptive Statistics of Columns in Data Frame:
st(Cereals, add.median = TRUE, out = "csv", simple.kable = TRUE, col.align = "right", align = "right", digits = 5,
   title='Summary Statistics',
   summ = list(
     c('notNA(x)','mean(x)','sd(x)','min(x)', 'pctile(x)[25]', 'median(x)', 'pctile(x)[75]', 'max(x)', 'propNA(x)', 'getmode(x)'),
     c('notNA(x)','mean(x)')
   ),
   summ.names = list(
     c('N','Mean','SD','Min','P25','P50','P75', 'Max','NA','Mode'),
     c('Count','Percent')
   )
)
##                                       Variable  N    Mean      SD    Min    P25
## 1                                            X 76   38.75  22.412      1  19.75
## 2                                         name 76                              
## 3                                ... 100% Bran  1  1.316%                      
## 4                        ... 100% Natural Bran  1  1.316%                      
## 5                                 ... All-Bran  1  1.316%                      
## 6                ... All-Bran with Extra Fiber  1  1.316%                      
## 7                           ... Almond Delight  1  1.316%                      
## 8                  ... Apple Cinnamon Cheerios  1  1.316%                      
## 9                              ... Apple Jacks  1  1.316%                      
## 10                                 ... Basic 4  1  1.316%                      
## 11                               ... Bran Chex  1  1.316%                      
## 12                             ... Bran Flakes  1  1.316%                      
## 13                            ... Cap'n'Crunch  1  1.316%                      
## 14                                ... Cheerios  1  1.316%                      
## 15                   ... Cinnamon Toast Crunch  1  1.316%                      
## 16                                ... Clusters  1  1.316%                      
## 17                             ... Cocoa Puffs  1  1.316%                      
## 18                               ... Corn Chex  1  1.316%                      
## 19                             ... Corn Flakes  1  1.316%                      
## 20                               ... Corn Pops  1  1.316%                      
## 21                           ... Count Chocula  1  1.316%                      
## 22                      ... Cracklin' Oat Bran  1  1.316%                      
## 23                  ... Cream of Wheat (Quick)  1  1.316%                      
## 24                                 ... Crispix  1  1.316%                      
## 25                  ... Crispy Wheat & Raisins  1  1.316%                      
## 26                             ... Double Chex  1  1.316%                      
## 27                             ... Froot Loops  1  1.316%                      
## 28                          ... Frosted Flakes  1  1.316%                      
## 29                     ... Frosted Mini-Wheats  1  1.316%                      
## 30  ... Fruit & Fibre Dates; Walnuts; and Oats  1  1.316%                      
## 31                           ... Fruitful Bran  1  1.316%                      
## 32                          ... Fruity Pebbles  1  1.316%                      
## 33                            ... Golden Crisp  1  1.316%                      
## 34                          ... Golden Grahams  1  1.316%                      
## 35                              ... Grape-Nuts  1  1.316%                      
## 36                       ... Grape Nuts Flakes  1  1.316%                      
## 37                      ... Great Grains Pecan  1  1.316%                      
## 38                              ... Honey-comb  1  1.316%                      
## 39                        ... Honey Graham Ohs  1  1.316%                      
## 40                      ... Honey Nut Cheerios  1  1.316%                      
## 41             ... Just Right Crunchy  Nuggets  1  1.316%                      
## 42                  ... Just Right Fruit & Nut  1  1.316%                      
## 43                                     ... Kix  1  1.316%                      
## 44                                    ... Life  1  1.316%                      
## 45                            ... Lucky Charms  1  1.316%                      
## 46                                   ... Maypo  1  1.316%                      
## 47        ... Muesli Raisins; Dates; & Almonds  1  1.316%                      
## 48       ... Muesli Raisins; Peaches; & Pecans  1  1.316%                      
## 49                    ... Mueslix Crispy Blend  1  1.316%                      
## 50                    ... Multi-Grain Cheerios  1  1.316%                      
## 51                        ... Nut&Honey Crunch  1  1.316%                      
## 52               ... Nutri-Grain Almond-Raisin  1  1.316%                      
## 53                       ... Nutri-grain Wheat  1  1.316%                      
## 54                    ... Oatmeal Raisin Crisp  1  1.316%                      
## 55                   ... Post Nat. Raisin Bran  1  1.316%                      
## 56                              ... Product 19  1  1.316%                      
## 57                             ... Puffed Rice  1  1.316%                      
## 58                            ... Puffed Wheat  1  1.316%                      
## 59                      ... Quaker Oat Squares  1  1.316%                      
## 60                             ... Raisin Bran  1  1.316%                      
## 61                         ... Raisin Nut Bran  1  1.316%                      
## 62                          ... Raisin Squares  1  1.316%                      
## 63                               ... Rice Chex  1  1.316%                      
## 64                           ... Rice Krispies  1  1.316%                      
## 65                          ... Shredded Wheat  1  1.316%                      
## 66                  ... Shredded Wheat 'n'Bran  1  1.316%                      
## 67               ... Shredded Wheat spoon size  1  1.316%                      
## 68                                  ... Smacks  1  1.316%                      
## 69                               ... Special K  1  1.316%                      
## 70                 ... Strawberry Fruit Wheats  1  1.316%                      
## 71                       ... Total Corn Flakes  1  1.316%                      
## 72                       ... Total Raisin Bran  1  1.316%                      
## 73                       ... Total Whole Grain  1  1.316%                      
## 74                                 ... Triples  1  1.316%                      
## 75                                    ... Trix  1  1.316%                      
## 76                              ... Wheat Chex  1  1.316%                      
## 77                                ... Wheaties  1  1.316%                      
## 78                     ... Wheaties Honey Gold  1  1.316%                      
## 79                                         mfr 76                              
## 80                                       ... A  1  1.316%                      
## 81                                       ... G 22 28.947%                      
## 82                                       ... K 23 30.263%                      
## 83                                       ... N  6  7.895%                      
## 84                                       ... P  9 11.842%                      
## 85                                       ... Q  7  9.211%                      
## 86                                       ... R  8 10.526%                      
## 87                                        type 76                              
## 88                                       ... C 74 97.368%                      
## 89                                       ... H  2  2.632%                      
## 90                                    calories 76  106.97  19.597     50    100
## 91                                     protein 76  2.5132  1.0645      1      2
## 92                                         fat 76       1  1.0066      0      0
## 93                                      sodium 76  161.78  82.323      0 133.75
## 94                                       fiber 76  2.1447  2.3984      0   0.75
## 95                                       carbo 76  14.803  3.9073      5     12
## 96                                      sugars 76  7.0263  4.3787      0      3
## 97                                      potass 76  95.895  71.742     -1     40
## 98                                    vitamins 76  28.618   22.25      0     25
## 99                                       shelf 76  2.2237 0.82622      1   1.75
## 100                                     weight 76    1.03 0.15144    0.5      1
## 101                                       cups 76 0.82303  0.2336   0.25   0.67
## 102                                     rating 76  42.558  14.109 18.043 32.932
## 103                                         ID 76    38.5  22.083      1  19.75
##        P50    P75    Max NA Mode
## 1     38.5   57.5     77  0     
## 2                               
## 3                               
## 4                               
## 5                               
## 6                               
## 7                               
## 8                               
## 9                               
## 10                              
## 11                              
## 12                              
## 13                              
## 14                              
## 15                              
## 16                              
## 17                              
## 18                              
## 19                              
## 20                              
## 21                              
## 22                              
## 23                              
## 24                              
## 25                              
## 26                              
## 27                              
## 28                              
## 29                              
## 30                              
## 31                              
## 32                              
## 33                              
## 34                              
## 35                              
## 36                              
## 37                              
## 38                              
## 39                              
## 40                              
## 41                              
## 42                              
## 43                              
## 44                              
## 45                              
## 46                              
## 47                              
## 48                              
## 49                              
## 50                              
## 51                              
## 52                              
## 53                              
## 54                              
## 55                              
## 56                              
## 57                              
## 58                              
## 59                              
## 60                              
## 61                              
## 62                              
## 63                              
## 64                              
## 65                              
## 66                              
## 67                              
## 68                              
## 69                              
## 70                              
## 71                              
## 72                              
## 73                              
## 74                              
## 75                              
## 76                              
## 77                              
## 78                              
## 79                              
## 80                              
## 81                              
## 82                              
## 83                              
## 84                              
## 85                              
## 86                              
## 87                              
## 88                              
## 89                              
## 90     110    110    160  0     
## 91     2.5      3      6  0     
## 92       1   1.25      5  0     
## 93     180  212.5    320  0     
## 94    1.75      3     14  0     
## 95    14.5     17     23  0     
## 96       7     11     15  0     
## 97      90    120    330  0     
## 98      25     25    100  0     
## 99       2      3      3  0     
## 100      1      1    1.5  0     
## 101   0.75      1    1.5  0     
## 102 40.253 50.972 93.705  0     
## 103   38.5  57.25     76  0

3.3 Create Training and Test Data

# Load Library if not available
if(! "dplyr" %in% installed.packages()) { install.packages("dplyr", dependencies = TRUE) }
library(dplyr)

# Scale data for neural network
scaled <- as.data.frame(mutate(Cereals, across(c(5:13,15:17), MinMax.Fun)))

# Random sampling
samplesize = 0.60 * nrow(scaled)
set.seed(80)
index = sample( seq_len ( nrow ( scaled ) ), size = samplesize )

# creating training and test set
CerealsTrain = scaled[index , ]
CerealsTest  = scaled[-index , ]

# Keep only Numeric Variables
CerealsNum <- as.data.frame(scaled[, -c(1:3, 13:15)])

head(CerealsTrain)
##     X                      name mfr type calories protein fat sodium   fiber
## 11 11              Cap'n'Crunch   Q    C   0.6364     0.0 0.4 0.6875 0.00000
## 43 43              Lucky Charms   G    C   0.5455     0.2 0.2 0.5625 0.00000
## 31 31              Golden Crisp   P    C   0.4545     0.2 0.0 0.1406 0.00000
## 65 66 Shredded Wheat spoon size   N    C   0.3636     0.4 0.0 0.0000 0.21429
## 50 50 Nutri-Grain Almond-Raisin   K    C   0.8182     0.4 0.4 0.6875 0.21429
## 36 36          Honey Graham Ohs   Q    C   0.6364     0.0 0.4 0.6875 0.07143
##     carbo sugars potass vitamins shelf weight  cups rating ID
## 11 0.3889 0.8000 0.1088     0.25     2   0.50 0.400 0.0000 11
## 43 0.3889 0.8000 0.1692     0.25     2   0.50 0.600 0.1149 43
## 31 0.3333 1.0000 0.1239     0.25     1   0.50 0.504 0.2275 31
## 65 0.8333 0.0000 0.3656     0.00     1   0.50 0.336 0.7237 65
## 50 0.8889 0.4667 0.3958     0.25     3   0.83 0.336 0.2994 50
## 36 0.3889 0.7333 0.1390     0.25     2   0.50 0.600 0.0506 36
# Write data to working directory
write.csv(CerealsTrain, file = "CerealsTrain.csv")
write.csv(CerealsTest,  file = "CerealsTest.csv")

3.4 Fit Neural Network for Cereals

# Load Library if not available
if(! "neuralnet" %in% installed.packages()) { install.packages("neuralnet", dependencies = TRUE) }
library(neuralnet)
if(! "grid" %in% installed.packages()) { install.packages("grid", dependencies = TRUE) }
library(grid)

# fit neural network
set.seed(2)
NN = neuralnet(rating ~ calories + protein + fat + sodium + fiber + sugars, CerealsTrain, hidden = 3 , linear.output = T )

# plot neural network
plot(NN)

# Add custom title with grid.text
grid.text("Artificial Neural Network for Cereals Data", 
          x = 0.5, y = 0.99, just = "center", gp = gpar(fontsize = 20))

# Plot Garson's importance of factors
Gar.Fun('y', NN)

3.5 Prediction Using Neural Network for Cereals

# Use Test Dataset to Predict Rating
CerealsTest$predictRating = predict(NN, CerealsTest)

# Load Library if not available
if(! "graphics" %in% installed.packages()) { install.packages("graphics", dependencies = TRUE) }
library(graphics)

# Show Scatter Plot of Predicted Versus Real Rating
plot(CerealsTest$rating, CerealsTest$predictRating, col='blue', pch = 20, 
     ylab = "Predicted Rating Using NN", 
     xlab = "Real Rating")
text(CerealsTest$rating, CerealsTest$predictRating, labels = CerealsTest$name, pos = 2)

abline(0,1, col = "red")

# Calculate Root Mean Square Error (RMSE)
RMSE.NN = (sum((CerealsTest$rating - CerealsTest$predictRating)^2) / nrow(CerealsTest)) ^ 0.5
cat("\n\nRMSE: ", RMSE.NN)
## 
## 
## RMSE:  0.02679

4 ANN for Adults Data

4.1 Get Data for Adults

# Download Data from URL
Adults <- read.csv("https://www.coe-data.com/Data/SIM/Adults.csv", stringsAsFactors=T)

# Collapse Dataset so that we will work with a small sample of data
Adults <- Adults[1:800,]

# Collapse Categories
levels(Adults$marital.status)[2:4] <- "Married"
levels(Adults$workclass)[c(2,3,8)] <- "Gov"
levels(Adults$workclass)[c(5, 6)]  <- "Self"

# Load Library if not available
if(! "stringr" %in% installed.packages()) { install.packages("stringr", dependencies = TRUE) }
library(stringr)

# Prepare Columns
names(Adults) <- str_to_title(names(Adults))
names(Adults) <- substr(names(Adults), 1, 6)

colnames(Adults)[2]  <- "Class"
colnames(Adults)[5]  <- "EduNum"
colnames(Adults)[6]  <- "Marital"
colnames(Adults)[7]  <- "Occupat"
colnames(Adults)[8]  <- "Relationship"
colnames(Adults)[11] <- "CapGain"
colnames(Adults)[12] <- "CapLoss"
colnames(Adults)[13] <- "WeekHours"

head(Adults,4)
##   Age   Class Fnlwgt       Educat EduNum       Marital           Occupat
## 1  25 Private 226802         11th      7 Never-married Machine-op-inspct
## 2  38 Private  89814      HS-grad      9       Married   Farming-fishing
## 3  28     Gov 336951   Assoc-acdm     12       Married   Protective-serv
## 4  44 Private 160323 Some-college     10       Married Machine-op-inspct
##   Relationship  Race Gender CapGain CapLoss WeekHours        Native Income
## 1    Own-child Black   Male       0       0        40 United-States  <=50K
## 2      Husband White   Male       0       0        50 United-States  <=50K
## 3      Husband White   Male       0       0        40 United-States   >50K
## 4      Husband Black   Male    7688       0        40 United-States   >50K
names(Adults)
##  [1] "Age"          "Class"        "Fnlwgt"       "Educat"       "EduNum"      
##  [6] "Marital"      "Occupat"      "Relationship" "Race"         "Gender"      
## [11] "CapGain"      "CapLoss"      "WeekHours"    "Native"       "Income"

4.2 Prepare Data

# Determine how many Indicator variables are needed
unique(Adults$Income)   # One variable for income
## [1] <=50K >50K 
## Levels: <=50K >50K
unique(Adults$Gender)   # One variable for sex
## [1] Male   Female
## Levels: Female Male
unique(Adults$Race)     # Four variables for race
## [1] Black              White              Asian-Pac-Islander Other             
## [5] Amer-Indian-Eskimo
## Levels: Amer-Indian-Eskimo Asian-Pac-Islander Black Other White
unique(Adults$Class)    # Three variables for workclass
## [1] Private Gov     ?       Self   
## Levels: ? Gov Never-worked Private Self Without-pay
unique(Adults$Marital)  # Four variables for marital.status
## [1] Never-married Married       Widowed       Divorced      Separated    
## Levels: Divorced Married Never-married Separated Widowed
# Create indicator variables
Adults$Race_white <- Adults$Race_black <- Adults$Race_as.pac.is <- Adults$Race_am.in.esk <- Adults$Class_gov <- Adults$Class_self <- Adults$Class_priv <- Adults$Ms_marr <- Adults$Ms_div <- Adults$Ms_sep <- Adults$Ms_wid <-
Adults$Income_g50K <- Adults$GenderMale <- c(rep(0, length(Adults$Income)))
for (i in 1:length(Adults$Income)) {
  if(Adults$Income[i]==">50K") Adults$Income_g50K[i] <- 1
  if(Adults$Gender[i] == "Male") Adults$GenderMale[i] <- 1
  if(Adults$Race[i] == "White")              Adults$Race_white[i] <- 1
  if(Adults$Race[i] == "Amer-Indian-Eskimo") Adults$Race_am.in.esk[i] <- 1
  if(Adults$Race[i] == "Asian-Pac-Islander") Adults$Race_as.pac.is[i] <- 1
  if(Adults$Race[i] == "Black")              Adults$Race_black[i] <- 1
  if(Adults$Class[i] == "Gov")      Adults$Class_gov[i]  <- 1
  if(Adults$Class[i] == "Self")     Adults$Class_self[i] <- 1
  if(Adults$Class[i] == "Private" ) Adults$Class_priv[i] <- 1
  if(Adults$Marital[i] == "Married")    Adults$Ms_marr[i] <- 1
  if(Adults$Marital[i] == "Divorced" )  Adults$Ms_div[i] <- 1
  if(Adults$Marital[i] == "Separated" ) Adults$Ms_sep[i] <- 1
  if(Adults$Marital[i] == "Widowed" )   Adults$Ms_wid[i] <- 1
}

# Minimax transform the continuous variables
Adults$Age_mm <- (Adults$Age - min(Adults$Age)) / (max(Adults$Age)-min(Adults$Age))
Adults$EduNum_mm <- (Adults$EduNum - min(Adults$EduNum)) / (max(Adults$EduNum)-min(Adults$EduNum))
Adults$CapGain_mm <- (Adults$CapGain - min(Adults$CapGain)) / (max(Adults$CapGain)- min(Adults$CapGain))
Adults$CapLoss_mm <- (Adults$CapLoss - min(Adults$CapLoss)) / (max(Adults$CapLoss)- min(Adults$CapLoss))
Adults$WeekHours_mm <- (Adults$WeekHours - min(Adults$WeekHours)) / (max(Adults$WeekHours)-min(Adults$WeekHours))

# Random sampling
samplesize = 0.60 * nrow(Adults)
set.seed(80)
index = sample( seq_len ( nrow ( Adults ) ), size = samplesize )

# Create training and test set and get rid of the variables we no longer need
AdultsTrain = Adults[ index,  -c(1:16)]
AdultsTest  = Adults[ -index,  -c(1:16)]

# Write data to working directory
write.csv(AdultsTrain, file = "AdultsTrain.csv")
write.csv(AdultsTest,  file = "AdultsTest.csv")

4.3 Run the Neural Net

# Run the neural net
library(nnet) # Requires package nnet

net.dat <- nnet(Income_g50K ~ Age_mm + EduNum_mm + CapLoss_mm + CapGain_mm + WeekHours_mm, data = AdultsTrain, size = 8)
## # weights:  57
## initial  value 176.280853 
## final  value 106.000000 
## converged
table(round(net.dat$fitted.values, 1))                 # If fitted values are all the same, rerun nnet
## 
##   0 
## 480
net.dat$wts                                            # Weights
##  [1]   7.463078   2.379653   4.017865   0.195727  -0.007822   1.938247
##  [7]   9.429044   2.279962   4.948651   0.384534  -0.196695   4.193843
## [13]  -9.248702  -2.201697  -5.798401   0.084257  -0.603092  -3.389351
## [19] -12.119954  -3.052037  -6.870991   0.052914   0.133593  -4.163492
## [25]  -4.079619  -1.886951  -2.275251  -0.676292  -0.399636  -1.777567
## [31]  -2.553090  -1.177578  -1.573706  -0.652283  -0.510835  -0.018080
## [37]  -5.478672  -1.069325  -3.165955   0.190001   0.424434  -1.502311
## [43]  -9.496203  -2.565723  -5.950743   0.457548   0.395052  -2.902762
## [49] -95.023291 -49.340489 -26.436925 -39.317858 -27.521989 -63.732206
## [55] -28.639980 -55.612601 -66.421641
# hist(net.dat$wts)

4.4 Fit ANN for Adults Data (3 hidden nodes)

# fit neural network
set.seed(2)
NN3 = neuralnet(Income_g50K ~ Age_mm + EduNum_mm + CapLoss_mm + CapGain_mm + WeekHours_mm, AdultsTrain, hidden = c(5,2) , linear.output = FALSE, , err.fct = "sse")

# plot neural network
plot(NN3)

# Add custom title with grid.text
grid.text("Artificial Neural Network for Adults Income Data", 
          x = 0.5, y = 0.99, just = "center", gp = gpar(fontsize = 20))

# Load Library if not available
if(! "repeated" %in% installed.packages()) { install.packages("repeated", dependencies = TRUE) }
library(repeated)

# Plot Garson's importance of factors
Gar.Fun('y', NN3)

4.5 Prediction Using Neural Network for Adults

# Use Test Dataset to Predict Rating
predict_testNN = compute(NN3, AdultsTest[,c(13:17)])  # Columns used for model
AdultsTest$predict_testNN = (predict_testNN$net.result * (max(AdultsTest$Income_g50K) - min(AdultsTest$Income_g50K))) + min(AdultsTest$Income_g50K)

# Rounding values to make it easier to inspect
AdultsTest$predict_testNN <- round(AdultsTest$predict_testNN, 5)

# Show Scatter Plot of Predicted Versus Real Rating
plot(AdultsTest$Income_g50K, AdultsTest$predict_testNN, col='blue', pch = 20, 
     ylab = "Predicted Rating Using NN", 
     xlab = "Real Rating")
text(AdultsTest$Income_g50K, AdultsTest$predict_testNN, labels = AdultsTest$name, pos = 2)

# Load Library if not available
if(! "graphics" %in% installed.packages()) { install.packages("graphics", dependencies = TRUE) }
library(graphics)

abline(0,1, col = "red")

# Calculate Root Mean Square Error (RMSE)
RMSE.NN = (sum((AdultsTest$Income_g50K - AdultsTest$predict_testNN)^2) / nrow(AdultsTest)) ^ 0.5
RMSE.NN
## [1] 0.4285

4.6 Run the Prediction for Adults Data (3 hidden nodes)

# Load Library if not available
if(! "ggplot2" %in% installed.packages()) { install.packages("ggplot2", dependencies = TRUE) }
library(ggplot2)

# Prediction model
output3 <- compute(NN3, AdultsTest[,c(13:17)])  # Columns used for model
head(output3$net.result)
##         [,1]
## 1  4.976e-02
## 5  4.037e-02
## 7  1.540e-01
## 10 2.410e-95
## 12 8.776e-01
## 13 6.154e-02
head(AdultsTrain[1,])
##     Income_g50K Ms_wid Ms_sep Ms_div Ms_marr Class_priv Class_self Class_gov
## 139           0      0      0      0       1          1          0         0
##     Race_am.in.esk Race_as.pac.is Race_black Race_white Age_mm EduNum_mm
## 139              0              0          0          1  0.254    0.5333
##     CapGain_mm CapLoss_mm WeekHours_mm
## 139          0          0       0.3191
results3 <- data.frame(DataAsIs = AdultsTest$Income_g50K, Prediction = round(output3$net.result, 5))
results3
##     DataAsIs Prediction
## 1          0    0.04976
## 5          0    0.04037
## 7          0    0.15398
## 10         0    0.00000
## 12         0    0.87756
## 13         0    0.06154
## 16         1    0.89329
## 17         0    0.00000
## 18         0    0.00000
## 20         1    0.04734
## 21         1    0.29534
## 22         0    0.00000
## 23         0    0.00000
## 27         0    0.00000
## 29         0    0.03034
## 30         0    0.34285
## 31         1    0.09220
## 33         0    0.06833
## 34         0    0.06830
## 35         0    0.11272
## 36         0    0.21461
## 37         1    0.87756
## 40         0    0.06831
## 41         1    0.44821
## 42         1    0.38938
## 43         0    0.17692
## 47         0    0.00002
## 51         0    0.00000
## 55         0    0.07007
## 57         0    0.21264
## 62         0    0.23645
## 63         0    0.06750
## 64         0    0.16833
## 68         0    0.00000
## 70         0    0.28404
## 77         0    0.29137
## 78         0    0.00002
## 79         0    0.20065
## 81         0    0.33250
## 83         0    1.00000
## 84         1    0.04333
## 85         0    0.35076
## 86         0    0.26310
## 91         0    0.00000
## 94         0    0.38064
## 95         0    0.06758
## 96         0    0.06831
## 99         1    0.20903
## 102        0    0.00000
## 103        0    0.06829
## 104        0    0.00145
## 109        0    0.00000
## 110        0    0.02552
## 113        1    0.01155
## 114        0    0.00000
## 116        0    0.11272
## 117        0    0.19586
## 118        0    0.00000
## 120        1    0.12456
## 121        0    0.06761
## 122        0    0.00000
## 131        0    0.24438
## 132        0    0.02070
## 135        0    0.27092
## 138        0    0.00001
## 144        1    1.00000
## 145        0    0.00000
## 146        0    0.00000
## 148        1    0.16833
## 157        0    0.11272
## 159        0    1.00000
## 165        1    0.82490
## 167        1    1.00000
## 169        0    0.00000
## 171        1    1.00000
## 179        1    0.30068
## 180        1    1.00000
## 181        0    0.04772
## 183        1    0.04126
## 185        0    0.19300
## 186        0    0.99437
## 194        0    0.00005
## 195        0    0.31296
## 196        0    0.19034
## 198        1    1.00000
## 201        1    0.26957
## 206        0    0.50923
## 207        0    0.00002
## 211        0    0.00000
## 220        0    0.06830
## 225        1    0.00000
## 226        0    0.24438
## 227        1    0.12129
## 230        0    0.18986
## 231        0    0.06831
## 236        0    0.36427
## 239        0    0.03918
## 242        0    1.00000
## 244        0    0.00014
## 246        0    0.29360
## 249        1    0.32240
## 251        0    0.00000
## 252        0    0.38863
## 259        0    0.15795
## 261        0    0.32703
## 264        0    0.06805
## 266        1    0.15795
## 268        0    0.00000
## 272        1    0.01742
## 275        1    0.02714
## 278        0    0.00001
## 279        1    0.32984
## 288        1    0.25949
## 289        0    0.28144
## 294        0    0.01703
## 303        0    0.09276
## 306        0    0.62934
## 309        1    0.39901
## 318        0    0.00000
## 319        1    0.62934
## 322        0    0.34523
## 323        0    0.17943
## 327        0    0.96872
## 331        0    0.00000
## 333        1    0.20728
## 335        1    1.00000
## 336        0    0.06831
## 339        0    0.34283
## 340        0    0.46643
## 344        1    1.00000
## 346        1    0.06833
## 351        0    0.19447
## 352        0    0.04809
## 356        1    0.62363
## 358        1    0.27950
## 362        0    0.33464
## 363        0    0.00000
## 364        0    0.15891
## 366        1    1.00000
## 367        0    0.34456
## 368        1    0.33400
## 370        0    0.01575
## 374        0    0.49217
## 377        0    1.00000
## 378        0    0.02070
## 381        1    0.19143
## 383        1    1.00000
## 387        0    0.08962
## 390        1    1.00000
## 396        0    0.31155
## 406        0    0.30590
## 408        0    0.11272
## 410        1    0.00000
## 411        0    0.05726
## 413        0    0.06828
## 414        0    0.00000
## 421        0    0.00000
## 423        0    0.06749
## 424        0    0.06830
## 426        1    0.18397
## 428        0    0.15891
## 431        0    0.27187
## 432        0    0.00000
## 440        1    1.00000
## 442        0    0.06799
## 443        0    0.06802
## 445        0    0.00000
## 447        0    0.30886
## 448        0    0.06808
## 452        0    0.26608
## 454        0    0.26152
## 460        0    0.21073
## 461        0    0.17241
## 464        0    0.00000
## 472        0    0.00000
## 474        1    1.00000
## 475        0    0.06831
## 476        0    0.33967
## 480        0    0.00000
## 482        0    0.06812
## 489        0    0.05169
## 490        0    0.06830
## 492        0    0.00000
## 493        0    0.23700
## 495        0    0.00176
## 496        0    0.08534
## 500        0    0.00000
## 501        1    0.20445
## 504        0    0.00000
## 505        0    0.31007
## 506        1    1.00000
## 510        1    0.32074
## 511        0    0.14095
## 514        0    0.00000
## 526        0    0.20065
## 527        0    0.87756
## 528        0    0.05937
## 531        0    0.06833
## 532        0    0.06537
## 534        0    0.01721
## 536        0    0.00000
## 537        0    0.26123
## 540        0    0.00000
## 544        0    0.06831
## 545        1    0.50426
## 547        0    0.20623
## 548        0    0.20962
## 551        0    0.00210
## 552        0    0.00001
## 553        0    0.44622
## 554        1    0.15273
## 555        0    0.27114
## 559        0    0.43354
## 561        0    0.19143
## 563        1    0.04038
## 564        0    0.00043
## 565        0    0.26396
## 566        0    0.17424
## 567        1    0.00007
## 569        0    1.00000
## 571        0    0.06810
## 574        0    0.01608
## 575        1    0.33124
## 576        1    0.28365
## 577        0    0.36568
## 579        1    1.00000
## 581        1    0.06227
## 583        1    0.06833
## 584        0    0.20445
## 585        1    0.19300
## 587        0    0.05726
## 590        0    0.11272
## 591        0    0.00000
## 593        0    0.00822
## 595        1    0.44373
## 599        0    1.00000
## 600        0    0.06801
## 601        1    0.20461
## 602        0    0.17943
## 607        0    0.15795
## 608        0    0.34935
## 612        1    0.06832
## 614        0    0.03918
## 615        0    0.00001
## 617        0    0.06012
## 618        0    1.00000
## 620        1    0.38464
## 622        0    0.06260
## 628        1    0.33243
## 632        0    0.12936
## 640        0    0.00000
## 643        1    0.35810
## 645        0    0.16508
## 647        0    0.00000
## 648        0    0.39040
## 649        0    0.20170
## 650        0    0.00000
## 651        0    0.05566
## 652        0    0.01350
## 653        1    0.00000
## 657        1    0.05639
## 660        0    0.27671
## 661        1    1.00000
## 662        0    0.00000
## 668        0    0.18795
## 671        0    0.00000
## 674        1    0.05577
## 675        0    0.01606
## 676        0    0.00000
## 679        0    0.19955
## 681        0    1.00000
## 682        0    0.11169
## 683        0    0.18603
## 688        0    0.06830
## 691        1    0.05169
## 692        0    0.18397
## 693        1    1.00000
## 695        0    0.00021
## 696        0    0.06830
## 698        0    0.99996
## 699        1    0.35494
## 700        1    0.53325
## 702        0    0.50549
## 703        1    0.99989
## 708        0    0.11272
## 709        1    0.24540
## 719        1    0.40065
## 723        0    0.33273
## 726        0    0.06772
## 730        0    0.06833
## 733        1    1.00000
## 736        0    0.30192
## 738        1    0.29195
## 744        0    0.28612
## 745        0    0.06799
## 746        0    0.00000
## 750        0    0.19955
## 751        1    0.48809
## 753        0    0.06833
## 754        0    0.15357
## 757        0    0.00000
## 759        0    0.27301
## 763        1    0.87756
## 765        0    0.00489
## 766        0    0.06819
## 769        0    0.06830
## 770        1    0.03621
## 772        0    0.06830
## 775        0    0.00336
## 777        1    0.62363
## 779        0    0.04227
## 780        0    0.00000
## 783        0    0.22724
## 784        0    0.04976
## 787        0    0.00000
## 788        1    0.20461
## 792        0    0.00000
## 793        0    0.01735
## 795        0    0.19955
## 800        1    0.13039
roundedresults3 <- sapply(results3, round, digits = 0)
roundedresults3
##        DataAsIs Prediction
##   [1,]        0          0
##   [2,]        0          0
##   [3,]        0          0
##   [4,]        0          0
##   [5,]        0          1
##   [6,]        0          0
##   [7,]        1          1
##   [8,]        0          0
##   [9,]        0          0
##  [10,]        1          0
##  [11,]        1          0
##  [12,]        0          0
##  [13,]        0          0
##  [14,]        0          0
##  [15,]        0          0
##  [16,]        0          0
##  [17,]        1          0
##  [18,]        0          0
##  [19,]        0          0
##  [20,]        0          0
##  [21,]        0          0
##  [22,]        1          1
##  [23,]        0          0
##  [24,]        1          0
##  [25,]        1          0
##  [26,]        0          0
##  [27,]        0          0
##  [28,]        0          0
##  [29,]        0          0
##  [30,]        0          0
##  [31,]        0          0
##  [32,]        0          0
##  [33,]        0          0
##  [34,]        0          0
##  [35,]        0          0
##  [36,]        0          0
##  [37,]        0          0
##  [38,]        0          0
##  [39,]        0          0
##  [40,]        0          1
##  [41,]        1          0
##  [42,]        0          0
##  [43,]        0          0
##  [44,]        0          0
##  [45,]        0          0
##  [46,]        0          0
##  [47,]        0          0
##  [48,]        1          0
##  [49,]        0          0
##  [50,]        0          0
##  [51,]        0          0
##  [52,]        0          0
##  [53,]        0          0
##  [54,]        1          0
##  [55,]        0          0
##  [56,]        0          0
##  [57,]        0          0
##  [58,]        0          0
##  [59,]        1          0
##  [60,]        0          0
##  [61,]        0          0
##  [62,]        0          0
##  [63,]        0          0
##  [64,]        0          0
##  [65,]        0          0
##  [66,]        1          1
##  [67,]        0          0
##  [68,]        0          0
##  [69,]        1          0
##  [70,]        0          0
##  [71,]        0          1
##  [72,]        1          1
##  [73,]        1          1
##  [74,]        0          0
##  [75,]        1          1
##  [76,]        1          0
##  [77,]        1          1
##  [78,]        0          0
##  [79,]        1          0
##  [80,]        0          0
##  [81,]        0          1
##  [82,]        0          0
##  [83,]        0          0
##  [84,]        0          0
##  [85,]        1          1
##  [86,]        1          0
##  [87,]        0          1
##  [88,]        0          0
##  [89,]        0          0
##  [90,]        0          0
##  [91,]        1          0
##  [92,]        0          0
##  [93,]        1          0
##  [94,]        0          0
##  [95,]        0          0
##  [96,]        0          0
##  [97,]        0          0
##  [98,]        0          1
##  [99,]        0          0
## [100,]        0          0
## [101,]        1          0
## [102,]        0          0
## [103,]        0          0
## [104,]        0          0
## [105,]        0          0
## [106,]        0          0
## [107,]        1          0
## [108,]        0          0
## [109,]        1          0
## [110,]        1          0
## [111,]        0          0
## [112,]        1          0
## [113,]        1          0
## [114,]        0          0
## [115,]        0          0
## [116,]        0          0
## [117,]        0          1
## [118,]        1          0
## [119,]        0          0
## [120,]        1          1
## [121,]        0          0
## [122,]        0          0
## [123,]        0          1
## [124,]        0          0
## [125,]        1          0
## [126,]        1          1
## [127,]        0          0
## [128,]        0          0
## [129,]        0          0
## [130,]        1          1
## [131,]        1          0
## [132,]        0          0
## [133,]        0          0
## [134,]        1          1
## [135,]        1          0
## [136,]        0          0
## [137,]        0          0
## [138,]        0          0
## [139,]        1          1
## [140,]        0          0
## [141,]        1          0
## [142,]        0          0
## [143,]        0          0
## [144,]        0          1
## [145,]        0          0
## [146,]        1          0
## [147,]        1          1
## [148,]        0          0
## [149,]        1          1
## [150,]        0          0
## [151,]        0          0
## [152,]        0          0
## [153,]        1          0
## [154,]        0          0
## [155,]        0          0
## [156,]        0          0
## [157,]        0          0
## [158,]        0          0
## [159,]        0          0
## [160,]        1          0
## [161,]        0          0
## [162,]        0          0
## [163,]        0          0
## [164,]        1          1
## [165,]        0          0
## [166,]        0          0
## [167,]        0          0
## [168,]        0          0
## [169,]        0          0
## [170,]        0          0
## [171,]        0          0
## [172,]        0          0
## [173,]        0          0
## [174,]        0          0
## [175,]        0          0
## [176,]        1          1
## [177,]        0          0
## [178,]        0          0
## [179,]        0          0
## [180,]        0          0
## [181,]        0          0
## [182,]        0          0
## [183,]        0          0
## [184,]        0          0
## [185,]        0          0
## [186,]        0          0
## [187,]        0          0
## [188,]        1          0
## [189,]        0          0
## [190,]        0          0
## [191,]        1          1
## [192,]        1          0
## [193,]        0          0
## [194,]        0          0
## [195,]        0          0
## [196,]        0          1
## [197,]        0          0
## [198,]        0          0
## [199,]        0          0
## [200,]        0          0
## [201,]        0          0
## [202,]        0          0
## [203,]        0          0
## [204,]        0          0
## [205,]        1          1
## [206,]        0          0
## [207,]        0          0
## [208,]        0          0
## [209,]        0          0
## [210,]        0          0
## [211,]        1          0
## [212,]        0          0
## [213,]        0          0
## [214,]        0          0
## [215,]        1          0
## [216,]        0          0
## [217,]        0          0
## [218,]        0          0
## [219,]        1          0
## [220,]        0          1
## [221,]        0          0
## [222,]        0          0
## [223,]        1          0
## [224,]        1          0
## [225,]        0          0
## [226,]        1          1
## [227,]        1          0
## [228,]        1          0
## [229,]        0          0
## [230,]        1          0
## [231,]        0          0
## [232,]        0          0
## [233,]        0          0
## [234,]        0          0
## [235,]        1          0
## [236,]        0          1
## [237,]        0          0
## [238,]        1          0
## [239,]        0          0
## [240,]        0          0
## [241,]        0          0
## [242,]        1          0
## [243,]        0          0
## [244,]        0          0
## [245,]        0          0
## [246,]        0          1
## [247,]        1          0
## [248,]        0          0
## [249,]        1          0
## [250,]        0          0
## [251,]        0          0
## [252,]        1          0
## [253,]        0          0
## [254,]        0          0
## [255,]        0          0
## [256,]        0          0
## [257,]        0          0
## [258,]        0          0
## [259,]        0          0
## [260,]        1          0
## [261,]        1          0
## [262,]        0          0
## [263,]        1          1
## [264,]        0          0
## [265,]        0          0
## [266,]        0          0
## [267,]        1          0
## [268,]        0          0
## [269,]        0          0
## [270,]        0          0
## [271,]        0          1
## [272,]        0          0
## [273,]        0          0
## [274,]        0          0
## [275,]        1          0
## [276,]        0          0
## [277,]        1          1
## [278,]        0          0
## [279,]        0          0
## [280,]        0          1
## [281,]        1          0
## [282,]        1          1
## [283,]        0          1
## [284,]        1          1
## [285,]        0          0
## [286,]        1          0
## [287,]        1          0
## [288,]        0          0
## [289,]        0          0
## [290,]        0          0
## [291,]        1          1
## [292,]        0          0
## [293,]        1          0
## [294,]        0          0
## [295,]        0          0
## [296,]        0          0
## [297,]        0          0
## [298,]        1          0
## [299,]        0          0
## [300,]        0          0
## [301,]        0          0
## [302,]        0          0
## [303,]        1          1
## [304,]        0          0
## [305,]        0          0
## [306,]        0          0
## [307,]        1          0
## [308,]        0          0
## [309,]        0          0
## [310,]        1          1
## [311,]        0          0
## [312,]        0          0
## [313,]        0          0
## [314,]        0          0
## [315,]        0          0
## [316,]        1          0
## [317,]        0          0
## [318,]        0          0
## [319,]        0          0
## [320,]        1          0
Actual <- round(AdultsTest$Income_g50K, digits = 0)
Prediction <- round(output3$net.result, digits = 0)
mtab3 <- table(Actual, Prediction)
mtab3
##       Prediction
## Actual   0   1
##      0 220  16
##      1  57  27
# Load Library if not available
if(! "caret" %in% installed.packages()) { install.packages("caret", dependencies = TRUE) }
library(caret)

#Show Confusion Matrix
confusionMatrix(mtab3)
## Confusion Matrix and Statistics
## 
##       Prediction
## Actual   0   1
##      0 220  16
##      1  57  27
##                                         
##                Accuracy : 0.772         
##                  95% CI : (0.722, 0.817)
##     No Information Rate : 0.866         
##     P-Value [Acc > NIR] : 1             
##                                         
##                   Kappa : 0.301         
##                                         
##  Mcnemar's Test P-Value : 2.85e-06      
##                                         
##             Sensitivity : 0.794         
##             Specificity : 0.628         
##          Pos Pred Value : 0.932         
##          Neg Pred Value : 0.321         
##              Prevalence : 0.866         
##          Detection Rate : 0.688         
##    Detection Prevalence : 0.738         
##       Balanced Accuracy : 0.711         
##                                         
##        'Positive' Class : 0             
##