Introduccion

En este anÔlisis, trabajamos con datos de expresión génica de las líneas celulares del conjunto NCI-60 del paquete ISLR en R, que incluye información de diversas líneas celulares de cÔncer humano. Con un enfoque en las líneas celulares de ovario para llevar a cabo un estudio detallado. Para evaluar la normalidad de estas variables, se realizarÔn pruebas de normalidad y se explorarÔn transformaciones que podrían ayudar a alcanzar la normalidad, lo que facilitaría inferencias estadísticas mÔs sólidas en anÔlisis posteriores.

# Identificar lĆ­neas celulares de ovario
DATA <- NCI60$data
label <- NCI60$labs
ovarian_cells <- which(NCI60$labs == "OVARIAN")

# Extraer los datos de expresión génica para estas líneas celulares
ovarian_data <-NCI60$data[ovarian_cells, ]
ovarianma <- t(ovarian_data)
X22<-ovarianma[,1] 
X25<-ovarianma[,2] 
X26<-ovarianma[,3] 
X27<-ovarianma[,4] 
X28<-ovarianma[,5] 
X29<-ovarianma[,6] 

Medidas descriptivas

Medias    <- apply(ovarianma,2,mean)
Des_st    <- apply(ovarianma,2,sd)
Asimetria <- apply(ovarianma,2,skewness)
Curtosis  <- apply(ovarianma,2,kurtosis)

Descriptivas <-rbind(Medias,Des_st,Asimetria,Curtosis)
round(Descriptivas,2)    
##            V22  V25  V26   V27  V28  V29
## Medias    0.02 0.06 0.08  0.04 0.03 0.05
## Des_st    0.77 0.81 0.77  0.66 0.72 0.64
## Asimetria 0.63 1.19 1.60  1.77 0.99 0.90
## Curtosis  5.50 8.90 8.22 15.13 7.39 5.37

Estos datos, nos demuestran que las variables tienen medias bastante similares, con desviaciones estandar bajas, sin embargo estas variables contienen niveles de Curtosis bastante altos, lo que nos dice que hay una prescencia notable de datos atĆ­picos.

Visualizacion de datos

# Histograma
par(mfrow=c(2,3))  
for(i in 1:ncol(ovarianma)) {
  hist(ovarianma[,i], main=paste("Histograma de V", i+21, sep=""), 
       xlab=paste("V", i+21, sep=""), col="lightblue", border="black")}

# QQplot
par(mfrow=c(2,3))
for(i in 1:ncol(ovarianma)) {
    qqnorm(ovarianma[,i], main=paste("Q-Q plot de V", i+21, sep=""))
    qqline(ovarianma[,i], col="red")}

# Boxplot
boxplot(ovarianma)

Matriz de correlación

ggpairs(ovarianma)

Según estos visuales, estos a simple vista, pareciera que estos datos no siguen una distribución normal, por lo que, para comprobar esto, se debería hacer una prueba de hipótesis que ponga esto a prueba.

1. Establecer nuestra Prueba de Hipótesis:

\(H_0\):Los datos son normales.

\(H_a\):Los datos no son normales.

2. Establecer nuestro nivel de confianza. \(α= 0.05\)

Pruebas de normalidad univariada

# Cramer-Von Mises
CVM <- mvn(ovarianma, univariateTest = "CVM",desc=T)
## Warning in FUN(newX[, i], ...): p-value is smaller than 7.37e-10, cannot be
## computed more accurately

## Warning in FUN(newX[, i], ...): p-value is smaller than 7.37e-10, cannot be
## computed more accurately

## Warning in FUN(newX[, i], ...): p-value is smaller than 7.37e-10, cannot be
## computed more accurately

## Warning in FUN(newX[, i], ...): p-value is smaller than 7.37e-10, cannot be
## computed more accurately

## Warning in FUN(newX[, i], ...): p-value is smaller than 7.37e-10, cannot be
## computed more accurately

