Caso práctico: Introducción al machine learning con R

#Caso práctico 1. Modelos supervisados. Regresión lineal y múltiple A partir del conjunto de datos Ovarian del paquete survival, haced un estudio de regresión lineal sobre un par de variables que, a priori, penséis que pueden presentar correlación, y un estudio de regresión múltiple seleccionando los mejores predictores.

#Cargamos los datos
library(survival)
data(ovarian)
## Warning in data(ovarian): data set 'ovarian' not found
head(ovarian)
##   futime fustat     age resid.ds rx ecog.ps
## 1     59      1 72.3315        2  1       1
## 2    115      1 74.4932        2  1       1
## 3    156      1 66.4658        2  1       2
## 4    421      0 53.3644        2  2       1
## 5    431      1 50.3397        2  1       1
## 6    448      0 56.4301        1  1       2
summary(ovarian)
##      futime           fustat            age           resid.ds    
##  Min.   :  59.0   Min.   :0.0000   Min.   :38.89   Min.   :1.000  
##  1st Qu.: 368.0   1st Qu.:0.0000   1st Qu.:50.17   1st Qu.:1.000  
##  Median : 476.0   Median :0.0000   Median :56.85   Median :2.000  
##  Mean   : 599.5   Mean   :0.4615   Mean   :56.17   Mean   :1.577  
##  3rd Qu.: 794.8   3rd Qu.:1.0000   3rd Qu.:62.38   3rd Qu.:2.000  
##  Max.   :1227.0   Max.   :1.0000   Max.   :74.50   Max.   :2.000  
##        rx         ecog.ps     
##  Min.   :1.0   Min.   :1.000  
##  1st Qu.:1.0   1st Qu.:1.000  
##  Median :1.5   Median :1.000  
##  Mean   :1.5   Mean   :1.462  
##  3rd Qu.:2.0   3rd Qu.:2.000  
##  Max.   :2.0   Max.   :2.000
#Vemos cuántas variables tienen los datos y cómo son
str(ovarian)
## 'data.frame':    26 obs. of  6 variables:
##  $ futime  : num  59 115 156 421 431 448 464 475 477 563 ...
##  $ fustat  : num  1 1 1 0 1 0 1 1 0 1 ...
##  $ age     : num  72.3 74.5 66.5 53.4 50.3 ...
##  $ resid.ds: num  2 2 2 2 2 1 2 2 2 1 ...
##  $ rx      : num  1 1 1 2 1 1 2 2 1 2 ...
##  $ ecog.ps : num  1 1 2 1 1 2 2 2 1 2 ...
#Observamos correlación entre variables
cor(x=ovarian, method="pearson")
##               futime     fustat         age    resid.ds          rx     ecog.ps
## futime    1.00000000 -0.6898795 -0.64836121 -0.38518677  0.24687108  0.01425371
## fustat   -0.68987946  1.0000000  0.49586611  0.32433749 -0.15430335  0.22619048
## age      -0.64836121  0.4958661  1.00000000  0.29339868  0.04372768  0.12927600
## resid.ds -0.38518677  0.3243375  0.29339868  1.00000000 -0.07784989 -0.14414999
## rx        0.24687108 -0.1543033  0.04372768 -0.07784989  1.00000000  0.00000000
## ecog.ps   0.01425371  0.2261905  0.12927600 -0.14414999  0.00000000  1.00000000
#Escogemos las variables futime y age y hacemos el modelo de regresión lineal
regmod<-lm(age~futime, data=ovarian)
summary(regmod)
## 
## Call:
## lm(formula = age ~ futime, data = ovarian)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -18.2440  -3.1173   0.5101   5.2789  15.5201 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 67.723641   3.169255  21.369  < 2e-16 ***
## futime      -0.019278   0.004621  -4.172 0.000341 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.848 on 24 degrees of freedom
## Multiple R-squared:  0.4204, Adjusted R-squared:  0.3962 
## F-statistic: 17.41 on 1 and 24 DF,  p-value: 0.0003408
lm(formula = age ~ futime, data = ovarian)
## 
## Call:
## lm(formula = age ~ futime, data = ovarian)
## 
## Coefficients:
## (Intercept)       futime  
##    67.72364     -0.01928
plot(ovarian$futime,ovarian$age, xlab="futime", ylab="age")
abline(regmod)

