Zastosowanie pakietu R w statystyce medycznej

LABORATORIUM 10

Podczas zajêæ bêd± wykorzystywane pakiety HMisc, MASS, car, caret, PPROC oraz ROCit.


Przygotowanie danych

Najwa¿niejsz± ró¿nic± pomiêdzy zbiorami treningowymi, a surowymi danymi, które analizuje siê w pracy naukowej jest to, ¿e te drugie najczê¶ciej nie s± w formacie gotowym do wczytania i analizy. Przygotowanie danych do pracy mo¿e zajmowaæ nawet wiêcej czasu ni¿ sama analiza. Jednym z najczê¶ciej wystêpuj±cych problemów s± brakuj±ce obserwacje. W pakiecie R s± one oznaczane symbolem NA. Aby sprawdziæ czy nasze dane zawieraj± brakuj±ce obserwacje nale¿y pos³u¿yæ siê funkcj± is.na().

# Przyk³ad 10.1
v <- c(2,-5,NA,3.5,NA)
is.na(v)
## [1] FALSE FALSE  TRUE FALSE  TRUE
which(is.na(v))
## [1] 3 5
df <- data.frame(a=1:5, b=c("jeden","dwa","trzy",NA,"piêæ"),c=v); df
##   a     b    c
## 1 1 jeden  2.0
## 2 2   dwa -5.0
## 3 3  trzy   NA
## 4 4  <NA>  3.5
## 5 5  piêæ   NA
is.na(df)
##          a     b     c
## [1,] FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE
## [3,] FALSE FALSE  TRUE
## [4,] FALSE  TRUE FALSE
## [5,] FALSE FALSE  TRUE

Brakuj±ce obserwacje z wektora mo¿na usun±æ funkcj± na.omit(), natomiast do usuniêcia wierszy zawieraj±cych brakuj±ce obserwacje z ramki danych s³u¿y funkcja complete.cases().

# Przyk³ad 10.2
w <- na.omit(v); w
## [1]  2.0 -5.0  3.5
## attr(,"na.action")
## [1] 3 5
## attr(,"class")
## [1] "omit"
df2 <- df[complete.cases(df),]; df2
##   a     b  c
## 1 1 jeden  2
## 2 2   dwa -5

Usuniêcie wierszy zawieraj±cych brakuj±ce obserwacje jest najprostszym rozwi±zaniem problemu, ale na pewno nie najlepszym. W wielu przypadkach po odsianiu takich wierszy zbiór danych mo¿e zmaleæ o kilkadziesi±t procent. Zamiast usuwaæ ca³e wiersze, zaleca siê aby w miejsce brakuj±cych pomiarów wstawiaæ (imputowaæ) sztuczne pomiary. Mo¿na do tego wykorzystaæ funkcjê inpute() z biblioteki Hmisc.

# Przyk³ad 10.3
library(Hmisc)
wekt <- c(4,2,NA,1,1,1,NA,5)
impute(wekt, median)
##    1    2    3    4    5    6    7    8 
##  4.0  2.0 1.5*  1.0  1.0  1.0 1.5*  5.0
impute(wekt, mean)
##         1         2         3         4         5         6         7 
##  4.000000  2.000000 2.333333*  1.000000  1.000000  1.000000 2.333333* 
##         8 
##  5.000000
impute(wekt, "random")
##  1  2  3  4  5  6  7  8 
##  4  2 2*  1  1  1 1*  5
impute(wekt, 0)
##  1  2  3  4  5  6  7  8 
##  4  2 0*  1  1  1 0*  5
Skalowanie i transformacje danych

Skalowanie polega na odjêciu od ka¿dej obserwacji ¶redniej i podzieleniu przez odchylenie standardowe z próby. W pakiecie R s³u¿y do tego funkcja scale(), przy czym za pomoc± parametrów center=TRUE/FALSE i scale=TRUE/FALSE mo¿na decydowaæ czy odejmowaæ warto¶æ ¶redni± i czy dzieliæ przez odchylenie standardowe.

