Import Data
data_df <- read.csv("/Users/User/Documents/PyClass/data/Prostate_Cancer.csv")
data_df
## id diagnosis_result radius texture perimeter area smoothness compactness
## 1 1 M 23 12 151 954 0.143 0.278
## 2 2 B 9 13 133 1326 0.143 0.079
## 3 3 M 21 27 130 1203 0.125 0.160
## 4 4 M 14 16 78 386 0.070 0.284
## 5 5 M 9 19 135 1297 0.141 0.133
## 6 6 B 25 25 83 477 0.128 0.170
## 7 7 M 16 26 120 1040 0.095 0.109
## 8 8 M 15 18 90 578 0.119 0.165
## 9 9 M 19 24 88 520 0.127 0.193
## 10 10 M 25 11 84 476 0.119 0.240
## 11 11 M 24 21 103 798 0.082 0.067
## 12 12 M 17 15 104 781 0.097 0.129
## 13 13 B 14 15 132 1123 0.097 0.246
## 14 14 M 12 22 104 783 0.084 0.100
## 15 15 M 12 13 94 578 0.113 0.229
## 16 16 M 22 19 97 659 0.114 0.160
## 17 17 M 10 16 95 685 0.099 0.072
## 18 18 M 15 14 108 799 0.117 0.202
## 19 19 M 20 14 130 1260 0.098 0.103
## 20 20 B 17 11 87 566 0.098 0.081
## 21 21 B 16 14 86 520 0.108 0.127
## 22 22 B 17 24 60 274 0.102 0.065
## 23 23 M 20 27 103 704 0.107 0.214
## 24 24 M 19 12 137 1404 0.094 0.102
## 25 25 M 9 13 110 905 0.112 0.146
## 26 26 M 19 27 116 913 0.119 0.228
## 27 27 M 10 24 97 645 0.105 0.187
## 28 28 M 16 24 122 1094 0.094 0.107
## 29 29 M 15 15 102 732 0.108 0.170
## 30 30 M 11 16 115 955 0.098 0.116
## 31 31 M 11 22 125 1088 0.106 0.189
## 32 32 M 23 26 78 441 0.111 0.152
## 33 33 M 20 18 113 899 0.120 0.150
## 34 34 M 11 21 128 1162 0.094 0.172
## 35 35 M 16 23 107 807 0.104 0.156
## 36 36 M 10 13 110 870 0.096 0.134
## 37 37 M 18 12 94 633 0.098 0.110
## 38 38 B 21 11 83 524 0.090 0.038
## 39 39 M 11 15 96 699 0.094 0.051
## 40 40 M 10 14 88 559 0.102 0.126
## 41 41 M 24 16 86 563 0.082 0.060
## 42 42 M 19 27 72 371 0.123 0.122
## 43 43 M 11 11 128 1104 0.091 0.219
## 44 44 M 15 21 87 545 0.104 0.144
## 45 45 M 10 15 85 532 0.097 0.105
## 46 46 M 18 11 124 1076 0.110 0.169
## 47 47 B 22 12 52 202 0.086 0.059
## 48 48 M 20 14 86 535 0.116 0.123
## 49 49 B 20 21 78 449 0.103 0.091
## 50 50 B 25 11 87 561 0.088 0.077
## 51 51 B 19 25 75 428 0.086 0.050
## 52 52 B 19 22 87 572 0.077 0.061
## 53 53 B 25 15 76 438 0.083 0.048
## 54 54 M 14 26 120 1033 0.115 0.149
## 55 55 M 18 25 97 713 0.091 0.071
## 56 56 B 18 13 73 409 0.095 0.055
## 57 57 M 10 19 126 1152 0.105 0.127
## 58 58 M 17 20 96 657 0.114 0.137
## 59 59 B 22 15 83 527 0.081 0.038
## 60 60 B 23 26 54 225 0.098 0.053
## 61 61 B 15 18 65 312 0.113 0.081
## 62 62 B 25 15 55 222 0.124 0.090
## 63 63 M 12 22 96 646 0.105 0.201
## 64 64 B 24 17 59 261 0.077 0.088
## 65 65 M 16 19 83 499 0.112 0.126
## 66 66 M 11 21 97 668 0.117 0.148
## 67 67 B 12 13 60 269 0.104 0.078
## 68 68 B 18 12 72 394 0.081 0.047
## 69 69 B 16 17 59 251 0.107 0.141
## 70 70 B 17 21 81 503 0.098 0.052
## 71 71 M 21 18 124 1130 0.090 0.103
## 72 72 B 9 26 59 244 0.098 0.153
## 73 73 M 21 12 114 929 0.107 0.183
## 74 74 M 22 25 90 584 0.101 0.128
## 75 75 B 18 13 79 471 0.092 0.068
## 76 76 M 21 18 104 818 0.092 0.084
## 77 77 B 10 17 88 559 0.129 0.105
## 78 78 M 11 21 120 1006 0.107 0.215
## 79 79 M 16 18 144 1245 0.129 0.345
## 80 80 B 22 16 83 506 0.099 0.095
## 81 81 B 10 18 74 402 0.110 0.094
## 82 82 B 17 21 86 520 0.108 0.154
## 83 83 M 10 15 172 1878 0.106 0.267
## 84 84 M 20 14 129 1132 0.122 0.179
## 85 85 B 25 21 77 443 0.097 0.072
## 86 86 M 14 13 121 1075 0.099 0.105
## 87 87 M 19 26 94 648 0.094 0.099
## 88 88 M 19 11 122 1076 0.090 0.121
## 89 89 B 11 11 80 466 0.088 0.094
## 90 90 B 12 23 96 652 0.113 0.134
## 91 91 B 23 27 95 663 0.090 0.086
## 92 92 M 10 12 100 728 0.092 0.104
## 93 93 B 14 14 85 552 0.074 0.051
## 94 94 B 10 17 87 555 0.102 0.082
## 95 95 M 22 26 100 706 0.104 0.155
## 96 96 M 23 16 132 1264 0.091 0.131
## 97 97 B 22 14 78 451 0.105 0.071
## 98 98 B 19 27 62 295 0.102 0.053
## 99 99 B 21 24 74 413 0.090 0.075
## 100 100 M 16 27 94 643 0.098 0.114
## symmetry fractal_dimension
## 1 0.242 0.079
## 2 0.181 0.057
## 3 0.207 0.060
## 4 0.260 0.097
## 5 0.181 0.059
## 6 0.209 0.076
## 7 0.179 0.057
## 8 0.220 0.075
## 9 0.235 0.074
## 10 0.203 0.082
## 11 0.153 0.057
## 12 0.184 0.061
## 13 0.240 0.078
## 14 0.185 0.053
## 15 0.207 0.077
## 16 0.230 0.071
## 17 0.159 0.059
## 18 0.216 0.074
## 19 0.158 0.054
## 20 0.189 0.058
## 21 0.197 0.068
## 22 0.182 0.069
## 23 0.252 0.070
## 24 0.177 0.053
## 25 0.200 0.063
## 26 0.304 0.074
## 27 0.225 0.069
## 28 0.170 0.057
## 29 0.193 0.065
## 30 0.174 0.061
## 31 0.218 0.062
## 32 0.230 0.078
## 33 0.225 0.064
## 34 0.185 0.063
## 35 0.200 0.065
## 36 0.190 0.057
## 37 0.189 0.061
## 38 0.147 0.059
## 39 0.157 0.055
## 40 0.172 0.064
## 41 0.178 0.056
## 42 0.190 0.069
## 43 0.231 0.063
## 44 0.197 0.068
## 45 0.175 0.062
## 46 0.191 0.060
## 47 0.177 0.065
## 48 0.213 0.068
## 49 0.168 0.060
## 50 0.181 0.057
## 51 0.150 0.059
## 52 0.135 0.060
## 53 0.187 0.061
## 54 0.209 0.063
## 55 0.162 0.057
## 56 0.192 0.059
## 57 0.192 0.060
## 58 0.203 0.068
## 59 0.182 0.055
## 60 0.168 0.072
## 61 0.274 0.070
## 62 0.183 0.068
## 63 0.195 0.073
## 64 0.234 0.070
## 65 0.191 0.066
## 66 0.195 0.067
## 67 0.172 0.069
## 68 0.152 0.057
## 69 0.211 0.080
## 70 0.159 0.057
## 71 0.158 0.055
## 72 0.190 0.090
## 73 0.193 0.065
## 74 0.166 0.066
## 75 0.172 0.059
## 76 0.180 0.054
## 77 0.240 0.066
## 78 0.215 0.067
## 79 0.291 0.081
## 80 0.172 0.060
## 81 0.184 0.070
## 82 0.194 0.069
## 83 0.183 0.068
## 84 0.163 0.072
## 85 0.208 0.060
## 86 0.213 0.060
## 87 0.208 0.056
## 88 0.195 0.056
## 89 0.193 0.064
## 90 0.212 0.063
## 91 0.169 0.059
## 92 0.172 0.061
## 93 0.139 0.053
## 94 0.164 0.057
## 95 0.186 0.063
## 96 0.210 0.056
## 97 0.190 0.066
## 98 0.135 0.069
## 99 0.162 0.066
## 100 0.188 0.064
data_df <- data_df[,-1]
data_df
## diagnosis_result radius texture perimeter area smoothness compactness
## 1 M 23 12 151 954 0.143 0.278
## 2 B 9 13 133 1326 0.143 0.079
## 3 M 21 27 130 1203 0.125 0.160
## 4 M 14 16 78 386 0.070 0.284
## 5 M 9 19 135 1297 0.141 0.133
## 6 B 25 25 83 477 0.128 0.170
## 7 M 16 26 120 1040 0.095 0.109
## 8 M 15 18 90 578 0.119 0.165
## 9 M 19 24 88 520 0.127 0.193
## 10 M 25 11 84 476 0.119 0.240
## 11 M 24 21 103 798 0.082 0.067
## 12 M 17 15 104 781 0.097 0.129
## 13 B 14 15 132 1123 0.097 0.246
## 14 M 12 22 104 783 0.084 0.100
## 15 M 12 13 94 578 0.113 0.229
## 16 M 22 19 97 659 0.114 0.160
## 17 M 10 16 95 685 0.099 0.072
## 18 M 15 14 108 799 0.117 0.202
## 19 M 20 14 130 1260 0.098 0.103
## 20 B 17 11 87 566 0.098 0.081
## 21 B 16 14 86 520 0.108 0.127
## 22 B 17 24 60 274 0.102 0.065
## 23 M 20 27 103 704 0.107 0.214
## 24 M 19 12 137 1404 0.094 0.102
## 25 M 9 13 110 905 0.112 0.146
## 26 M 19 27 116 913 0.119 0.228
## 27 M 10 24 97 645 0.105 0.187
## 28 M 16 24 122 1094 0.094 0.107
## 29 M 15 15 102 732 0.108 0.170
## 30 M 11 16 115 955 0.098 0.116
## 31 M 11 22 125 1088 0.106 0.189
## 32 M 23 26 78 441 0.111 0.152
## 33 M 20 18 113 899 0.120 0.150
## 34 M 11 21 128 1162 0.094 0.172
## 35 M 16 23 107 807 0.104 0.156
## 36 M 10 13 110 870 0.096 0.134
## 37 M 18 12 94 633 0.098 0.110
## 38 B 21 11 83 524 0.090 0.038
## 39 M 11 15 96 699 0.094 0.051
## 40 M 10 14 88 559 0.102 0.126
## 41 M 24 16 86 563 0.082 0.060
## 42 M 19 27 72 371 0.123 0.122
## 43 M 11 11 128 1104 0.091 0.219
## 44 M 15 21 87 545 0.104 0.144
## 45 M 10 15 85 532 0.097 0.105
## 46 M 18 11 124 1076 0.110 0.169
## 47 B 22 12 52 202 0.086 0.059
## 48 M 20 14 86 535 0.116 0.123
## 49 B 20 21 78 449 0.103 0.091
## 50 B 25 11 87 561 0.088 0.077
## 51 B 19 25 75 428 0.086 0.050
## 52 B 19 22 87 572 0.077 0.061
## 53 B 25 15 76 438 0.083 0.048
## 54 M 14 26 120 1033 0.115 0.149
## 55 M 18 25 97 713 0.091 0.071
## 56 B 18 13 73 409 0.095 0.055
## 57 M 10 19 126 1152 0.105 0.127
## 58 M 17 20 96 657 0.114 0.137
## 59 B 22 15 83 527 0.081 0.038
## 60 B 23 26 54 225 0.098 0.053
## 61 B 15 18 65 312 0.113 0.081
## 62 B 25 15 55 222 0.124 0.090
## 63 M 12 22 96 646 0.105 0.201
## 64 B 24 17 59 261 0.077 0.088
## 65 M 16 19 83 499 0.112 0.126
## 66 M 11 21 97 668 0.117 0.148
## 67 B 12 13 60 269 0.104 0.078
## 68 B 18 12 72 394 0.081 0.047
## 69 B 16 17 59 251 0.107 0.141
## 70 B 17 21 81 503 0.098 0.052
## 71 M 21 18 124 1130 0.090 0.103
## 72 B 9 26 59 244 0.098 0.153
## 73 M 21 12 114 929 0.107 0.183
## 74 M 22 25 90 584 0.101 0.128
## 75 B 18 13 79 471 0.092 0.068
## 76 M 21 18 104 818 0.092 0.084
## 77 B 10 17 88 559 0.129 0.105
## 78 M 11 21 120 1006 0.107 0.215
## 79 M 16 18 144 1245 0.129 0.345
## 80 B 22 16 83 506 0.099 0.095
## 81 B 10 18 74 402 0.110 0.094
## 82 B 17 21 86 520 0.108 0.154
## 83 M 10 15 172 1878 0.106 0.267
## 84 M 20 14 129 1132 0.122 0.179
## 85 B 25 21 77 443 0.097 0.072
## 86 M 14 13 121 1075 0.099 0.105
## 87 M 19 26 94 648 0.094 0.099
## 88 M 19 11 122 1076 0.090 0.121
## 89 B 11 11 80 466 0.088 0.094
## 90 B 12 23 96 652 0.113 0.134
## 91 B 23 27 95 663 0.090 0.086
## 92 M 10 12 100 728 0.092 0.104
## 93 B 14 14 85 552 0.074 0.051
## 94 B 10 17 87 555 0.102 0.082
## 95 M 22 26 100 706 0.104 0.155
## 96 M 23 16 132 1264 0.091 0.131
## 97 B 22 14 78 451 0.105 0.071
## 98 B 19 27 62 295 0.102 0.053
## 99 B 21 24 74 413 0.090 0.075
## 100 M 16 27 94 643 0.098 0.114
## symmetry fractal_dimension
## 1 0.242 0.079
## 2 0.181 0.057
## 3 0.207 0.060
## 4 0.260 0.097
## 5 0.181 0.059
## 6 0.209 0.076
## 7 0.179 0.057
## 8 0.220 0.075
## 9 0.235 0.074
## 10 0.203 0.082
## 11 0.153 0.057
## 12 0.184 0.061
## 13 0.240 0.078
## 14 0.185 0.053
## 15 0.207 0.077
## 16 0.230 0.071
## 17 0.159 0.059
## 18 0.216 0.074
## 19 0.158 0.054
## 20 0.189 0.058
## 21 0.197 0.068
## 22 0.182 0.069
## 23 0.252 0.070
## 24 0.177 0.053
## 25 0.200 0.063
## 26 0.304 0.074
## 27 0.225 0.069
## 28 0.170 0.057
## 29 0.193 0.065
## 30 0.174 0.061
## 31 0.218 0.062
## 32 0.230 0.078
## 33 0.225 0.064
## 34 0.185 0.063
## 35 0.200 0.065
## 36 0.190 0.057
## 37 0.189 0.061
## 38 0.147 0.059
## 39 0.157 0.055
## 40 0.172 0.064
## 41 0.178 0.056
## 42 0.190 0.069
## 43 0.231 0.063
## 44 0.197 0.068
## 45 0.175 0.062
## 46 0.191 0.060
## 47 0.177 0.065
## 48 0.213 0.068
## 49 0.168 0.060
## 50 0.181 0.057
## 51 0.150 0.059
## 52 0.135 0.060
## 53 0.187 0.061
## 54 0.209 0.063
## 55 0.162 0.057
## 56 0.192 0.059
## 57 0.192 0.060
## 58 0.203 0.068
## 59 0.182 0.055
## 60 0.168 0.072
## 61 0.274 0.070
## 62 0.183 0.068
## 63 0.195 0.073
## 64 0.234 0.070
## 65 0.191 0.066
## 66 0.195 0.067
## 67 0.172 0.069
## 68 0.152 0.057
## 69 0.211 0.080
## 70 0.159 0.057
## 71 0.158 0.055
## 72 0.190 0.090
## 73 0.193 0.065
## 74 0.166 0.066
## 75 0.172 0.059
## 76 0.180 0.054
## 77 0.240 0.066
## 78 0.215 0.067
## 79 0.291 0.081
## 80 0.172 0.060
## 81 0.184 0.070
## 82 0.194 0.069
## 83 0.183 0.068
## 84 0.163 0.072
## 85 0.208 0.060
## 86 0.213 0.060
## 87 0.208 0.056
## 88 0.195 0.056
## 89 0.193 0.064
## 90 0.212 0.063
## 91 0.169 0.059
## 92 0.172 0.061
## 93 0.139 0.053
## 94 0.164 0.057
## 95 0.186 0.063
## 96 0.210 0.056
## 97 0.190 0.066
## 98 0.135 0.069
## 99 0.162 0.066
## 100 0.188 0.064
data_df$diagnosis_result <- as.factor(data_df$diagnosis_result)
X <- data_df[,-1]
y <- data_df[,1]
Packages
library(leaps)
library(MASS)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::select() masks MASS::select()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ISLR)
nloop <- 25
k <- ncol(X)
#predict.regsubsets = function(object, newdata, id, ...) {
# form = as.formula(object$call[[2]])
# mat = model.matrix(form, newdata)
# coefi = coef(object, id = id)
# mat[, names(coefi)] %*% coefi
#}
Best Subsets Regression
bs.rss <- data.frame(k = 1:8)
bs.adjr2 <- data.frame(k = 1:8)
bs.cp <- data.frame(k = 1:8)
bs.bic <- data.frame(k = 1:8)
for (i in 1:nloop){
sample <- sample(c(TRUE, FALSE), nrow(data_df), replace=TRUE, prob=c(0.8,0.2))
train <- data_df[sample, ]
test <- data_df[!sample, ]
bs.model <- regsubsets(diagnosis_result~., data = train, nvmax = k, method = "exhaustive")
#bs.pred <- predict(bs.model, test)
bs.sum <- summary(bs.model)
bs.rss[as.character(i)] <- bs.sum$rss
bs.adjr2[as.character(i)] <- bs.sum$adjr2
bs.cp[as.character(i)] <- bs.sum$cp
bs.bic[as.character(i)] <- bs.sum$bic
}
bs.rss$mean = rowMeans(bs.rss[,2:26])
bs.adjr2$mean = rowMeans(bs.adjr2[,2:26])
bs.cp$mean = rowMeans(bs.cp[,2:26])
bs.bic$mean = rowMeans(bs.bic[,2:26])
plotresult <- function(tab, cat, m){
if(m == "max") {
plot(x=1:nrow(tab), y=tab$mean, xlab='Numbers of k', ylab=cat, type='b', main=cat); points(x=which.max(tab$mean), y=max(tab$mean), col='red', pch=20); axis(1, at = seq(1,nrow(tab), by=1))
} else {
plot(x=1:nrow(tab), y=tab$mean, xlab='Numbers of k', ylab=cat, type='b', main=cat); points(x=which.min(tab$mean), y=min(tab$mean), col='red', pch=20); axis(1, at = seq(1,nrow(tab), by=1))
}
}
par(mfrow=c(2,2)); plotresult(bs.rss, "RSS", "min"); plotresult(bs.adjr2, "Adj R2", "max"); plotresult(bs.cp, "CP", "min"); plotresult(bs.bic, "BIC", "min")