#Ahora haremos el modelo de regresión lineal múltiple
mrm_ovarian<-lm(ovarian$futime~ovarian$fustat+ovarian$age+ovarian$resid.ds+ovarian$rx+ovarian$ecog.ps, data=ovarian)
summary(mrm_ovarian)
## 
## Call:
## lm(formula = ovarian$futime ~ ovarian$fustat + ovarian$age + 
##     ovarian$resid.ds + ovarian$rx + ovarian$ecog.ps, data = ovarian)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -374.48 -103.23  -12.18   77.76  384.41 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      1276.931    327.157   3.903 0.000882 ***
## ovarian$fustat   -309.207    105.682  -2.926 0.008357 ** 
## ovarian$age       -14.373      5.083  -2.828 0.010401 *  
## ovarian$resid.ds  -48.136     95.331  -0.505 0.619126    
## ovarian$rx        125.638     87.254   1.440 0.165364    
## ovarian$ecog.ps   109.503     90.484   1.210 0.240315    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 217.3 on 20 degrees of freedom
## Multiple R-squared:  0.6727, Adjusted R-squared:  0.5909 
## F-statistic: 8.223 on 5 and 20 DF,  p-value: 0.0002355
#Seleccionamos los mejores predictores posibles
step(object=mrm_ovarian, direction="both",trace=1)
## Start:  AIC=285
## ovarian$futime ~ ovarian$fustat + ovarian$age + ovarian$resid.ds + 
##     ovarian$rx + ovarian$ecog.ps
## 
##                    Df Sum of Sq     RSS    AIC
## - ovarian$resid.ds  1     12034  956070 283.32
## - ovarian$ecog.ps   1     69130 1013166 284.83
## <none>                           944036 285.00
## - ovarian$rx        1     97865 1041901 285.56
## - ovarian$age       1    377400 1321436 291.74
## - ovarian$fustat    1    404069 1348105 292.26
## 
## Step:  AIC=283.32
## ovarian$futime ~ ovarian$fustat + ovarian$age + ovarian$rx + 
##     ovarian$ecog.ps
## 
##                    Df Sum of Sq     RSS    AIC
## <none>                           956070 283.32
## - ovarian$ecog.ps   1     88920 1044991 283.64
## - ovarian$rx        1    101328 1057398 283.94
## + ovarian$resid.ds  1     12034  944036 285.00
## - ovarian$age       1    414281 1370351 290.69
## - ovarian$fustat    1    467936 1424007 291.68
## 
## Call:
## lm(formula = ovarian$futime ~ ovarian$fustat + ovarian$age + 
##     ovarian$rx + ovarian$ecog.ps, data = ovarian)
## 
## Coefficients:
##     (Intercept)   ovarian$fustat      ovarian$age       ovarian$rx  
##         1213.26          -322.41           -14.82           127.70  
## ovarian$ecog.ps  
##          120.52
#Ejecutamos de nuevo el modelo con los predictores más significativos
mrm_ovarian_predictores<-(lm(ovarian$futime~ovarian$fustat+ovarian$age+ovarian$rx+ovarian$ecog.ps, data = ovarian))
summary(mrm_ovarian_predictores)
## 
## Call:
## lm(formula = ovarian$futime ~ ovarian$fustat + ovarian$age + 
##     ovarian$rx + ovarian$ecog.ps, data = ovarian)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -377.09  -94.77  -16.40   73.50  400.66 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     1213.263    296.477   4.092 0.000521 ***
## ovarian$fustat  -322.407    100.565  -3.206 0.004244 ** 
## ovarian$age      -14.824      4.914  -3.017 0.006568 ** 
## ovarian$rx       127.701     85.599   1.492 0.150606    
## ovarian$ecog.ps  120.524     86.240   1.398 0.176842    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 213.4 on 21 degrees of freedom
## Multiple R-squared:  0.6686, Adjusted R-squared:  0.6054 
## F-statistic: 10.59 on 4 and 21 DF,  p-value: 7.383e-05

