Comentarios generales
"Estoy en décimo grado y estoy buscando simular datos para un proyecto de feria de ciencias de aprendizaje automático". Increíble. No me importaban las matemáticas en décimo grado; Creo que tomé algo como Álgebra 2 ese año ...? ¡No puedo esperar hasta que me dejen sin trabajo en unos años! Te doy algunos consejos a continuación, pero: ¿Qué estás tratando de aprender de esta simulación? ¿Con qué estás familiarizado en estadística y aprendizaje automático? Saber esto me ayudaría (y a otros) a reunir una ayuda más específica.
Python es un lenguaje muy útil, pero creo que R es mejor para simular datos. La mayoría de los libros / blogs / estudios / clases que he encontrado sobre la simulación de datos (también lo que la gente llama "métodos Monte Carlo" para ser elegantes) están en R. El lenguaje R se conoce como "estadísticos, para estadísticos, "y la mayoría de los académicos, que se basan en estudios de simulación para mostrar que sus métodos funcionan, usan R. Muchas funciones interesantes están en el lenguaje base R (es decir, no se necesitan paquetes adicionales), como rnorm
para una distribución normal, runif
para el uniforme distribución, rbeta
para la distribución beta, y así sucesivamente. En R, escribir ?Distributions
le mostrará una página de ayuda sobre ellos. Sin embargo, hay muchos otros paquetes geniales como mvtnorm
osimstudy
que son utiles Recomendaría DataCamp.com para aprender R, si solo conoces Python; Creo que son buenos para ser amablemente introducidos en las cosas.
Parece que está sucediendo mucho aquí: desea datos que están en el tiempo (longitudinales), dentro del tema (tal vez usando un modelo multinivel) y que tienen un componente estacional (tal vez un modelo de serie temporal), todos prediciendo Un resultado dicotómico (algo así como una regresión logística). Creo que muchas personas que comienzan con estudios de simulación (incluido yo mismo) quieren lanzar un montón de cosas a la vez, pero esto puede ser realmente desalentador y complicado. Entonces, lo que recomendaría hacer es comenzar con algo simple, tal vez hacer una función o dos para generar datos, y luego construir desde allí.
Comentarios Especificos
Parece que su hipótesis básica es: "La hora del día predice si alguien se adhiere o no a tomar su medicamento". Y que le gustaría dos crean dos conjuntos de datos simulados: Uno donde no es una relación y uno donde hay no .
También mencionas datos de simulación para representar múltiples observaciones de la misma persona. Esto significa que cada persona tendría su propia probabilidad de adhesión, así como, tal vez, su propia pendiente para la relación entre la hora del día y la probabilidad de adhesión. Sugeriría buscar modelos de regresión "multinivel" o "jerárquicos" para este tipo de relación, pero creo que podría comenzar de manera más simple que esto.
Además, usted menciona una relación continua entre el tiempo y la probabilidad de adherirse al régimen de medicamentos, lo que también me hace pensar que el modelado de series de tiempo, específicamente las tendencias estacionales, sería útil para usted. Esto también se puede simular, pero nuevamente, creo que podemos comenzar de manera más simple.
Digamos que tenemos 1000 personas, y medimos si tomaron o no su medicamento solo una vez. También sabemos si fueron asignados para tomarlo en la mañana, tarde o noche. Digamos que tomar el medicamento es 1, no tomarlo es 0. Podemos simular datos dicotómicos utilizando rbinom
para sorteos de una distribución binomial. Podemos establecer que cada persona tenga 1 observación con una probabilidad dada. Digamos que las personas tienen un 80% de probabilidades de tomarlo por la mañana, 50% por la tarde y 65% por la noche. Pego el código a continuación, con algunos comentarios después #
:
set.seed(1839) # this makes sure the results are replicable when you do it
n <- 1000 # sample size is 1000
times <- c("morning", "afternoon", "evening") # create a vector of times
time <- sample(times, n, TRUE) # create our time variable
# make adherence probabilities based on time
adhere_prob <- ifelse(
time == "morning", .80,
ifelse(
time == "afternoon", .50, .65
)
)
# simulate observations from binomial distribution with those probabilities
adhere <- rbinom(n, 1, adhere_prob)
# run a logistic regression, predicting adherence from time
model <- glm(adhere ~ time, family = binomial)
summary(model)
Este resumen muestra, en parte:
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.02882 0.10738 0.268 0.78839
timeevening 0.45350 0.15779 2.874 0.00405 **
timemorning 1.39891 0.17494 7.996 1.28e-15 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
El Intercept
representa la tarde, y podemos ver que tanto la tarde como la mañana tienen una probabilidad significativamente mayor de adherirse. Hay muchos detalles sobre la regresión logística que no puedo explicar en esta publicación, pero las pruebas t suponen que tiene una variable dependiente condicionalmente distribuida normalmente. Los modelos de regresión logística son más apropiados cuando tiene resultados dicotómicos (0 frente a 1) como estos. La mayoría de los libros de estadísticas introductorias hablarán sobre la prueba t , y muchos libros introductorios de aprendizaje automático hablarán sobre regresión logística. Creo que Introducción al aprendizaje estadístico: con aplicaciones en R es excelente, y los autores publicaron todo en línea:https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf
No estoy tan seguro de buenos libros para estudios de simulación; Aprendí solo jugando, leyendo lo que hicieron otras personas, y de un curso de posgrado tomé computación estadística (los materiales del profesor están aquí: http://pj.freefaculty.org/guides/ ).
Por último, también puede simular que no tiene ningún efecto configurando todos los tiempos para que tengan la misma probabilidad:
set.seed(1839)
n <- 1000
times <- c("morning", "afternoon", "evening")
time <- sample(times, n, TRUE)
adhere <- rbinom(n, 1, .6) # same for all times
summary(glm(adhere ~ time, binomial))
Que devuelve:
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.40306 0.10955 3.679 0.000234 ***
timeevening -0.06551 0.15806 -0.414 0.678535
timemorning 0.18472 0.15800 1.169 0.242360
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Esto no muestra diferencias significativas entre los tiempos, ya que esperaríamos que la probabilidad sea la misma en todos los tiempos.