## Warning in FUN(newX[, i], ...): p-value is smaller than 7.37e-10, cannot be
## computed more accurately
CVM$univariateNormality
##               Test  Variable Statistic   p value Normality
## 1 Cramer-von Mises    V22      12.8095  <0.001      NO    
## 2 Cramer-von Mises    V25      31.1092  <0.001      NO    
## 3 Cramer-von Mises    V26      19.9689  <0.001      NO    
## 4 Cramer-von Mises    V27      37.5216  <0.001      NO    
## 5 Cramer-von Mises    V28      19.7132  <0.001      NO    
## 6 Cramer-von Mises    V29      13.8992  <0.001      NO
# Mardia
Mardia <- mvn(ovarianma, mvnTest = "mardia")
Mardia$multivariateNormality
##              Test        Statistic p value Result
## 1 Mardia Skewness 14256.3146996139       0     NO
## 2 Mardia Kurtosis 419.076947796215       0     NO
## 3             MVN             <NA>    <NA>     NO

Luego de observar la prueba de normalidad de estos datos, podemos concluir, a base de que los p-valores de esta prueba se acercan a 0, que fallamos en rechazar nuestra hipótesis nula, lo que nos diría que esta base de datos sobre las celulas de ovarios no son normales a nivel univariado ni multivariado.

Al estos datos no ser normales, debería aplicarse una transformación para ver si se puede alcanzar dicha normalidad, en esto utilizamos la formula de bestNormalize:

# Transformación de variables

bt22 <- bestNormalize(X22)
## Warning: `progress_estimated()` was deprecated in dplyr 1.0.0.
## ℹ The deprecated feature was likely used in the bestNormalize package.
##   Please report the issue to the authors.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
bt22
## Best Normalizing transformation with 6830 Observations
##  Estimated Normality Statistics (Pearson P / df, lower => more normal):
##  - arcsinh(x): 1.8481
##  - Center+scale: 3.8182
##  - Double Reversed Log_b(x+a): 5.9288
##  - Exp(x): 166.7043
##  - Log_b(x+a): 4.8977
##  - orderNorm (ORQ): 1.1943
##  - sqrt(x + a): 3.8143
##  - Yeo-Johnson: 3.7631
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##  
## Based off these, bestNormalize chose:
## orderNorm Transformation with 6830 nonmissing obs and ties
##  - 1947 unique values 
##  - Original quantiles:
##    0%   25%   50%   75%  100% 
## -4.34 -0.38  0.00  0.41  6.45
bt25 <- bestNormalize(X25)
bt25
## Best Normalizing transformation with 6830 Observations
##  Estimated Normality Statistics (Pearson P / df, lower => more normal):
##  - arcsinh(x): 5.2556
##  - Center+scale: 9.1464
##  - Double Reversed Log_b(x+a): 12.6872
##  - Exp(x): 311.7133
##  - Log_b(x+a): 8.8336
##  - orderNorm (ORQ): 1.9355
##  - sqrt(x + a): 8.6894
##  - Yeo-Johnson: 8.2715
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##  
## Based off these, bestNormalize chose:
## orderNorm Transformation with 6830 nonmissing obs and ties
##  - 1914 unique values 
##  - Original quantiles:
##     0%    25%    50%    75%   100% 
## -5.340 -0.330  0.000  0.360  7.915
bt26 <- bestNormalize(X26)
bt26
## Best Normalizing transformation with 6830 Observations
##  Estimated Normality Statistics (Pearson P / df, lower => more normal):
##  - arcsinh(x): 2.1543
##  - Center+scale: 4.6084
##  - Double Reversed Log_b(x+a): 9.2499
##  - Exp(x): 250.444
##  - Log_b(x+a): 3.4312
##  - orderNorm (ORQ): 1.1093
##  - sqrt(x + a): 3.5213
##  - Yeo-Johnson: 3.0447
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##  
## Based off these, bestNormalize chose:
## orderNorm Transformation with 6830 nonmissing obs and ties
##  - 1882 unique values 
##  - Original quantiles:
##     0%    25%    50%    75%   100% 
## -4.230 -0.360  0.000  0.405  6.140
bt27 <- bestNormalize(X27)
bt27
## Best Normalizing transformation with 6830 Observations
##  Estimated Normality Statistics (Pearson P / df, lower => more normal):
##  - arcsinh(x): 3.5264
##  - Center+scale: 8.0377
##  - Double Reversed Log_b(x+a): 12.7233
##  - Exp(x): 356.3692
##  - Log_b(x+a): 10.3314
##  - orderNorm (ORQ): 1.175
##  - sqrt(x + a): 7.5511
##  - Yeo-Johnson: 7.0446
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##  
## Based off these, bestNormalize chose:
## orderNorm Transformation with 6830 nonmissing obs and ties
##  - 1726 unique values 
##  - Original quantiles:
##     0%    25%    50%    75%   100% 
## -4.053 -0.260  0.000  0.270  7.180
bt28 <- bestNormalize(X28)
bt28
## Best Normalizing transformation with 6830 Observations
##  Estimated Normality Statistics (Pearson P / df, lower => more normal):
##  - arcsinh(x): 6.4132
##  - Center+scale: 8.7189
##  - Double Reversed Log_b(x+a): 11.968
##  - Exp(x): 171.9059
##  - Log_b(x+a): 9.4507
##  - orderNorm (ORQ): 3.749
##  - sqrt(x + a): 8.5315
##  - Yeo-Johnson: 8.4132
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##  
## Based off these, bestNormalize chose:
## orderNorm Transformation with 6830 nonmissing obs and ties
##  - 1820 unique values 
##  - Original quantiles:
##    0%   25%   50%   75%  100% 
## -4.78 -0.34  0.00  0.35  5.69
bt29 <- bestNormalize(X29)
bt29
## Best Normalizing transformation with 6830 Observations
##  Estimated Normality Statistics (Pearson P / df, lower => more normal):
##  - arcsinh(x): 2.1748
##  - Center+scale: 3.7987
##  - Double Reversed Log_b(x+a): 6.71
##  - Exp(x): 84.9539
##  - Log_b(x+a): 4.1692
##  - orderNorm (ORQ): 1.2041
##  - sqrt(x + a): 3.3093
##  - Yeo-Johnson: 2.9483
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##  
## Based off these, bestNormalize chose:
## orderNorm Transformation with 6830 nonmissing obs and ties
##  - 1761 unique values 
##  - Original quantiles:
##     0%    25%    50%    75%   100% 
## -3.390 -0.315  0.000  0.355  4.790

