Selección del mejor punto de diagnóstico en una prueba diagnóstica

La pasada semana, en un examen, me preguntaron cuál era el mejor punto para una prueba diagnóstica; era necesario razonar mi respuesta. Seguramente mi respuesta fue correcta pero mi razonamiento no lo fue y por eso quería redimirme. Para evaluar las pruebas diagnósticas con una respuesta binaria si/no contamos con la sensibilidad y la especificidad. La sensibilidad es la capacidad que tiene la prueba para acertar sobre los que de verdad tiene que acertar, la probabilidad de etiquetar como enfermos aquellos que verdaderamente están enfermos. La especificidad es una medida que nos indica cuanto nos hemos equivocado con los “unos”, la probabilidad de etiquetar enfermos a pacientes sanos. Una forma de medir cuanto acertamos y cuanto nos equivocamos con nuestra prueba. Para analizar el comportamiento de nuestra prueba diagnóstica debemos determinar un punto de corte. Para ilustrar como seleccionar el mejor punto de corte vamos a emplear unos datos sacados de la web de bioestadística del Hospital ramón y Cajal y vamos a elaborar una curva ROC con R y ggplot2.

Espacios en SAS

Las funciones SAS más habituales para eliminar blancos son las que tenéis en la figura de arriba. Para llegar a ese conjunto de datos SAS hemos ejecutado el siguiente paso data:

data ejemplo;

st = "  Cuando  brilla   el sol    ";
l_st=length(st); output;

funcion="COMPRESS     "; st1 = compress(st);
l_st1=length(st1); output;

funcion="COMPBL";  st1 = compbl(st);
l_st1=length(st1); output;

funcion="TRIM";    st1 = trim(st);
l_st1=length(st1); output;

funcion="TRIMN";   st1 = trimn(st);
l_st1=length(st1); output;

funcion="STRIP";    st1 = strip(st);
l_st1=length(st1); output;

funcion="SRTIP+COMBBL"; st1 = strip(compbl(st));
l_st1=length(st1); output;

run;

Distintas formas de eliminar espacios dentro de una cadena de caracteres en SAS. Partimos de la variable string » Cuando brilla el sol » y empleamos las siguientes funciones:

Análisis del discurso de navidad del Rey de España 2013

Me llena de orgullo y satisfacción mostraros un ejemplo de uso de la librería wordcloud para la realización de nubes de palabras con R. Esta entrada no es muy innovadora porque ya tenemos alguna similar en el blog. Lo primero que tenéis que hacer es descargaros el discurso del Rey y ejecutad este código:

#Lectura del archivo
ubicacion="C:\\temp\\juancar.txt"
texto = read.table (ubicacion,sep="\r")

#Dejamos todas las palabras en mayúsculas
texto = toupper(textoV1)
#El texto lo transformamos en una lista separada por espacios
texto_split = strsplit(texto, split=" ")

#Deshacemos esa lista y tenemos el data.frame
texto_col = as.character(unlist(texto_split))
texto_col = data.frame(texto_col)
names(texto_col) = c("V1")

#Eliminamos algunos caracteres regulares
texto_colV1 = sub("([[:space:]])","",texto_colV1)
texto_colV1 = sub("([[:digit:]])","",texto_colV1)
texto_colV1 = sub("([[:punct:]])","",texto_colV1)
#Creamos una variable longitud de la palabra
texto_collargo = nchar(texto_colV1)

#Quitamos palabras cortas
texto_col = subset(texto_col,largo>4)

#Nube de palabras
#install.packages('wordcloud')
library(wordcloud)
library(RColorBrewer)
pesos = data.frame(table(texto_colV1))

#Paleta de colores
pal = brewer.pal(6,"RdYlGn")

#Realizamos el gráfico
png('C:\\temp\\Discurso del rey españa 2013.png', width=500, height=500)
wordcloud(pesosVar1,pesosFreq,scale=c(4,.2),min.freq=2,
max.words=Inf, random.order=FALSE,colors=pal,rot.per=.15)

dev.off()

Interesante el uso de la librería RColorBrewer. Particularmente me gusta mucho el resultado que nos da wordcloud para la realización de las nubes de palabras con una sintaxis sencilla. Considero imprescindible el uso de ramdom.order=FALSE. Espero que os sea de utilidad.

Seleccionar un elemento de un objeto de R

Quedarnos con un elemento específico de un objeto en R. Viene de una duda planteada por un lector que surgía a raíz de un post dedicado al p-valor y al tamaño muestral. Jose Ignacio desea almacenar en un objeto el p-valor asociado a un test de Wald para la independencia entre los niveles de un factor. Una sugerencia para poder trabajar con este elemento:

y = c(rep(1,200),rep(0,100))
x = c(rep(1,32),rep(0,168),rep(1,15),rep(0,85))
datos = data.frame(cbind(y,x))
table(datos)

modelo.1=glm(y~x,data=datos,family=binomial)
summary(modelo.1)

Para la realización del test de Wald con R vamos a emplear la librería lmtest :

El mejor gestor de datos del mundo es de Cádiz