#Caso práctico 2. Modelos aprendizaje automático y ANOVA A partir del conjunto de datos lung del paquete survival, se pide realizar un breve estudio aplicando los conceptos estudiados en este LAB. Para ello, se pide realizar un estudio de regresión lineal, regresión múltiple, test ANOVA y test clustering sobre dicho conjunto de datos. Las variables elegidas en cada uno de los casos posibles que tratar se dan a elegir al estudiante.

#Cargamos los datos
library(survival)
data(lung)
## Warning in data(lung): data set 'lung' not found
head(lung)
##   inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
## 1    3  306      2  74   1       1       90       100     1175      NA
## 2    3  455      2  68   1       0       90        90     1225      15
## 3    3 1010      1  56   1       0       90        90       NA      15
## 4    5  210      2  57   1       1       90        60     1150      11
## 5    1  883      2  60   1       0      100        90       NA       0
## 6   12 1022      1  74   1       1       50        80      513       0
#Vemos cuántas variables tienen los datos y cómo son
str(lung)
## 'data.frame':    228 obs. of  10 variables:
##  $ inst     : num  3 3 3 5 1 12 7 11 1 7 ...
##  $ time     : num  306 455 1010 210 883 ...
##  $ status   : num  2 2 1 2 2 1 2 2 2 2 ...
##  $ age      : num  74 68 56 57 60 74 68 71 53 61 ...
##  $ sex      : num  1 1 1 1 1 1 2 2 1 1 ...
##  $ ph.ecog  : num  1 0 0 1 0 1 2 2 1 2 ...
##  $ ph.karno : num  90 90 90 90 100 50 70 60 70 70 ...
##  $ pat.karno: num  100 90 90 60 90 80 60 80 80 70 ...
##  $ meal.cal : num  1175 1225 NA 1150 NA ...
##  $ wt.loss  : num  NA 15 15 11 0 0 10 1 16 34 ...
#Eliminamos los valores NA y hacemos resumen
data_lung=na.omit(lung)
summary(data_lung)
##       inst            time            status           age       
##  Min.   : 1.00   Min.   :   5.0   Min.   :1.000   Min.   :39.00  
##  1st Qu.: 3.00   1st Qu.: 174.5   1st Qu.:1.000   1st Qu.:57.00  
##  Median :11.00   Median : 268.0   Median :2.000   Median :64.00  
##  Mean   :10.71   Mean   : 309.9   Mean   :1.719   Mean   :62.57  
##  3rd Qu.:15.00   3rd Qu.: 419.5   3rd Qu.:2.000   3rd Qu.:70.00  
##  Max.   :32.00   Max.   :1022.0   Max.   :2.000   Max.   :82.00  
##       sex           ph.ecog          ph.karno        pat.karno     
##  Min.   :1.000   Min.   :0.0000   Min.   : 50.00   Min.   : 30.00  
##  1st Qu.:1.000   1st Qu.:0.0000   1st Qu.: 70.00   1st Qu.: 70.00  
##  Median :1.000   Median :1.0000   Median : 80.00   Median : 80.00  
##  Mean   :1.383   Mean   :0.9581   Mean   : 82.04   Mean   : 79.58  
##  3rd Qu.:2.000   3rd Qu.:1.0000   3rd Qu.: 90.00   3rd Qu.: 90.00  
##  Max.   :2.000   Max.   :3.0000   Max.   :100.00   Max.   :100.00  
##     meal.cal         wt.loss       
##  Min.   :  96.0   Min.   :-24.000  
##  1st Qu.: 619.0   1st Qu.:  0.000  
##  Median : 975.0   Median :  7.000  
##  Mean   : 929.1   Mean   :  9.719  
##  3rd Qu.:1162.5   3rd Qu.: 15.000  
##  Max.   :2600.0   Max.   : 68.000
str(data_lung)
## 'data.frame':    167 obs. of  10 variables:
##  $ inst     : num  3 5 12 7 11 1 7 6 12 22 ...
##  $ time     : num  455 210 1022 310 361 ...
##  $ status   : num  2 2 1 2 2 2 2 2 2 2 ...
##  $ age      : num  68 57 74 68 71 53 61 57 57 70 ...
##  $ sex      : num  1 1 1 2 2 1 1 1 1 1 ...
##  $ ph.ecog  : num  0 1 1 2 2 1 2 1 1 1 ...
##  $ ph.karno : num  90 90 50 70 60 70 70 80 80 90 ...
##  $ pat.karno: num  90 60 80 60 80 80 70 80 70 100 ...
##  $ meal.cal : num  1225 1150 513 384 538 ...
##  $ wt.loss  : num  15 11 0 10 1 16 34 27 60 -5 ...
##  - attr(*, "na.action")= 'omit' Named int [1:61] 1 3 5 12 13 14 16 20 23 25 ...
##   ..- attr(*, "names")= chr [1:61] "1" "3" "5" "12" ...
#Observamos correlación entre variables
cor(x=data_lung, method="pearson")
##                  inst        time      status         age          sex
## inst       1.00000000  0.02462876 -0.12719801  0.04859452  0.084362910
## time       0.02462876  1.00000000 -0.16217237 -0.07854153  0.114149616
## status    -0.12719801 -0.16217237  1.00000000  0.15911933 -0.218780030
## age        0.04859452 -0.07854153  0.15911933  1.00000000 -0.125280356
## sex        0.08436291  0.11414962 -0.21878003 -0.12528036  1.000000000
## ph.ecog    0.05947203 -0.19116847  0.23805821  0.30865378 -0.005363288
## ph.karno  -0.02252266  0.09487913 -0.16127595 -0.32261297 -0.019623924
## pat.karno  0.04147893  0.17505701 -0.18542442 -0.23989736  0.071014942
## meal.cal   0.09869124  0.07467151  0.02483564 -0.23958240 -0.171044801
## wt.loss   -0.17485406  0.03342528  0.04868879  0.04286056 -0.169892775
##                ph.ecog    ph.karno   pat.karno    meal.cal     wt.loss
## inst       0.059472025 -0.02252266  0.04147893  0.09869124 -0.17485406
## time      -0.191168469  0.09487913  0.17505701  0.07467151  0.03342528
## status     0.238058213 -0.16127595 -0.18542442  0.02483564  0.04868879
## age        0.308653782 -0.32261297 -0.23989736 -0.23958240  0.04286056
## sex       -0.005363288 -0.01962392  0.07101494 -0.17104480 -0.16989278
## ph.ecog    1.000000000 -0.82269739 -0.54719617 -0.10563039  0.17125740
## ph.karno  -0.822697393  1.00000000  0.53502749  0.05385409 -0.12524032
## pat.karno -0.547196168  0.53502749  1.00000000  0.17465190 -0.18213953
## meal.cal  -0.105630385  0.05385409  0.17465190  1.00000000 -0.11134425
## wt.loss    0.171257402 -0.12524032 -0.18213953 -0.11134425  1.00000000
#Escogemos las variables ph.ecog y ph.karno y hacemos el modelo de regresión lineal
regmod2<-lm(ph.ecog~ph.karno, data=data_lung)
summary(regmod2)
## 
## Call:
## lm(formula = ph.ecog ~ ph.karno, data = data_lung)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.4658 -0.1127 -0.0539  0.4167  1.0049 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  4.818865   0.210176   22.93   <2e-16 ***
## ph.karno    -0.047062   0.002532  -18.59   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4168 on 165 degrees of freedom
## Multiple R-squared:  0.6768, Adjusted R-squared:  0.6749 
## F-statistic: 345.6 on 1 and 165 DF,  p-value: < 2.2e-16
lm(formula = ph.ecog ~ ph.karno, data = data_lung)
## 
## Call:
## lm(formula = ph.ecog ~ ph.karno, data = data_lung)
## 
## Coefficients:
## (Intercept)     ph.karno  
##     4.81886     -0.04706
plot(data_lung$ph.karno,data_lung$ph.ecog, xlab="ph.ecog", ylab="ph.karno")
abline(regmod2)