# Przyk³ad 10.4
x <- rnorm(100, mean=3, sd=2)
x.scaled <- scale(x)
mean(x.scaled)
## [1] -6.125249e-17
sd(x.scaled)
## [1] 1

Inn± bardzo przydatn± funkcj± jest transform(), która umo¿liwia transformacje wybranych zmiennych w ramce danych przy pomocy jednej komendy. Przetransformowane zmienne s± dodawane do ramki jako nowe kolumny.

# Przyk³ad 10.5
dane <- read.csv2("http://www.biecek.pl/R/dane/dane0.csv")
dane.trans <- transform(dane, logVEGF = log(VEGF), fNowotwor = factor(Nowotwor), cutWiek = cut(Wiek,4))
head(dane.trans)
##   Wiek Rozmiar.guza Wezly.chlonne Nowotwor Receptory.estrogenowe
## 1   29            1             0        2                   (-)
## 2   29            1             0        2                  (++)
## 3   30            1             1        2                   (-)
## 4   32            1             0        3                  (++)
## 5   32            2             0       NA                   (-)
## 6   33            1             1        3                   (-)
##   Receptory.progesteronowe Niepowodzenia Okres.bez.wznowy VEGF  logVEGF
## 1                     (++)          brak               22  914 6.817831
## 2                     (++)          brak               53 1118 7.019297
## 3                      (+)          brak               38  630 6.445720
## 4                     (++)          brak               26 1793 7.491645
## 5                     (++)          brak               19  963 6.870053
## 6                     (++)        wznowa               36 2776 7.928766
##   fNowotwor cutWiek
## 1         2 (29,36]
## 2         2 (29,36]
## 3         2 (29,36]
## 4         3 (29,36]
## 5      <NA> (29,36]
## 6         3 (29,36]


Skuteczno¶æ klasyfikatora

Aby oszacowaæ skuteczno¶æ danego klasyfikatora (modelu predykcyjnego) niezbêdna jest do tego próba testowa, która powinna byæ rozdzielna z prób± ucz±c±. Przepuszczamy obserwacje z próby testowej przez model i odczytujemy przewidziane klasy dla tych obserwacji, a nastêpnie porównujemy je z rzeczywistymi klasami. W ten sposób mo¿emy skontruowaæ macierz pomy³ek (confusion matrix), której pola maj± nazwy jak na rysunku poni¿ej (numenklatura jest zwi±zana z testami medycznymi, maj±cymi na celu okre¶lenie nosicielstwa danej choroby).

sklasyfikowani jako CHORZY sklasyfikowani jako ZDROWI
faktycznie CHORZY TRUE POSITIVE (TP) FALSE NEGATIVE (FN)
faktycznie ZDROWI FALSE POSITIVE (FP) TRUE NEGATIVE (TN)

Wszystkie \(n=P+N\) przypadki dziel± siê na osobników chorych \(P=TP+FN\) i zdrowych \(N=TN+FP\). Na podstawie macierzy pomy³ek mo¿na zdefiniowaæ nastêpuj±ce wielko¶ci pomocne w porównywaniu klasyfikatorów:

\(\qquad TPR = \frac{TP}{P}\),

\(\qquad TNR = \frac{TN}{N}\),

\(\qquad PPV = \frac{TP}{TP+FP}\),

\(\qquad NPV = \frac{TN}{TN+FN}\)

\(\qquad ACC = \frac{TN + TP}{n}\),

\(\qquad F_1 = \frac{2 \cdot PPV \cdot TPR}{PPV + TPR} = \frac{2 TP}{2TP + FP + FN}\).

Dok³adno¶æ okre¶la na ile dobrze algorytm przewiduje dowoln± klasê. Czu³o¶æ i specyficzno¶æ s± prawdopodobieñstwami warunkowymi dobrej klasyfikacji, pod warunkiem, ¿e obiekt faktycznie nale¿y do danej klasy. Maj± one szczególne znaczenie, je¶li rozk³ad liczebno¶ci klas jest nierówny. Dla przyk³adu obliczmy powy¿sze miary dla modelu regresji logistycznej dla zbioru danych Pima z biblioteki MASS.