Forward-Stepwise Regression
fw.rss <- data.frame(k = 1:8)
fw.adjr2 <- data.frame(k = 1:8)
fw.cp <- data.frame(k = 1:8)
fw.bic <- data.frame(k = 1:8)
for (i in 1:nloop){
sample <- sample(c(TRUE, FALSE), nrow(data_df), replace=TRUE, prob=c(0.8,0.2))
train <- data_df[sample, ]
test <- data_df[!sample, ]
fw.model <- regsubsets(diagnosis_result~., data = train, nvmax = k, method = "forward")
#fw.pred <- predict(fw.model, test)
fw.sum <- summary(fw.model)
fw.rss[as.character(i)] <- fw.sum$rss
fw.adjr2[as.character(i)] <- fw.sum$adjr2
fw.cp[as.character(i)] <- fw.sum$cp
fw.bic[as.character(i)] <- fw.sum$bic
}
fw.rss$mean = rowMeans(fw.rss[,2:26])
fw.adjr2$mean = rowMeans(fw.adjr2[,2:26])
fw.cp$mean = rowMeans(fw.cp[,2:26])
fw.bic$mean = rowMeans(fw.bic[,2:26])
par(mfrow=c(2,2)); plotresult(fw.rss, "RSS", "min"); plotresult(fw.adjr2, "Adj R2", "max"); plotresult(fw.cp, "CP", "min"); plotresult(fw.bic, "BIC", "min")