#Ahora haremos el modelo de regresión lineal múltiple
mrm_lung<-lm(data_lung$ph.ecog~data_lung$inst+data_lung$time+data_lung$status+data_lung$age+data_lung$sex+data_lung$ph.karno+data_lung$pat.karno+data_lung$meal.cal+data_lung$wt.loss, data=data_lung)
summary(mrm_lung)
## 
## Call:
## lm(formula = data_lung$ph.ecog ~ data_lung$inst + data_lung$time + 
##     data_lung$status + data_lung$age + data_lung$sex + data_lung$ph.karno + 
##     data_lung$pat.karno + data_lung$meal.cal + data_lung$wt.loss, 
##     data = data_lung)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.07299 -0.21742 -0.01057  0.29690  0.93285 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          4.434e+00  4.549e-01   9.746   <2e-16 ***
## data_lung$inst       6.777e-03  3.918e-03   1.730   0.0856 .  
## data_lung$time      -3.171e-04  1.528e-04  -2.075   0.0396 *  
## data_lung$status     1.555e-01  7.299e-02   2.130   0.0347 *  
## data_lung$age        1.133e-03  3.753e-03   0.302   0.7631    
## data_lung$sex        3.141e-02  6.902e-02   0.455   0.6497    
## data_lung$ph.karno  -4.135e-02  3.001e-03 -13.779   <2e-16 ***
## data_lung$pat.karno -5.260e-03  2.525e-03  -2.083   0.0389 *  
## data_lung$meal.cal  -6.334e-05  8.166e-05  -0.776   0.4391    
## data_lung$wt.loss    3.907e-03  2.443e-03   1.599   0.1119    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3983 on 157 degrees of freedom
## Multiple R-squared:  0.7192, Adjusted R-squared:  0.7031 
## F-statistic: 44.68 on 9 and 157 DF,  p-value: < 2.2e-16
#Seleccionamos los mejores predictores posibles
step(object=mrm_lung, direction="both",trace=1)
## Start:  AIC=-297.76
## data_lung$ph.ecog ~ data_lung$inst + data_lung$time + data_lung$status + 
##     data_lung$age + data_lung$sex + data_lung$ph.karno + data_lung$pat.karno + 
##     data_lung$meal.cal + data_lung$wt.loss
## 
##                       Df Sum of Sq    RSS     AIC
## - data_lung$age        1    0.0145 24.924 -299.66
## - data_lung$sex        1    0.0329 24.942 -299.54
## - data_lung$meal.cal   1    0.0955 25.005 -299.12
## <none>                             24.910 -297.76
## - data_lung$wt.loss    1    0.4056 25.315 -297.06
## - data_lung$inst       1    0.4747 25.384 -296.61
## - data_lung$time       1    0.6834 25.593 -295.24
## - data_lung$pat.karno  1    0.6883 25.598 -295.21
## - data_lung$status     1    0.7201 25.630 -295.00
## - data_lung$ph.karno   1   30.1251 55.035 -167.38
## 
## Step:  AIC=-299.66
## data_lung$ph.ecog ~ data_lung$inst + data_lung$time + data_lung$status + 
##     data_lung$sex + data_lung$ph.karno + data_lung$pat.karno + 
##     data_lung$meal.cal + data_lung$wt.loss
## 
##                       Df Sum of Sq    RSS     AIC
## - data_lung$sex        1     0.026 24.951 -301.48
## - data_lung$meal.cal   1     0.126 25.050 -300.82
## <none>                             24.924 -299.66
## - data_lung$wt.loss    1     0.399 25.323 -299.01
## - data_lung$inst       1     0.495 25.419 -298.38
## + data_lung$age        1     0.014 24.910 -297.76
## - data_lung$time       1     0.682 25.606 -297.15
## - data_lung$pat.karno  1     0.693 25.617 -297.08
## - data_lung$status     1     0.747 25.671 -296.73
## - data_lung$ph.karno   1    32.688 57.612 -161.73
## 
## Step:  AIC=-301.48
## data_lung$ph.ecog ~ data_lung$inst + data_lung$time + data_lung$status + 
##     data_lung$ph.karno + data_lung$pat.karno + data_lung$meal.cal + 
##     data_lung$wt.loss
## 
##                       Df Sum of Sq    RSS     AIC
## - data_lung$meal.cal   1     0.158 25.109 -302.43
## <none>                             24.951 -301.48
## - data_lung$wt.loss    1     0.375 25.326 -300.99
## - data_lung$inst       1     0.506 25.456 -300.13
## + data_lung$sex        1     0.026 24.924 -299.66
## + data_lung$age        1     0.008 24.942 -299.54
## - data_lung$time       1     0.661 25.612 -299.11
## - data_lung$pat.karno  1     0.677 25.628 -299.01
## - data_lung$status     1     0.720 25.671 -298.73
## - data_lung$ph.karno   1    33.216 58.166 -162.13
## 
## Step:  AIC=-302.43
## data_lung$ph.ecog ~ data_lung$inst + data_lung$time + data_lung$status + 
##     data_lung$ph.karno + data_lung$pat.karno + data_lung$wt.loss
## 
##                       Df Sum of Sq    RSS     AIC
## <none>                             25.109 -302.43
## - data_lung$wt.loss    1     0.414 25.523 -301.70
## + data_lung$meal.cal   1     0.158 24.951 -301.48
## - data_lung$inst       1     0.462 25.571 -301.38
## + data_lung$sex        1     0.059 25.050 -300.82
## + data_lung$age        1     0.033 25.076 -300.65
## - data_lung$status     1     0.674 25.783 -300.00
## - data_lung$time       1     0.703 25.812 -299.82
## - data_lung$pat.karno  1     0.802 25.911 -299.17
## - data_lung$ph.karno   1    33.085 58.194 -164.05
## 
## Call:
## lm(formula = data_lung$ph.ecog ~ data_lung$inst + data_lung$time + 
##     data_lung$status + data_lung$ph.karno + data_lung$pat.karno + 
##     data_lung$wt.loss, data = data_lung)
## 
## Coefficients:
##         (Intercept)       data_lung$inst       data_lung$time  
##           4.5535875            0.0066252           -0.0003192  
##    data_lung$status   data_lung$ph.karno  data_lung$pat.karno  
##           0.1466834           -0.0415905           -0.0055947  
##   data_lung$wt.loss  
##           0.0038653
#Ejecutamos de nuevo el modelo con los predictores más significativos
mrm_lung_predictores<-(lm(formula = data_lung$ph.ecog ~ data_lung$inst + data_lung$time + 
    data_lung$status + data_lung$ph.karno + data_lung$pat.karno + 
    data_lung$wt.loss, data = data_lung))