# Przyk³ad 10.6
library(MASS)
# Regresja liniowa oparta o statystycznie istotne czynniki: glu i ped
pima.lr <- glm(type~glu+ped, data=Pima.tr, family = binomial(link = "logit"))
# Predykcja
pima.predict <- predict(pima.lr, newdata = Pima.te, type = "response")
pima.result <- ifelse(pima.predict>0.50, "Yes", "No")
pima.true <- Pima.te[,8]
# Macierz pomy³ek
pima.cm <- table(pima.true,pima.result); pima.cm
##          pima.result
## pima.true  No Yes
##       No  205  18
##       Yes  50  59
TN <- pima.cm[1,1]
TP <- pima.cm[2,2]
FP <- pima.cm[1,2]
FN <- pima.cm[2,1]
P <- TP+FN
N <- TN+FP
# Czu³o¶æ
TP/P
## [1] 0.5412844
# Specyficzno¶æ
TN/N
## [1] 0.9192825
# Precyzja
TP/(TP+FP)
## [1] 0.7662338
# Warto¶æ predykcyjna ujemna
TN/(TN+FN)
## [1] 0.8039216
# Dok³adno¶æ
(TN+TP)/sum(pima.cm)
## [1] 0.7951807
# Miara F1
2*TP/(2*TP+FP+FN)
## [1] 0.6344086

Szybszym sposobem na policzenie powy¿szych warto¶ci jest skorzystanie z funkcji confusionMatrix() z biblioteki caret. Argumentami tej funkcji mo¿e byæ zarówno macierz wspó³wystêpowania zwracana przez funkcjê table jak i wektory przynale¿no¶ci do klas (przewidywane i rzeczywiste).

# Przyk³ad 10.7
library(caret)
pima.conf <- confusionMatrix(as.factor(pima.result),pima.true, positive = "Yes"); pima.conf
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  205  50
##        Yes  18  59
##                                           
##                Accuracy : 0.7952          
##                  95% CI : (0.7477, 0.8373)
##     No Information Rate : 0.6717          
##     P-Value [Acc > NIR] : 4.282e-07       
##                                           
##                   Kappa : 0.4979          
##                                           
##  Mcnemar's Test P-Value : 0.0001704       
##                                           
##             Sensitivity : 0.5413          
##             Specificity : 0.9193          
##          Pos Pred Value : 0.7662          
##          Neg Pred Value : 0.8039          
##              Prevalence : 0.3283          
##          Detection Rate : 0.1777          
##    Detection Prevalence : 0.2319          
##       Balanced Accuracy : 0.7303          
##                                           
##        'Positive' Class : Yes             
## 

Powy¿sza funkcja zwraca równie¿ przedzia³y ufno¶ci dla dok³adno¶ci i testuje hipotezê statystyczn± czy dok³adno¶æ jest wiêksza ni¿ "no information rate", który jest równy procentowemu udzia³owi liczniejszej klasy. Miara F1 nie jest domy¶lnie pokazana i trzeba siê do niej dostaæ przez pole byClass.

pima.conf$byClass
##          Sensitivity          Specificity       Pos Pred Value 
##            0.5412844            0.9192825            0.7662338 
##       Neg Pred Value            Precision               Recall 
##            0.8039216            0.7662338            0.5412844 
##                   F1           Prevalence       Detection Rate 
##            0.6344086            0.3283133            0.1777108 
## Detection Prevalence    Balanced Accuracy 
##            0.2319277            0.7302835
Krzywa ROC (Receiver Operating Characteristic)

W powy¿szym przyk³adzie za³o¿yli¶my, ¿e progiem prawdopodobieñstwa, od którego uznajemy osobnika za diabetyka jest 0.5. W³a¶ciwszym podej¶ciem by³oby przetestowanie wielu progów i zbadanie czu³o¶ci i specyficzno¶ci dla ka¿dego z progów. Przy pomocy funkcji sapply mo¿na policzyæ macierz pomy³ek dla dowolnej liczby progów, przy czym próg 0.04 jest minimalny, przy którym wystêpuj± obie klasy.