Me ha gustado esta noticia de Elconfidencial.com http://www.elconfidencial.com/tecnologia/2013-12-19/un-matematico-andaluz-desconocido-es-el-mejor-cientifico-de-datos-del-mundo_67675/ Resulta que Jose Antonio Guerrero es el número uno en Kaggle. Mirad que estoy rato yo por Kaggle y no me había dado cuenta nunca de esto. He de confesaros que esta noticia me ha emocionado.

Por cierto, si visitáis el perfil de Jose Antonio entre sus Skills está R y en la foto está trabajando con Excel.

Un personaje excepcional.

Cuidado con el p-valor. Depende del tamaño de la muestra

El otro martes, Teresa mi profesora de la Facultad de Estudios Estadísticos, dijo una frase que me dejó helado.“Ojo con el p-valor porque depende del tamaño muestral” Estábamos estudiando regresión logística y test de independencia. Ahora que uno mismo vuelve a estudiar que es lo que hay detrás de la salida de los programas estadísticos se plantea muchas dudas. Por definición el p-valor depende del tamaño muestral y es una medida que la tomamos como un axioma para todo: El p-valor nunca miente hasta que tenemos mucha exposición. Voy a utilizar un ejemplo que vi en clase con Teresa ligeramente retocado (no creo que se enfade, no creo ni que lea esto). Trabajo con SAS porque estoy más acostumbrado a la salida que ofrece. Se trata de realizar un test de independencia para una tabla 2×2. La H0 o hipótesis nula es que existe independencia entre el factor de nuestro estudio y la variable dependiente en nuestro caso H0 es no hay relación entre la utilización de un pesticida y la presencia de una enfermedad frente a H1 hay relación entre la utilización del pesticida y la presencia de la enfermedad. Simulamos los datos con SAS:

Calendario de Solvencia II (o Solvencia ¡!)

El 2 de octubre tuvimos propuesta de Directiva Quick-fix II con las fechas de entrada en funcionamiento de Solvencia ¡!. Esto se votó a toda prisa el viernes 21 de noviembre y a grandes rasgos se decide que sea 01/01/2016 el gran momento. Ya hay texto , hay directrices de EIOPA y parece que todo está en marcha. Ya veremos que pasa con las garantías a largo plazo (que grande el seguro de decesos). A ver si ya termina de cerrarse el desarrollo normativo.

Truco (malo) de R. Leer datos desde Excel

Tenemos unos datos en Excel y deseamos crear un objeto en R con ellos. La forma más sencilla es seleccionar y copiar los datos y ejecutar el siguiente código:

datos = read.delim("clipboard")

str(datos)

Muy sencillo, pero necesitaba «fustigarme». Si deseamos llevar los datos de R a Excel (el camino contrario) hacemos:

write.table(datos,"clipboard", sep="\t",row.names=FALSE)

Igual de sencillo. No hagáis como yo, no olvidéis este código. Saludos.

Truco Excel. Identificar el color de una celda

Para identificar el color de una celda en Excel podemos emplear Interior.Color del siguiente modo:

Sub Macro1()

For i = 3 To 6

dato = Cells(i, 2).Interior.Color
Cells(i, 3) = dato
Next i

End Sub

No funciona con formatos condicionales, si deseáis utilizar los colores de los formatos condicionales habréis de idear cómo hacerlo o bien esperar a que tenga tiempo a redactar como lo hago yo, pero que nadie se espere un programa en VB brillante, que no fui capaz de hacerlo. Saludos.

Truco Excel. Agrupar valores en un campo de una tabla dinámica

Si necesitamos agrupar un campo de una tabla dinámica tenemos dos opciones. Por un lado agrupar manualmente o bien crear intervalos de determinado tamaño. Para agrupar datos manualmente seleccionamos los elementos que deseamos agrupar en la tabla dinámica y pulsamos botón derecho agrupar:

Inmediatamente se nos crea un nuevo campo en la tabla dinámica que por sufijo tendrá un 2 y aparece un nuevo grupo que por defecto se llamará Grupo 1. Podemos cambiar el nombre, en este caso agrupamos trimestres o cuatrimestres:

Truco (muy fácil) de SAS. Leer un rango de una hoja Excel

Cuando tenemos rangos en nuestras hojas Excel y deseamos que se conviertan en tabla SAS podemos emplear la sentencia libname de este modo:

libname selec "C:\TEMP\rangos.xlsx";
data rango;
set selec.rango;
run;
libname selec clear;

Asisgnamos la librería al archivo Excel que deseamos leer y tan simple como referenciar al rango en nuestro paso data. Se interactúa fácil entre Excel y SAS. Saludos.

Truco SAS. Retrasar una ejecución con SLEEP

El método más sencillo para ejecutar SAS a una hora determinada es el empleo de la función SLEEP:

data _null_;
    momento = "03OCT2013:10:07"dt;
    duerme_hasta = sleep(momento - datetime(), 1);
run;

Un truco muy sencillo que da respuesta a una duda planteada en el blog. Pensé que ya existía esta entrada. Saludos.