summary(mrm_lung_predictores)
## 
## Call:
## lm(formula = data_lung$ph.ecog ~ data_lung$inst + data_lung$time + 
##     data_lung$status + data_lung$ph.karno + data_lung$pat.karno + 
##     data_lung$wt.loss, data = data_lung)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.16209 -0.22765 -0.01216  0.30052  0.92432 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          4.5535875  0.2816769  16.166   <2e-16 ***
## data_lung$inst       0.0066252  0.0038613   1.716   0.0881 .  
## data_lung$time      -0.0003192  0.0001509  -2.116   0.0359 *  
## data_lung$status     0.1466834  0.0707557   2.073   0.0398 *  
## data_lung$ph.karno  -0.0415905  0.0028644 -14.520   <2e-16 ***
## data_lung$pat.karno -0.0055947  0.0024744  -2.261   0.0251 *  
## data_lung$wt.loss    0.0038653  0.0023803   1.624   0.1064    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3961 on 160 degrees of freedom
## Multiple R-squared:  0.7169, Adjusted R-squared:  0.7063 
## F-statistic: 67.54 on 6 and 160 DF,  p-value: < 2.2e-16
#Realizamos un ANOVA
resultado_anova<-aov(sex ~ time, data = data_lung)
#Resumen del ANOVA
summary(resultado_anova)
##              Df Sum Sq Mean Sq F value Pr(>F)
## time          1   0.51  0.5143   2.178  0.142
## Residuals   165  38.96  0.2361
#Haremos un aAgrupamiento jerárquico divisivo. Primero calculamos la matriz de distancias
dist_matrix<-dist(data_lung)
#Cargamos el paquete "cluster" u usamos la función diana() para usar el método de agrupamiento divisivo
library(cluster)
hc_divisivo<-diana(dist_matrix) # Método de agrupamiento divisivo
# Representación del dendrograma
plot(hc_divisivo, main = "Dendrograma de Agrupamiento Jerárquico Divisivo", xlab = "data_lung")