# Przyk³ad 10.8
progi <- seq(0.04,0.99,0.01)
roc <- sapply(progi, function(p)
  confusionMatrix(as.factor(ifelse(pima.predict>p, "Yes", "No")), pima.true, positive = "Yes")$byClass[c("Sensitivity","Specificity")])
plot(1-roc["Specificity",], roc["Sensitivity",], xlab="1-specyficzno¶æ", ylab="czu³o¶æ", main="ROC", type = "l")

Powy¿sza krzywa nosi nazwê ROC (Receiver Operating Characteristic) i ilustruje ona jako¶æ klasyfikatora. Optymalny punkt podzia³u to ten, który maksymalizuje Indeks Youdena, dany wzorem \(YI = TPR + TNR - 1\). Istnieje wiele bibliotek, które s³u¿± pomoc± przy wykre¶laniu krzywej ROC, a nawet obliczaj± optymalny punkt podzia³u i AUC (Area Under Curve), czyli pole pod wykresem krzywej ROC.

# Przyk³ad 10.9
library(PRROC)
pima.true <- ifelse(Pima.te[,8]=="Yes", 1, 0)
prroc.obj <- roc.curve(scores.class0 = pima.predict, weights.class0 = pima.true, curve=TRUE)
plot(prroc.obj)

library(ROCit)
rocit.obj <- rocit(score=pima.predict,class=Pima.te[,8])
summary(rocit.obj)
##                                       
##  Empirical ROC curve                  
##  Number of postive responses :  109   
##  Number of negative responses :  223  
##  Area under curve :  0.824453861027687
plot(rocit.obj)

Niestety maksymalny Indeks Youdena nie jest przechowywany w obiekcie rocit, ale mo¿emy ³atwo go obliczyæ.

best.yi.index <- which.max(rocit.obj$TPR-rocit.obj$FPR)
best.cutoff <- rocit.obj$Cutoff[best.yi.index]
best.tpr <- rocit.obj$TPR[best.yi.index]
best.fpr <- rocit.obj$FPR[best.yi.index]
sprintf("Best Cutoff = %.2f (TPR = %.3f, FPR = %.3f)", best.cutoff, best.tpr, best.fpr)
## [1] "Best Cutoff = 0.23 (TPR = 0.862, FPR = 0.359)"


Walidacja krzy¿owa

Klasyczna walidacja modelu polega na podzieleniu zbioru danych na dwa roz³±czne podzbiory: zbiór ucz±cy i zbiór treningowy. Podzia³ ten mo¿na w prosty sposób wykonaæ przy pomocy funkcji createDataPartition() z biblioteki caret.

# Przyk³ad 10.10
data("swiss")
# Dane dotycz± p³odno¶ci w 47 prowincjach Szwajcarii w roku 1888
head(swiss)
##              Fertility Agriculture Examination Education Catholic
## Courtelary        80.2        17.0          15        12     9.96
## Delemont          83.1        45.1           6         9    84.84
## Franches-Mnt      92.5        39.7           5         5    93.40
## Moutier           85.8        36.5          12         7    33.77
## Neuveville        76.9        43.5          17        15     5.16
## Porrentruy        76.1        35.3           9         7    90.57
##              Infant.Mortality
## Courtelary               22.2
## Delemont                 22.2
## Franches-Mnt             20.2
## Moutier                  20.3
## Neuveville               20.6
## Porrentruy               26.6
set.seed(123) # Ustawiamy ziarno generatora liczb losowych
swiss.samples <- createDataPartition(swiss$Fertility, p = 0.8, list = FALSE)
swiss.train <- swiss[swiss.samples,]
swiss.test <- swiss[-swiss.samples,]
swiss.lm <- lm(Fertility ~., data = swiss.train)
swiss.predict <- predict(swiss.lm, newdata=swiss.test)
data.frame(R2 = R2(swiss.predict, swiss.test$Fertility),
           RMSE = RMSE(swiss.predict, swiss.test$Fertility),
           MAE = MAE(swiss.predict, swiss.test$Fertility))
