procedemos a realizar una separación de la base de datos para realizar el modelo discriminante y otra parte para comprobar si el análisis funciono.
> n<-sample(1:nrow(b),100,replace = F)
> prueba<-b[n,]
> entrenamiento<-b[-n,]
> str(prueba)
'data.frame': 100 obs. of 8 variables:
$ npreg: int 5 10 0 2 1 8 2 1 3 0 ...
$ glu : int 96 129 162 124 181 179 108 139 113 107 ...
$ bp : int 74 62 76 68 78 72 52 62 50 62 ...
$ skin : int 18 36 56 28 42 42 26 41 10 30 ...
$ bmi : num 33.6 41.2 53.2 32.9 40 32.7 32.5 40.7 29.5 36.6 ...
$ ped : num 0.997 0.441 0.759 0.875 1.258 ...
$ age : int 43 38 25 30 22 36 22 21 25 25 ...
$ type : Factor w/ 2 levels "No","Yes": 1 2 2 2 2 2 1 1 1 2 ...
> str(entrenamiento)
'data.frame': 232 obs. of 8 variables:
$ npreg: int 6 1 1 2 5 0 1 3 1 5 ...
$ glu : int 148 85 89 197 166 118 103 126 97 109 ...
$ bp : int 72 66 66 70 72 84 30 88 66 75 ...
$ skin : int 35 29 23 45 19 47 38 41 15 26 ...
$ bmi : num 33.6 26.6 28.1 30.5 25.8 45.8 43.3 39.3 23.2 36 ...
$ ped : num 0.627 0.351 0.167 0.158 0.587 0.551 0.183 0.704 0.487 0.546 ...
$ age : int 50 31 21 53 51 31 33 27 22 60 ...
$ type : Factor w/ 2 levels "No","Yes": 2 1 1 2 2 2 1 1 1 1 ...
Como Podemos observar utilizaremos 100 datos de la base para comprobar que el modelo discriminante es servible y para realizar el modelo utilizaremos los 232 datos restantes. A continuación se procede a realizar el modelo.
> library(MASS)
> ad<-lda(type~.,data=entrenamiento);ad
Call:
lda(type ~ ., data = entrenamiento)
Prior probabilities of groups:
No Yes
0.6939655 0.3060345
Group means:
npreg glu bp skin bmi ped age
No 3.099379 107.3789 70.17391 27.71429 31.82050 0.4561118 29.19876
Yes 4.859155 139.3380 73.85915 32.67606 36.49577 0.6529577 35.95775
Coefficients of linear discriminants:
LD1
glu 0.0284599554
bp -0.0104977681
skin -0.0009694376
ped 0.4906246231
age 0.0289872943
Con este modelo podemos ver que hay una probabilidad a priori mayor de las que no tienen diabetes con un 69.39%, bajando un poco mas vemos las medias de los grupos y una vez mas podemos decir que se diferencian un poco las medias por lo que parece que vamos por buen camino. El ultimo resultado que nos arroga el software es el modelo que quedaría de la siguiente manera.
> plot(ad)
Como vemos en el grafico hay un grupo considerable de datos que se juntan, lo que nos van a dar problemas al comparar el modelo, aun así, parece ser que si se separan los grupos. Ahora que ya tenemos el modelo echo calcularemos el error aparente y el error por validación cruzada con ayuda del mismo software.
> predclas.cv <- lda(entrenamiento[,1:7],tt,CV=T)$class
> predclas<-predict(ad)$class
> tt<-entrenamiento$type
> ea<-1 - sum(predclas == tt)/nrow(entrenamiento)
> predclas.cv <- lda(entrenamiento[,1:7],tt,CV=T)$class
> evc <- 1 - sum(predclas.cv == tt)/nrow(entrenamiento)
> print(paste('error aparente =',ea, '//error por validación cruzada= ',evc))
[1] "error aparente=0.21551724137931 //error por validación cruzada=0.228448275862069"
Como podemos ver ambos errores son similares y pequeños por lo que pasamos a comprobar nuestra eficiencia del modelo.
> p<-predict(ad,newdata = prueba)
> table(p$class,prueba$type)
No Yes
No 57 14
Yes 5 24
Como podemos observar en total el modelo se equivocó en clasificar a 19 mujeres de 100, 14 mujeres que no están consideradas con diabetes las clasifico con diabetes y 5 mujeres que deberían haber sido clasificada con diabetes no lo fueron, de forma particular yo opino que es un buen modelo, tomando en cuenta que en las primeras graficas que realizamos tampoco se veía una separación tan precisa de los datos.
Comments