#Elegimos un nivel de corte del dendograma, por ejemplo, dividir en 5 clústeres, como antes
nivel_corte<-4
cluster_asignado<-cutree(hc_divisivo, k = nivel_corte)
#Mostramos los resultados
resultado<-data.frame(Cluster = cluster_asignado)
print(resultado)
##     Cluster
## 1         1
## 2         1
## 3         2
## 4         3
## 5         3
## 6         3
## 7         3
## 8         1
## 9         4
## 10        2
## 11        2
## 12        3
## 13        1
## 14        1
## 15        1
## 16        2
## 17        2
## 18        1
## 19        1
## 20        3
## 21        1
## 22        3
## 23        1
## 24        1
## 25        2
## 26        2
## 27        1
## 28        2
## 29        1
## 30        1
## 31        3
## 32        2
## 33        3
## 34        3
## 35        2
## 36        2
## 37        2
## 38        1
## 39        1
## 40        2
## 41        3
## 42        2
## 43        1
## 44        3
## 45        1
## 46        1
## 47        1
## 48        3
## 49        2
## 50        1
## 51        3
## 52        2
## 53        3
## 54        1
## 55        3
## 56        1
## 57        2
## 58        1
## 59        3
## 60        2
## 61        1
## 62        1
## 63        3
## 64        2
## 65        1
## 66        2
## 67        1
## 68        2
## 69        1
## 70        2
## 71        1
## 72        3
## 73        3
## 74        2
## 75        2
## 76        1
## 77        1
## 78        2
## 79        1
## 80        1
## 81        3
## 82        1
## 83        1
## 84        3
## 85        3
## 86        1
## 87        3
## 88        3
## 89        3
## 90        2
## 91        3
## 92        2
## 93        1
## 94        1
## 95        1
## 96        2
## 97        1
## 98        1
## 99        3
## 100       3
## 101       1
## 102       1
## 103       1
## 104       3
## 105       1
## 106       1
## 107       3
## 108       3
## 109       1
## 110       3
## 111       1
## 112       1
## 113       3
## 114       3
## 115       1
## 116       3
## 117       4
## 118       4
## 119       1
## 120       3
## 121       1
## 122       1
## 123       3
## 124       1
## 125       1
## 126       1
## 127       3
## 128       3
## 129       1
## 130       1
## 131       1
## 132       3
## 133       3
## 134       1
## 135       1
## 136       1
## 137       1
## 138       3
## 139       1
## 140       1
## 141       1
## 142       3
## 143       3
## 144       1
## 145       1
## 146       3
## 147       1
## 148       1
## 149       3
## 150       4
## 151       1
## 152       3
## 153       3
## 154       1
## 155       3
## 156       3
## 157       1
## 158       1
## 159       3
## 160       3
## 161       3
## 162       1
## 163       1
## 164       4
## 165       1
## 166       1
## 167       1
#Finalmente podemos añadir una representación gráfica de los diferentes clústers
pltree(hc_divisivo,hang=-1,cex=0.6)
rect.hclust(hc_divisivo,k=10,border=2:10)