Visualización de datos multivariados

datatrans <- matrix(c(bt22$x.t,bt25$x.t, bt26$x.t, bt27$x.t,bt28$x.t, bt29$x.t),ncol=6)

# Histograma
par(mfrow=c(2,3))  
for(i in 1:ncol(datatrans)) {
  hist(datatrans[,i], main=paste("Histograma Transformado de V", i+21, sep=""), 
       xlab=paste("V", i+21, sep=""), col="lightblue", border="black")}

# QQplot
par(mfrow=c(2,3))
for(i in 1:ncol(datatrans)) {
    qqnorm(datatrans[,i], main=paste("Q-Q plot de V", i+21, sep=""))
    qqline(datatrans[,i], col="red")}

# Boxplot
boxplot(datatrans)

Encontramos que la mejor transformación para estas variables resultó ser la de OrderNorm, y al ver los graficos estas variables empezaron a tener formas normales, ahora ponemos a prueba si estas variables realmente son normales con una prueba de hipótesis:

1. Establecer nuestra Prueba de Hipótesis:

\(H_0\):Los datos son normales.

\(H_a\):Los datos no son normales.

2. Establecer nuestro nivel de confianza.

\(α= 0.05\)

CVM22 <- cvm.test(bt22$x.t)     # Esta variable logró la normalidad
CVM22
## 
##  Cramer-von Mises normality test
## 
## data:  bt22$x.t
## W = 0.0093468, p-value = 0.9996
CVM25 <- cvm.test(bt25$x.t)     # Esta variable logró la normalidad
CVM25
## 
##  Cramer-von Mises normality test
## 
## data:  bt25$x.t
## W = 0.09933, p-value = 0.1149
CVM26 <- cvm.test(bt26$x.t)     # Esta variable logró la normalidad
CVM26
## 
##  Cramer-von Mises normality test
## 
## data:  bt26$x.t
## W = 0.014544, p-value = 0.9951
CVM27 <- cvm.test(bt27$x.t)     # Esta variable logró la normalidad
CVM27
## 
##  Cramer-von Mises normality test
## 
## data:  bt27$x.t
## W = 0.023887, p-value = 0.9246
CVM28 <- cvm.test(bt28$x.t)     # Esta variable no logró la normalidad
CVM28
## 
##  Cramer-von Mises normality test
## 
## data:  bt28$x.t
## W = 0.31294, p-value = 0.0002367
CVM29 <- cvm.test(bt29$x.t)     # Esta variable logró la normalidad
CVM29 
## 
##  Cramer-von Mises normality test
## 
## data:  bt29$x.t
## W = 0.010001, p-value = 0.9994