##          R2     RMSE      MAE
## 1 0.5946201 6.410914 5.651552

W powy¿szym przyk³adzie wykorzystali¶my trzy miary oszacowania b³êdu: wspó³czynnik \(R^2\), pierwiastek b³êdu ¶redniokwadratowego (RMSE, Root Mean Squared Error) oraz ¶redni b³±d bezwglêdny (MAE, Mean Absolute Error). Je¶li dysponujemy bardzo du¿ym zbiorem danych, klasyczna walidacja powinna byæ wystarczaj±ca do oszacowania skuteczno¶ci modelu. Je¶li jednak zebranych danych nie jest wiele, ka¿da obserwacja jest cenna i mo¿e wp³yn±æ na charakterystykê modelu i dlatego wy³±czanie czê¶ci obserwacji ze zbioru treningowego nie jest wskazane. W takich sytuacjach stosuje siê walidacjê krzy¿ow± (ang. cross validation) w jednej z czterech odmian:

  1. Bootstrap - polega na generowaniu wielu podzbiorów testowych poprzez losowanie ze zwracaniem z oryginalnego zbioru. Zwykle generuje siê setki lub tysi±ce takich podzbiorów i dla ka¿dego liczy siê skuteczno¶æ modelu. Wynik koñcowy jest u¶rednieniem (lub inn± funkcj±) wszystkich obliczonych skuteczno¶ci.

  2. Leave one out cross validation (LOOCV) - polega na wybraniu tylko jednej obserwacji do zbioru testowego. Pozosta³e obserwacje s± wykorzystywane do wytrenowania modelu. Operacja ta jest powtórzona dla wszystkich obserwacji ze zbioru, a koñcowa skuteczno¶æ jest ¶redni± wszystkich obliczonych skuteczno¶ci.

  3. K-krotna walidacja krzy¿owa (CV, K-fold cross validation) - dzielimy zbiór danych na K losowych podzbiorów, nastêpnie uczymy i testujemy model K razy, za ka¿dym razem wybieraj±c inny podzbiór jako próbê testow±, a pozosta³e jako próbê ucz±c±.

  4. K-krotna walidacja krzy¿owa z potwórzeniami (RCV, Repeated K-fold cross validation) - polega na wielokrotnym wykonaniu K-krotnej walidacji krzy¿owej, przy czym za ka¿dym razem losuje siê inne K podzbiory.

W bibliotece caret jest zaimplementowana funkcja train() bêd±ca wrapperem do ponad dwustu ró¿nych modeli statystycznych i pozwalaj±ca na wykonanie walidacji krzy¿owej w ³atwy sposób.

