En algunos casos, podemos pensar que calibrar modelos o hacer predicciones a partir de datos a “ojo” puede ser una manera rápida y aceptablemente efectiva de sacar conclusiones. Es posible que en algunos casos, cuando tenemos conjuntos de datos y escenarios muy simples, esta metodología de buenos resultados, en cambio, veremos que a medida que aumentamos la complejidad del escenario y el número de datos a tratar, se vuelve un procedimiento lioso y que no lleva a ningún resultado claro.
Dividimos el presente taller en dos puntos. En primer lugar, haremos una optimización a ojo de un modelo lineal. Dicho de otra manera, buscaremos a ojo el valor que consideremos óptimo del intercepto y de la pendiente de la recta que mejor aproxime los puntos indicados en el conjunto de datos. En segundo lugar, haremos una optimización nuevamente a ojo pero en este caso de un modelo de regresión logística. En este caso buscamos repetir el procedimiento del punto 1 para un nuevo conjunto de datos más grande que dividiremos en intervalos.
Finalmente, incluimos nuestra respuesta a las tres preguntas planteadas en el ejercicio y también un breve glosario de términos útiles y relacionados con el tema.
library(mvtnorm)
library(MBESS)
library(Matrix)
library(readr)
df.regresion <- read.csv('datos_regresion.csv', sep = " ")
par(mfrow = c(1,2))
puntos <- 10
plot(2, type="n", xlab="intercepto", ylab="pendiente", xlim=c(0, 2), ylim=c(1, 2),
main = "Espacio de parámetros")
grid()
location<-locator(puntos,type="p", par(pch=16,col="blue"))
for(i in 1:puntos){
png(paste0('imagen', i, '.png'))
plot(df.regresion$x, df.regresion$y, xlim = c(-0.5, 1.5), las = 1,
ylim = c(0, 3.5), xlab = 'x', ylab = 'y',
main = paste('Linea de tendencia para pendiente: ',round(location$y[i],2),
'e intercepto: ', round(location$x[i], 2)))
abline(a = location$x[i], b = location$y[i], col = "red")
dev.off()
}
df.clasificacion <- read.csv('datos_clasificacion.csv', sep = " ")
x.sorted <- sort(df.clasificacion$x)
orden <- sort(df.clasificacion$x, index.return = TRUE)$ix
x.sorted.mat <- matrix(x.sorted, ncol=10, byrow=TRUE)
media.x.sort <- apply(x.sorted.mat, 1, mean)
y.interval <- as.numeric(df.clasificacion$y[orden])
y.interval.mat <- matrix(y.interval, ncol=10, byrow = TRUE)
media.y.interval <- apply(y.interval.mat, 1, mean)
puntos <- 10
plot(1, type="n", xlab="B0", ylab="B1", xlim=c(-8, -1), ylim=c(5, 15), las = 1,
main = "Espacio de parámetros")
grid()
location.log<-locator(puntos,type="p", par(pch=16,col="blue"))
for(i in 1:puntos){
B0 <- location.log$x[i]
B1 <- location.log$y[i]
x.plot = seq(0, 1, length = 100)
y.plot = 1/(1+exp(-(B0+B1*x.plot)))
png(paste0('grafica', i, '.png'))
plot(media.x.sort, media.y.interval, xlim = c(0, 1), las = 1, type = "h",
ylim = c(0, 1), xlab = 'x', ylab = 'P(Y=1|X=x)',
main = paste('Curva logística para B1: ',round(B1,2),
'y B0: ', round(B0, 2)))
lines(x.plot,y.plot, col = "red", lwd = 3)
grid()
dev.off()
}