Al observar las pruebas a nivel univariado, se puede ver que 5 de las 6 variables de la celula de ovario si lograrón a obtener una distribución Normal, ahora se comprobarÔ si las variables que alcanzaron esta normalidad, pudieran crear una matriz con Normalidad, para ver si pudieramos hacer inferencias sobre esta:

# Matriz tranformada con variables con distribucion normal.

datatri <- matrix(c(bt22$x.t,bt25$x.t, bt26$x.t, bt27$x.t, bt29$x.t),ncol=5)

1. Establecer nuestra Prueba de Hipótesis:

\(H_0\):Los datos son normales.

\(H_a\):Los datos no son normales.

2. Establecer nuestro nivel de confianza.

\(α= 0.05\)

# Mardia
Mardiatra <- mvn(datatri, mvnTest = "mardia")
Mardiatra$multivariateNormality
##              Test        Statistic              p value Result
## 1 Mardia Skewness 502.560217991754 3.71330755841732e-84     NO
## 2 Mardia Kurtosis 35.0122996431687                    0     NO
## 3             MVN             <NA>                 <NA>     NO
# Henze-Zirkler
HZ <- mvn(datatri, mvnTest = "hz")
HZ$multivariateNormality
##            Test       HZ p value MVN
## 1 Henze-Zirkler 2.834468       0  NO

Al observar las pruebas a nivel multivariado, se puede ver que la matriz creada con las variables transformadas no pudieron lograr una distribución Normal, debido a que el pvalor obtenido en estas es uno cercano a 0, por lo que se puede decir que no existe prueba significativa para rechazar H0 por lo que no se le pueden aplicar algunas propiedades para poder hacer inferencias sobre esta matriz de datos.

NOTA: Como la matriz no resulto normal, no se pudieran hacer supuestos sobre su matriz de covarianza, pero para propósitos del examen asumimos que los datos transformados sí lo fueron, a continuación se presentaran algunas pruebas las cuÔl se querían trabajar:

Supongamos que ahora queremos comprobar si las variables que conforman la matriz de datos son independientes,

1. Establecer nuestra Prueba de Hipótesis:

\(H_0:Ī£=Ī£0\)

Las variables son independientes.

\(H_0:Σ≠Σ0\)

Las variables no son independientes.

2. Establecer nuestro nivel de confianza.

\(α= 0.05\)

# Información para el ejercicio
n        <- 6830
p        <- 6
# Matriz de covarianza muestral
S <-round(cov(datatrans),2)
S
##       [,1]  [,2] [,3]  [,4] [,5] [,6]
## [1,]  1.00 -0.03 0.00 -0.03 0.15 0.01
## [2,] -0.03  1.00 0.28  0.11 0.07 0.01
## [3,]  0.00  0.28 1.00  0.16 0.14 0.04
## [4,] -0.03  0.11 0.16  1.00 0.12 0.08
## [5,]  0.15  0.07 0.14  0.12 1.00 0.15
## [6,]  0.01  0.01 0.04  0.08 0.15 1.00
diag(S)
## [1] 1 1 1 1 1 1
# Matriz de covarianza fija
Sigma0     <-matrix(c(1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1),ncol=6)
Sigma0
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    0    0    0    0    0
## [2,]    0    1    0    0    0    0
## [3,]    0    0    1    0    0    0
## [4,]    0    0    0    1    0    0
## [5,]    0    0    0    0    1    0
## [6,]    0    0    0    0    0    1
# Calculamos el valor crĆ­tico
a          <-  0.05
gl         <- (1/2)*p*(p-1)
lambda_c   <- qchisq(1-a,gl)
lambda_c
## [1] 24.99579
# Calculamos el estadĆ­stico de prueba
Propios    <- eigen(S%*%solve(Sigma0))
val_prop   <- Propios$values
val_prop 
## [1] 1.4916603 1.1527888 1.0042922 0.8761990 0.7675256 0.7075342
lambda_0   <- -(n-1)*sum(log(val_prop))
lambda_0 
## [1] 1340.929