# Przyk³ad 10.11
library(caret)
# Wypisanie modeli kompatybilnych z funkcj± train()
names(getModelInfo())
##   [1] "ada"                 "AdaBag"              "AdaBoost.M1"        
##   [4] "adaboost"            "amdai"               "ANFIS"              
##   [7] "avNNet"              "awnb"                "awtan"              
##  [10] "bag"                 "bagEarth"            "bagEarthGCV"        
##  [13] "bagFDA"              "bagFDAGCV"           "bam"                
##  [16] "bartMachine"         "bayesglm"            "binda"              
##  [19] "blackboost"          "blasso"              "blassoAveraged"     
##  [22] "bridge"              "brnn"                "BstLm"              
##  [25] "bstSm"               "bstTree"             "C5.0"               
##  [28] "C5.0Cost"            "C5.0Rules"           "C5.0Tree"           
##  [31] "cforest"             "chaid"               "CSimca"             
##  [34] "ctree"               "ctree2"              "cubist"             
##  [37] "dda"                 "deepboost"           "DENFIS"             
##  [40] "dnn"                 "dwdLinear"           "dwdPoly"            
##  [43] "dwdRadial"           "earth"               "elm"                
##  [46] "enet"                "evtree"              "extraTrees"         
##  [49] "fda"                 "FH.GBML"             "FIR.DM"             
##  [52] "foba"                "FRBCS.CHI"           "FRBCS.W"            
##  [55] "FS.HGD"              "gam"                 "gamboost"           
##  [58] "gamLoess"            "gamSpline"           "gaussprLinear"      
##  [61] "gaussprPoly"         "gaussprRadial"       "gbm_h2o"            
##  [64] "gbm"                 "gcvEarth"            "GFS.FR.MOGUL"       
##  [67] "GFS.LT.RS"           "GFS.THRIFT"          "glm.nb"             
##  [70] "glm"                 "glmboost"            "glmnet_h2o"         
##  [73] "glmnet"              "glmStepAIC"          "gpls"               
##  [76] "hda"                 "hdda"                "hdrda"              
##  [79] "HYFIS"               "icr"                 "J48"                
##  [82] "JRip"                "kernelpls"           "kknn"               
##  [85] "knn"                 "krlsPoly"            "krlsRadial"         
##  [88] "lars"                "lars2"               "lasso"              
##  [91] "lda"                 "lda2"                "leapBackward"       
##  [94] "leapForward"         "leapSeq"             "Linda"              
##  [97] "lm"                  "lmStepAIC"           "LMT"                
## [100] "loclda"              "logicBag"            "LogitBoost"         
## [103] "logreg"              "lssvmLinear"         "lssvmPoly"          
## [106] "lssvmRadial"         "lvq"                 "M5"                 
## [109] "M5Rules"             "manb"                "mda"                
## [112] "Mlda"                "mlp"                 "mlpKerasDecay"      
## [115] "mlpKerasDecayCost"   "mlpKerasDropout"     "mlpKerasDropoutCost"
## [118] "mlpML"               "mlpSGD"              "mlpWeightDecay"     
## [121] "mlpWeightDecayML"    "monmlp"              "msaenet"            
## [124] "multinom"            "mxnet"               "mxnetAdam"          
## [127] "naive_bayes"         "nb"                  "nbDiscrete"         
## [130] "nbSearch"            "neuralnet"           "nnet"               
## [133] "nnls"                "nodeHarvest"         "null"               
## [136] "OneR"                "ordinalNet"          "ordinalRF"          
## [139] "ORFlog"              "ORFpls"              "ORFridge"           
## [142] "ORFsvm"              "ownn"                "pam"                
## [145] "parRF"               "PART"                "partDSA"            
## [148] "pcaNNet"             "pcr"                 "pda"                
## [151] "pda2"                "penalized"           "PenalizedLDA"       
## [154] "plr"                 "pls"                 "plsRglm"            
## [157] "polr"                "ppr"                 "PRIM"               
## [160] "protoclass"          "qda"                 "QdaCov"             
## [163] "qrf"                 "qrnn"                "randomGLM"          
## [166] "ranger"              "rbf"                 "rbfDDA"             
## [169] "Rborist"             "rda"                 "regLogistic"        
## [172] "relaxo"              "rf"                  "rFerns"             
## [175] "RFlda"               "rfRules"             "ridge"              
## [178] "rlda"                "rlm"                 "rmda"               
## [181] "rocc"                "rotationForest"      "rotationForestCp"   
## [184] "rpart"               "rpart1SE"            "rpart2"             
## [187] "rpartCost"           "rpartScore"          "rqlasso"            
## [190] "rqnc"                "RRF"                 "RRFglobal"          
## [193] "rrlda"               "RSimca"              "rvmLinear"          
## [196] "rvmPoly"             "rvmRadial"           "SBC"                
## [199] "sda"                 "sdwd"                "simpls"             
## [202] "SLAVE"               "slda"                "smda"               
## [205] "snn"                 "sparseLDA"           "spikeslab"          
## [208] "spls"                "stepLDA"             "stepQDA"            
## [211] "superpc"             "svmBoundrangeString" "svmExpoString"      
## [214] "svmLinear"           "svmLinear2"          "svmLinear3"         
## [217] "svmLinearWeights"    "svmLinearWeights2"   "svmPoly"            
## [220] "svmRadial"           "svmRadialCost"       "svmRadialSigma"     
## [223] "svmRadialWeights"    "svmSpectrumString"   "tan"                
## [226] "tanSearch"           "treebag"             "vbmpRadial"         
## [229] "vglmAdjCat"          "vglmContRatio"       "vglmCumulative"     
## [232] "widekernelpls"       "WM"                  "wsrf"               
## [235] "xgbDART"             "xgbLinear"           "xgbTree"            
## [238] "xyf"
# Bootstrap
train.control <- trainControl(method="boot", number=100)
swiss.boot <- train(Fertility ~ ., data = swiss, method = "lm", trControl = train.control)
print(swiss.boot)
## Linear Regression 
## 
## 47 samples
##  5 predictors
## 
## No pre-processing
## Resampling: Bootstrapped (100 reps) 
## Summary of sample sizes: 47, 47, 47, 47, 47, 47, ... 
## Resampling results:
## 
##   RMSE      Rsquared   MAE     
##   8.437493  0.5887206  6.772303
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
# Leave one out cross validation (LOOCV)
train.control <- trainControl(method = "LOOCV")
swiss.loocv <- train(Fertility ~ ., data = swiss, method = "lm", trControl = train.control)
print(swiss.loocv)
## Linear Regression 
## 
## 47 samples
##  5 predictors
## 
## No pre-processing
## Resampling: Leave-One-Out Cross-Validation 
## Summary of sample sizes: 46, 46, 46, 46, 46, 46, ... 
## Resampling results:
## 
##   RMSE      Rsquared   MAE     
##   7.738618  0.6128307  6.116021
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
# 10-krotna walidacja krzy¿owa
train.control <- trainControl(method = "cv", number=10)
swiss.cv <- train(Fertility ~ ., data = swiss, method = "lm", trControl = train.control)
print(swiss.cv)
## Linear Regression 
## 
## 47 samples
##  5 predictors
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 42, 42, 42, 43, 44, 42, ... 
## Resampling results:
## 
##   RMSE      Rsquared   MAE    
##   7.250739  0.6888443  6.10417
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
# 10-krotna walidacja krzy¿owa powtórzona 3 razy
train.control <- trainControl(method = "repeatedcv", number=10, repeats=3)
swiss.repeatedcv <- train(Fertility ~ ., data = swiss, method = "lm", trControl = train.control)
print(swiss.repeatedcv)
## Linear Regression 
## 
## 47 samples
##  5 predictors
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times) 
## Summary of sample sizes: 42, 43, 42, 43, 43, 42, ... 
## Resampling results:
## 
##   RMSE      Rsquared   MAE     
##   7.380158  0.6771845  6.139392
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE


Zadanie punktowane

Wczytaj zbiór danych Greene z biblioteki carData i zapoznaj siê z nim. Potraktuj zmienn± decision jako odpowied¼, a pozosta³e zmienne za wyj±tkiem kolumny success jako zmienne wyja¶niaj±ce. Podziel zbiór na podzbiór ucz±cy (75%) i treningowy (25%). Wykonaj regresjê logistyczn± a nastêpnie wykre¶l krzyw± ROC. Znajd¼ optymalny punkt podzia³u i wykonaj dla niego macierz pomy³ek oraz oblicz skuteczno¶æ klasyfikacji.


##                                       
##  Empirical ROC curve                  
##  Number of postive responses :  28    
##  Number of negative responses :  67   
##  Area under curve :  0.823560767590618

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction no yes
##        no  43   3
##        yes 24  25
##                                          
##                Accuracy : 0.7158         
##                  95% CI : (0.614, 0.8036)
##     No Information Rate : 0.7053         
##     P-Value [Acc > NIR] : 0.4613237      
##                                          
##                   Kappa : 0.4389         
##                                          
##  Mcnemar's Test P-Value : 0.0001186      
##                                          
##             Sensitivity : 0.8929         
##             Specificity : 0.6418         
##          Pos Pred Value : 0.5102         
##          Neg Pred Value : 0.9348         
##              Prevalence : 0.2947         
##          Detection Rate : 0.2632         
##    Detection Prevalence : 0.5158         
##       Balanced Accuracy : 0.7673         
##                                          
##        'Positive' Class : yes            
##