Antecedentes
Un laboratorio quiere evaluar si una determinada forma de electroforesis en gel es adecuado como método de clasificación de la calidad de una determinada sustancia. Se cargaron varios geles, cada uno con una muestra limpia de la sustancia y con una muestra que contiene impurezas. Además, también se cargó un marcador molecular que sirve de referencia. La siguiente imagen ilustra el montaje (la imagen no muestra el experimento real, la he tomado de Wikipedia para ilustrarlo):
Se midieron dos parámetros para cada gel y cada carril:
- El peso molecular (es decir, la altura de un compuesto durante la electroforesis)
- El cantidad relativa. La cantidad total de cada carril se normaliza a 1 y se mide la densidad de cada banda, lo que da como resultado la cantidad relativa de cada banda.
A continuación, se produce un gráfico de dispersión de la cantidad relativa frente al peso molecular, que podría tener el siguiente aspecto (se trata de datos artificiales):
Este gráfico puede leerse como sigue: Tanto la sustancia "buena" (puntos azules) como la "impura" (puntos rojos) presentan dos bandas, una en torno a un peso molecular de 120 y otra en torno a 165. Las bandas de la sustancia "impura" con un peso molecular en torno a 120 son considerablemente menos densas que las de la sustancia "buena" y pueden distinguirse bien.
Objetivo
El objetivo es determinar dos casillas (véase el gráfico siguiente) que determinan una "buena" sustancia. Estas casillas se utilizarán para clasificar la sustancia en el futuro en "buena" e "impura". Si una sustancia presenta carriles que entran en las casillas se clasifica como "buena" y si no como "impura".
Estas reglas de decisión deben ser simple para solicitar a alguien en el laboratorio. Por eso deberían ser cajas en lugar de límites de decisión curvos.
Los falsos negativos (es decir, clasificar una muestra como "impura" cuando realmente es "buena") se consideran peores que los falsos positivos. Es decir, hay que hacer hincapié en los sensibilidad en lugar de en el especificidad .
Pregunta
No soy un experto en aprendizaje automático. Sin embargo, sé que hay bastantes algoritmos/técnicas de aprendizaje automático que podrían ser útiles: $k$ -vecinos más cercanos (por ejemplo knn
en R
), árboles de clasificación (por ejemplo rpart
o ctree
), máquinas de vectores de apoyo ( ksvm
), la regresión logística, los métodos boosting y bagging y muchos más.
Uno de los problemas de muchos de esos algoritmos es que no proporcionan un conjunto de reglas simples o límites lineales. Además, el tamaño de la muestra es alrededor de 70.
Mis preguntas son:
- ¿Tiene alguien una idea de cómo proceder aquí?
- ¿Tiene sentido dividir el conjunto de datos en conjunto de entrenamiento y de prueba?
- Qué proporción de datos debe tener el conjunto de entrenamiento (he pensado en una proporción de 60/40).
- ¿Cuál es, en general, el flujo de trabajo para este tipo de análisis? Algo así como Dividir el conjunto de datos -> ajustar el algoritmo al conjunto de entrenamiento -> predecir el resultado para el conjunto de prueba?
- ¿Cómo evitar el sobreajuste (es decir, cajas demasiado pequeñas)?
- ¿Cuál es una buena estadística para evaluar el rendimiento predictivo en este caso? ¿AUC? ¿Acerteza? ¿Valor predictivo positivo? Coeficiente de correlación de Matthews ?
Supongamos que estoy familiarizado con R
y el caret
paquete. Muchas gracias por su tiempo y ayuda.
Datos de ejemplo
A continuación se muestra un conjunto de datos de ejemplo.
structure(list(mol.wt = c(125.145401455869, 118.210252208676,
165.048583787746, 126.003687476776, 170.149347112565, 127.761533014759,
155.523172614798, 120.094514977175, 161.234986765321, 168.471542655269,
156.522990530521, 154.377948321209, 165.365756398877, 167.965538771316,
116.132241687833, 115.143539160903, 156.696830822196, 162.578494491556,
136.830624758899, 123.886594633942, 124.247484227948, 126.257226352824,
160.684010454816, 166.618872115047, 126.599387146887, 165.690375912529,
159.786861142652, 114.520735974329, 125.753594471656, 157.551537154148,
157.320636890647, 171.5759136115, 158.580005438661, 125.647463565197,
130.404710783509, 127.128218318572, 162.144126888907, 161.804616951055,
167.917268243627, 168.582197247178), rel.qtd = c(57.68339235957,
54.0514508510085, 25.0703901938793, 37.6933881305906, 36.6853653723001,
53.6650555524679, 52.268438087776, 52.8621831466857, 43.1242291166037,
46.6771236380788, 38.0328239221277, 40.0454611708371, 44.6406366176158,
40.8238699987682, 51.9464749018547, 54.0302533272953, 37.9792331383524,
48.3853988095525, 38.2093977349102, 42.2636098418388, 42.9876895407144,
40.8018728193786, 40.1097096927465, 38.7432550253867, 39.2633283608111,
43.4673723102812, 53.3740718733815, 49.1067921475768, 52.3002598744634,
44.9847844953241, 44.3014423068017, 44.0191971364465, 47.0805245356855,
55.0124134796556, 57.9938440244052, 62.8314454977068, 45.8093815891894,
43.2300677500964, 39.4801550161538, 51.6253515591173), quality = structure(c(2L,
2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 1L), .Label = c("bad", "good"), class = "factor")), .Names = c("mol.wt",
"rel.qtd", "quality"), row.names = c(10L, 14L, 47L, 16L, 57L,
54L, 45L, 12L, 43L, 67L, 25L, 21L, 1L, 55L, 20L, 22L, 37L, 15L,
8L, 38L, 46L, 64L, 51L, 65L, 52L, 61L, 63L, 32L, 50L, 27L, 19L,
69L, 23L, 42L, 6L, 48L, 11L, 13L, 5L, 71L), class = "data.frame")