Como \(Ī»_0≄λ_c\), entonces se rechaza \(H_0\). Se puede concluir con un 95% de confianza que las variables transformadas de la matriz de covarianza de la celula de ovario no se pueden suponer que son independientes.

Ahora se quisiera estudiar si esta matriz de covarianza tiene forma esferica, que son independientes y tienen varianza en comĆŗn.

1. Establecer nuestra Prueba de Hipótesis:

\(H_0:Σ=σ^2I\)

Las variables son independientes y tienen la misma varianza. \(H_0:Ī£ā‰ Ļƒ^2I\)

Las variables no son independientes y no tienen la misma varianza.

2. Establecer nuestro nivel de confianza.

\(α= 0.05\)

# Información del problema
n        
## [1] 6830
p 
## [1] 6
# Matriz de covarianza muestral
S 
##       [,1]  [,2] [,3]  [,4] [,5] [,6]
## [1,]  1.00 -0.03 0.00 -0.03 0.15 0.01
## [2,] -0.03  1.00 0.28  0.11 0.07 0.01
## [3,]  0.00  0.28 1.00  0.16 0.14 0.04
## [4,] -0.03  0.11 0.16  1.00 0.12 0.08
## [5,]  0.15  0.07 0.14  0.12 1.00 0.15
## [6,]  0.01  0.01 0.04  0.08 0.15 1.00
# Calculamos el valor crĆ­tico
a          <-  0.05
gl         <- (1/2)*(p+2)*(p-1)
lambda_c   <- qchisq(1-a,gl)
lambda_c
## [1] 31.41043
# Calculamos el estadĆ­stico de prueba
sigma_est  <- sum(diag(S))/p
lambda_0   <- (n-1)*(log(sigma_est)-log(det(S)))
lambda_0 
## [1] 1340.929

Como \(Ī»_0≄λ_c\), entonces se rechaza \(H_0\). Se puede concluir con un 95% de confianza que las variables transformadas de la matriz de covarianza de la celula de ovario no se pueden suponer que son independientes ni tienen varianza en comun.

Para conocer mas sobre la relación entre las celulas de ovarios quisieramos estudiar la densidad que tienen las variables transformadas X25 Y X26, debido a que estas tienen la mayor correlación, sería interesante observar como estas se vieran en un plano.

ma2526 <-matrix(c(bt25$x.t,bt26$x.t),ncol=2) 
mu <- colMeans(ma2526)     
Sigma2 <- cov(ma2526)           

densidad <- dmvnorm(ma2526, mean = mu, sigma = Sigma2)
graph <- plot_ly(x = ~ma2526[,1], y = ~ma2526[,2], z = ~densidad, type = "scatter3d", color=densidad, xlab="",ylab="", zlab="")

graphlab <- graph %>% layout(scene = list(
  xaxis = list(title = "X25 Transformada"),
  yaxis = list(title = "X26 Transformada"),
  zaxis = list(title = "Densidad")
))
graphlab
## No scatter3d mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
## Warning: 'scatter3d' objects don't have these attributes: 'xlab', 'ylab', 'zlab'
## Valid attributes include:
## 'connectgaps', 'customdata', 'customdatasrc', 'error_x', 'error_y', 'error_z', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'projection', 'scene', 'showlegend', 'stream', 'surfaceaxis', 'surfacecolor', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'visible', 'x', 'xcalendar', 'xhoverformat', 'xsrc', 'y', 'ycalendar', 'yhoverformat', 'ysrc', 'z', 'zcalendar', 'zhoverformat', 'zsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'

Otra forma para observar esto sería un Diagrama de dispersión

scatterplot3d(x = ma2526[,1], y = ma2526[,2], z = densidad, pch = 19, cex.lab = 1, highlight.3d = TRUE, xlab = "X25 Transformada ", ylab = "X26 Transformada ", zlab = "Densidad")

Al observar las graficas de densidad entre la variable X25 y X26 se puede notar que a simple vista, estos parecieran tener una distribución normal.