#Caso práctico 3. ANOVA A partir del conjunto de datos birthwt del paquete MASS, vamos a intentar obtener conclusiones acerca de la relación existente entre la raza de la madre, teniendo en cuenta si esta es o no fumadora, y el bajo peso del recién nacido. Este estudio podría contextualizarse en una prueba ANOVA de una vía para datos independientes.

#Cargamos los datos
library(MASS)
data("birthwt")
head(birthwt)
##    low age lwt race smoke ptl ht ui ftv  bwt
## 85   0  19 182    2     0   0  0  1   0 2523
## 86   0  33 155    3     0   0  0  0   3 2551
## 87   0  20 105    1     1   0  0  0   1 2557
## 88   0  21 108    1     1   0  0  1   2 2594
## 89   0  18 107    1     1   0  0  1   0 2600
## 91   0  21 124    3     0   0  0  0   0 2622
#Como nos interesa estudiar el parámetro raza, cambiaremos los valores 1-2-3 por el nombre de la raza
birthwt$race<-factor(birthwt$race,levels=c(1,2,3),labels=c("white","black","other"))
#Ordenamos los datos que queremos usar para la ANOVA
raza<-c(birthwt$race)
peso<-c(birthwt$bwt)
df_birth_anova<-data.frame(raza,peso)
#Calculamos media y varianza
aggregate(peso~raza,data=df_birth_anova,FUN=mean)
##    raza     peso
## 1 white 3102.719
## 2 black 2719.692
## 3 other 2805.284
aggregate(peso~raza,data=df_birth_anova,FUN=sd)
##    raza     peso
## 1 white 727.8861
## 2 black 638.6839
## 3 other 722.1944
#Test para determinar la normalidad
require(nortest)
## Loading required package: nortest
by(data=df_birth_anova,INDICES=df_birth_anova$raza,FUN=function(x){lillie.test(x$peso)})
## df_birth_anova$raza: white
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  x$peso
## D = 0.090389, p-value = 0.05113
## 
## ------------------------------------------------------------ 
## df_birth_anova$raza: black
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  x$peso
## D = 0.1231, p-value = 0.3946
## 
## ------------------------------------------------------------ 
## df_birth_anova$raza: other
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  x$peso
## D = 0.11598, p-value = 0.02578
#Se podría asumir normalidad para white y black, pero no para others porque p-value=0.02578<0.05