Backward-Stepwise Regression
bw.rss <- data.frame(k = 1:8)
bw.adjr2 <- data.frame(k = 1:8)
bw.cp <- data.frame(k = 1:8)
bw.bic <- data.frame(k = 1:8)
for (i in 1:nloop){
sample <- sample(c(TRUE, FALSE), nrow(data_df), replace=TRUE, prob=c(0.8,0.2))
train <- data_df[sample, ]
test <- data_df[!sample, ]
bw.model <- regsubsets(diagnosis_result~., data = train, nvmax = k, method = "backward")
#bw.pred <- predict(bw.model, test)
bw.sum <- summary(bw.model)
bw.rss[as.character(i)] <- bw.sum$rss
bw.adjr2[as.character(i)] <- bw.sum$adjr2
bw.cp[as.character(i)] <- bw.sum$cp
bw.bic[as.character(i)] <- bw.sum$bic
}
bw.rss$mean = rowMeans(bw.rss[,2:26])
bw.adjr2$mean = rowMeans(bw.adjr2[,2:26])
bw.cp$mean = rowMeans(bw.cp[,2:26])
bw.bic$mean = rowMeans(bw.bic[,2:26])
par(mfrow=c(2,2)); plotresult(bw.rss, "RSS", "min"); plotresult(bw.adjr2, "Adj R2", "max"); plotresult(bw.cp, "CP", "min"); plotresult(bw.bic, "BIC", "min")
