Es un asunto tangencial que, además, se soluciona las más de las veces con density. Pero parece que tiene mucha más ciencia detrás.
Por algún motivo, acabé un día en la página del paquete logspline, que ajusta densidades usando splines. Su promesa es que puede realizar ajustes de densidades tan finos como
que está extraído de Polynomial Splines and their Tensor Products in Extended Linear Modeling, el artículo que le sirve de base teórica.
[Nota: el código relevante sigue estando en GitHub. No es EL código sino UN código que sugiere todos los cambios que se te puedan ocurrir. Entre otras cosas, ilustra cómo de dependientes son los resultados de la formulación del modelo, cosa muchas veces obviada.]
Continúo con la entrada de ayer, que contenía más errores que información útil respecto a objetivos y métodos.
Los objetivos del análisis son los de obtener una estimación del número de casos activos de coronavirus en la provincia de Madrid.
[Nota: si no sabes interpretar las hipótesis embebidas en el código que publico, que operan como enormes caveats, no hagas caso en absoluto a los resultados. He publicado esto para ver si otros que saben más que yo lo pulen y consiguen un modelo más razonable usándolo tal vez, ojalá, como núcleo.]
[Edición: He subido el código a GitHub.]
[El código de esta sección y los resultados contienen errores de bulto; consúltese el código de GitHub.
Esta entrada es casi una referencia para mí. Cada vez tiro más de lme4 en mis modelos y en uno en concreto que tengo entre manos toca simular escenarios. Para lo cual, simulate.merMod.
Véamoslo en funcionamiento. Primero, datos (ANOVA-style) y el modelo que piden a gritos:
library(plyr) library(lme4) a <- c(0,0,0, -1, -1, 1, 1, -2, 2) factors <- letters[1:length(a)] datos <- ldply(1:100, function(i){ data.frame(x = factors, y = a + rnorm(length(a))) }) modelo <- lmer(y ~ (1 | x), data = datos) El resumen del modelo está niquelado:
Desafortunadamente, el concepto de interacción, muy habitual en modelización estadística, no ha penetrado la literatura del llamado ML. Esencialmente, el concepto de interacción recoge el hecho de que un fenómeno puede tener un efecto distinto en subpoblaciones distintas que se identifican por un nivel en una variable categórica.
El modelo lineal clásico,
$$ y \sim x_1 + x_2 + \dots$$
no tiene en cuenta las interacciones (aunque extensiones suyas, sí, por supuesto).
El código usado en
Coronavirus: los nuevos casos diarios se estabilizan en muchos países menos en... pic.twitter.com/XOwxyccsZG
— Carlos Gil Bellosta (@gilbellosta) March 10, 2020 es
library(reshape2) library(ggplot2) library(plyr) url <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv" cvirus <- read.table(url, sep = ",", header = T) cvirus$Lat <- cvirus$Long <- NULL cvirus$Province.State <- NULL cvirus <- melt(cvirus, id.vars = "Country.Region") colnames(cvirus) <- c("país", "fecha", "casos") cvirus$fecha <- as.Date(as.character(cvirus$fecha), format = "X%m.%d.%y") tmp <- cvirus[cvirus$país %in% c("Italy", "Spain", "France", "Germany", "South Korea", "UK"),] foo <- function(x){ x <- x[order(x$fecha),] data.
Mi código (guarrongo) para seguir la evolución del coronavirus por país en cuasi-tiempo real:
library(reshape2) library(ggplot2) url <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv" cvirus <- read.table(url, sep = ",", header = T) cvirus$Lat <- cvirus$Long <- NULL cvirus$Province.State <- NULL cvirus <- melt(cvirus, id.vars = "Country.Region") colnames(cvirus) <- c("país", "fecha", "casos") cvirus <- cvirus[cvirus$país %in% c("Italy", "Spain"),] cvirus$fecha <- as.Date(as.character(cvirus$fecha), format = "X%m.%d.%y") ggplot(cvirus, aes(x = fecha, y = casos, col = país)) + geom_line() tmp <- cvirus tmp$fecha[tmp$país == "Spain"] <- tmp$fecha[tmp$país == "Spain"] - 9 ggplot(tmp, aes(x = fecha, y = casos, col = país)) + geom_line() tmp <- tmp[tmp$fecha > as.
Lo del coronavirus nos ha convertido a todos en epidemiólogos circunstanciales. Casi ninguno de vosotros tenéis acceso a los datos necesarios para hacer cosas por vuestra cuenta, pero sí, tal vez gracias a esta entrada, las herramientas necesarias para ello.
Podéis empezar por el paquete survellance de R, que implementa muchos de los métodos más modernos para la monitorización de brotes epidémicos.
En particular, puede que os interese la función bodaDelay, intitulada Bayesian Outbreak Detection in the Presence of Reporting Delays, y que implementa una serie de métodos para estimar el número real de casos cuando las notificaciones de los positivos llegan tarde.
Contexto:
modelo <- lm(dist ~ speed, data = cars) Intervalos de confianza:
head(predict(modelo, interval = "confidence")) # fit lwr upr #1 -1.849460 -12.329543 8.630624 #2 -1.849460 -12.329543 8.630624 #3 9.947766 1.678977 18.216556 #4 9.947766 1.678977 18.216556 #5 13.880175 6.307527 21.452823 #6 17.812584 10.905120 24.720047 Intervalos de predicción:
head(predict(modelo, interval = "prediction")) # fit lwr upr #1 -1.849460 -34.49984 30.80092 #2 -1.849460 -34.49984 30.80092 #3 9.947766 -22.06142 41.95696 #4 9.947766 -22.06142 41.
Los (o ciertos) usuarios de R de Galicia están organizando una conferencia alrededor del mundo R de la mano de satRdays. Serán el sábado 12 de septiembre (de 2020) y los interesados en saber más al respecto, harán bien en visitar esta página.
De todos modos, si quieres presentar una charla o taller, el plazo límite parece ser el día 15 de abril.
Lee Justicia: los límites de la inteligencia artificial… y humana y cuando acabes, te propongo un pequeño experimento probabilístico. Por referencia, reproduzco aquí los criterios de justicia del artículo que glosa el que enlazo:
Centrémonos en (B), sabiendo que, por simetría, lo que cuento se aplica también a (C).
Supongamos que tenemos dos grupos, cada uno de ellos de
n <- 1000000 personas para estar en las asíntotas que aman los frecuentistas.
A veces tomas un artículo de vaya uno a saber qué disciplina, sismología, p.e., y no dejas de pensar: los métodos estadísticos que usa esta gente son de hace 50 años. Luego cabe preguntarse: ¿pasará lo mismo en estadística con respecto a otras disciplinas?
Por razones que no vienen al caso, me he visto en la tesitura de tener que encontrar mínimos de funciones que podrían cuasicatalogarse como de mínimos cuadrados no lineales.
No es algo que ocurra habitualmente. Creo que conozco a alguien que me dijo que lo tuvo que hacer una vez. Pero podría ocurrir en algún momento que tuvieses que analizar mezclas, es decir, situaciones experimentales en las que lo importante es la proporción de ciertos ingredientes (con la restricción obvia de que dichas proporciones suman la unidad).
Para más datos, Mixture Experiments in R Using mixexp, que describe el paquete de R mixexp.