#Test para determinar la varianza
fligner.test(df_birth_anova$peso~df_birth_anova$raza,df_birth_anova)
## 
##  Fligner-Killeen test of homogeneity of variances
## 
## data:  df_birth_anova$peso by df_birth_anova$raza
## Fligner-Killeen:med chi-squared = 1.0086, df = 2, p-value = 0.6039
#Hay homocedasticidad porque p-value=.6039>0.05

#Realizamos un ANOVA
resultados_birthwt_anova<-aov(df_birth_anova$peso~df_birth_anova$raza, data = df_birth_anova)
#Resumen del ANOVA
summary(resultados_birthwt_anova)
##                      Df   Sum Sq Mean Sq F value  Pr(>F)   
## df_birth_anova$raza   2  5015725 2507863   4.913 0.00834 **
## Residuals           186 94953931  510505                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Gráficos de la ANOVA
plot(resultados_birthwt_anova)

#Realizamos un test de significancia
TukeyHSD(resultados_birthwt_anova)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = df_birth_anova$peso ~ df_birth_anova$raza, data = df_birth_anova)
## 
## $`df_birth_anova$raza`
##                   diff       lwr        upr     p adj
## black-white -383.02644 -756.2363  -9.816581 0.0428037
## other-white -297.43517 -566.1652 -28.705095 0.0260124
## other-black   85.59127 -304.4521 475.634630 0.8624372
#Observamos que hay diferencias significativas entre black y white, y entre other y white; pero no entre other y black.