Lo primero es cargar los datos que ya limpiamos de errores en el Tema 1:
Primero cargamos la base de datos y luego siguiendo con lo que ya veíamos en el Tema 1, cuando representamos en un boxplot todos los genes (variables) vemos que hay muchos datos atípico, pero ¿Qué hacer con ellos? ¿Son realmente atípicos?
##Primero cargamos la base de datosbreast.cancer.data<-read.csv("TCGA.BRCA.sampleMap_HiSeqV2_Tema1.csv")boxplot(breast.cancer.data[3:ncol(breast.cancer.data)])
Aquí vamos a diferenciar entre las variables que tiene "cosas raras" y las que tienen unos pocos atípicos.
Primero vemos que hay unos cuantos genes que tienen muchos ceros y luego unos pocos atípicos:
Para hacer esto de una forma automatizada, podemos primero contar cuantos ceros hay por variable y luego filtrar los que tengan muchos.
### Sumamos por columnas el número de ceroscolSums(breast.cancer.data ==0)## Lo vemos relativo al número de individuos(colSums(breast.cancer.data ==0)/dim(breast.cancer.data)[1])### Filtrar todos los genes que sean cero en mas de un 20% de las observacionesumbral<-dim(breast.cancer.data)[1]*0.20breast.cancer.data.filter<-breast.cancer.data[,which(colSums(breast.cancer.data ==0) < umbral)]
Ahora vamos con los outliers. Para ver los outliers podríamos aplicar la función descrita en este tema, pero ir tomando la decisión uno a uno puede ser muy tedioso:
Por lo tanto, habrá que automatizar todavía más la función. En este caso vamos a borrar automáticamente los valores que son datos extremos, pero no outliers, ya que en este tipo de datos, los outliers entra dentro de la normalidad
#### Automatizo una funcióneliminar_outliers<-function(df, umbral =3) { # Obtener nombres de columnas numéricas columnas_numericas <-names(df)[sapply(df, is.numeric) |sapply(df,is.integer)] # Iterar sobre columnas numéricas columnas<-c() for (columna in columnas_numericas) { # Obtener datos de la columna datos <- df[[columna]] # Calcular el rango intercuartílico (IQR) iqr <-IQR(datos,na.rm =TRUE) # Definir límites para los outliers umbral_inferior <-quantile(datos,na.rm =TRUE)[2] - umbral * iqr umbral_superior <-quantile(datos,na.rm =TRUE)[4] + umbral * iqr # Identificar y reemplazar outliers con NA df[[columna]][datos < umbral_inferior | datos > umbral_superior] <-NAif(any(datos < umbral_inferior | datos > umbral_superior)){ columnas<-c(columnas,columna) } } # Retornar el data frame con las columnas sin outliers return(list(df = df, columnas = columnas))}# Aplicar la funciónresult<-eliminar_outliers(breast.cancer.data.filter,3)breast.cancer.data.filter_no_outliers<-result$dfaffected_columns <- result$columnas# Coprobamos con un boxplotboxplot(breast.cancer.data.filter[,affected_columns])breast.cancer.data.filter$tumor_type<-as.factor(breast.cancer.data.filter$tumor_type)boxplot(breast.cancer.data.filter[,affected_columns[1]]~breast.cancer.data.filter$tumor_type)###Método Multivariantelof_result<-lof(breast.cancer.data.filter[,3:ncol(breast.cancer.data.filter)])breast.cancer.data.filter[lof_result>1.5,]boxplot(t(breast.cancer.data.filter[lof_result>1.5,3:ncol(breast.cancer.data.filter)]))
Finalmente comprobamos si hay duplicados
hay_duplicados<-duplicated(breast.cancer.data.filter_no_outliers)table(hay_duplicados)## Guardamos el fichero para usarlo en los próximos temaswrite.csv(breast.cancer.data.filter_no_outliers,"TCGA.BRCA.sampleMap_HiSeqV2_Tema2.csv",row.names = F)