¿Cómo simular datos para que sean estadísticamente significativos?


18

Estoy en décimo grado y estoy buscando simular datos para un proyecto de feria de ciencias de aprendizaje automático. El modelo final se usará en los datos del paciente y predecirá la correlación entre ciertos momentos de la semana y el efecto que esto tiene sobre la adherencia a la medicación dentro de los datos de un solo paciente. Los valores de adherencia serán binarios (0 significa que no tomaron el medicamento, 1 significa que sí). Estoy buscando crear un modelo de aprendizaje automático que pueda aprender de la relación entre la hora de la semana, y separé la semana en 21 franjas horarias, tres para cada hora del día (1 es lunes por la mañana, 2 es lunes por la tarde, etc.) Estoy buscando simular datos de 1,000 pacientes. Cada paciente tendrá un valor de 30 semanas de datos. Quiero insertar ciertas tendencias asociadas con un momento de la semana y la adherencia. Por ejemplo, En un conjunto de datos, puedo decir que el intervalo de tiempo 7 de la semana tiene una relación estadísticamente significativa con la adherencia. Para poder determinar si la relación es estadísticamente significativa o no, me requeriría realizar una prueba t de dos muestras comparando un intervalo de tiempo con cada uno de los otros y asegurarme de que el valor de significancia sea menor que 0.05.

Sin embargo, en lugar de simular mis propios datos y verificar si las tendencias que inserté son significativas o no, prefiero trabajar hacia atrás y tal vez usar un programa al que podría pedirle que asigne un cierto intervalo de tiempo a una tendencia significativa con adherencia, y volvería datos binarios que contienen dentro de él la tendencia que solicité, y también datos binarios para los otros intervalos de tiempo que contienen algo de ruido pero no producen una tendencia estadísticamente significativa.

¿Hay algún programa que pueda ayudarme a lograr algo como esto? ¿O tal vez un módulo de Python?

¡Cualquier ayuda (incluso comentarios generales sobre mi proyecto) será muy apreciada!


44
Esta es una gran pregunta. Y algo como esto es lo que la mayoría de los científicos deberían hacer antes de solicitar una subvención, en la fase de diseño del estudio. Veo con demasiada frecuencia que las personas recopilan sus datos primero e intentan descubrir cómo analizarlos después, con el resultado de que el estadístico solo puede decir de qué murió el experimento, en palabras de Ronald Fisher .
S. Kolassa - Restablece a Mónica el

@StephanKolassa Sin embargo, es muy difícil de evaluar lo que estará disponible en algunos experimentos con datos humanos de datos, y en otros usos de ajuste de una de datos que está disponible y no puede recoger más ...
LLR

2
@llrs: Eso es completamente correcto. Y, por supuesto, debe informar el ejercicio de simulación. Es mejor pensar de antemano sobre qué datos están disponibles, en lugar de descubrir después del experimento que no se pueden obtener datos cruciales.
S. Kolassa - Restablece a Mónica el

(+1) Encuentro que el voto para cerrar esta pregunta es algo objetable
Robert Long

@RobertLong, ¿por qué dices eso? Pregunto simplemente porque quiero asegurarme de que no me falta nada en la respuesta que lo haga menos creíble.
Neelasha Bhattacharjee

Respuestas:


14

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 rnormpara una distribución normal, runifpara el uniforme distribución, rbetapara la distribución beta, y así sucesivamente. En R, escribir ?Distributionsle mostrará una página de ayuda sobre ellos. Sin embargo, hay muchos otros paquetes geniales como mvtnormosimstudyque 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 rbinompara 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 Interceptrepresenta 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.


¡Muchas gracias por la recomendación del libro! Justo lo que necesitaba para leer en vacaciones!
MD-Tech

muchas gracias por esto! Sabía que necesitaba un modelo de regresión logística para el aspecto de aprendizaje automático de mi proyecto, pero parece que también tiene una aplicación para simular los datos. Sin embargo, tenía la impresión de que la regresión logística requiere que el orden de los tiempos importe, pero en este caso ese no es el caso, ya que cada vez es una categoría diferente sin relación con la otra. Llegué a esta conclusión después de discutir con mi profesor de matemáticas, pero ambos podríamos estar equivocados. ¿Podría aclarar por qué exactamente se puede usar la regresión logística aquí?
Neelasha Bhattacharjee

@NeelashaBhattacharjee Simular los datos y ajustar el modelo de regresión logística son dos pasos separados: podríamos haber simulado los mismos datos y analizarlos utilizando una tabla de contingencia y una estadística de chi-cuadrado si quisiéramos. Tienes razón en que el modelo que calzo no codifica ningún orden en los tiempos. Sin embargo, los modelos de regresión hacen suposiciones sobre cómo se distribuye la variable dependiente , no las variables independientes. Podríamos tener predictores ordenados, predictores continuos, predictores de conteo, etc., y todos ellos estarían bien para la regresión logística.
Mark White

@NeelashaBhattacharjee La regresión logística se puede usar aquí ya que estamos modelando una variable dependiente dicotómica, es decir, una con dos y solo dos posibles resultados. Lo que hace una regresión logística es usar la "función de enlace logístico" para hacer que todos los valores predichos para la ecuación de regresión (p. Ej., B0 + b1 * x) se ajusten entre 0 y 1. Y llamamos a estos números la probabilidad de que alguien tenga valor de la variable dependiente de 1.
Mark White

Muchas gracias! Sin embargo, me preguntaba cómo fue capaz de observar los valores p entre los dos conjuntos de datos simulados y determinar si uno tenía una tendencia significativa y el otro. Para mí, ambos conjuntos tienen valores de p que varían lo suficiente como para ser significativos.
Neelasha Bhattacharjee

4

Si ya conoces algo de Python, definitivamente podrás lograr lo que necesitas usando Python base junto con numpyy / o pandas. Sin embargo, como sugiere Mark White, muchas cosas relacionadas con simulación y estadísticas están integradas en R, por lo que definitivamente vale la pena echarle un vistazo.

A continuación se muestra un marco básico sobre cómo puede abordar esto usando una clase Python. Puede usar np.random.normalpara ajustar el baseline_adherencede cada sujeto para insertar algo de ruido. Esto le proporciona una adherencia pseudoaleatoria, a la que puede agregar la adherencia reducida específica en días específicos.

import pandas as pd
import numpy as np

from itertools import product

class Patient:

    def __init__(self, number, baseline_adherence=0.95):
        self.number = number
        self.baseline_adherence = baseline_adherence
        self.schedule = self.create_schedule()

    def __repr__(self):
        return "I am patient number {}".format(self.number)

    def create_schedule(self):

        time_slots = []
        for (day, time) in product(range(1, 8), range(1, 4)):
            time_slots.append("Day {}; Slot {}".format(day, time))
        week_labels = ["Week {}".format(x) for x in range(1, 31)]
        df = pd.DataFrame(np.random.choice([0, 1],
                                           size=(30, 21),#1 row per week, 1 column per time slot
                                           p=(1-self.baseline_adherence, self.baseline_adherence)),
                          index=week_labels,
                          columns=time_slots
                         )
        return df

    def targeted_adherence(self, timeslot, adherence=0.8):

        if timeslot in self.schedule.columns:
            ad = np.random.choice([0, 1],
                                  size=self.schedule[timeslot].shape,
                                  p=(1-adherence, adherence)
                                 )
            self.schedule[timeslot] = ad


sim_patients = [Patient(x) for x in range(10)]
p = sim_patients[0]
p.targeted_adherence("Day 1; Slot 3")

1

Este es un gran proyecto. Hay un desafío para proyectos como este, y su método de usar datos simulados es una excelente manera de evaluarlos.

¿Tiene una hipótesis a priori, por ejemplo, "las personas son más olvidadizas por la noche"? En ese caso, una prueba estadística que compara la frecuencia del olvido en la noche en comparación con la mañana lo probará. Esta es una distribución de Bernoulli, como dijeron los respondedores anteriores.

El otro enfoque es rastrear sus datos para averiguar qué intervalo de tiempo tiene la tasa más alta de falla. Es probable que haya uno, por lo que la pregunta es "¿es solo un resultado casual?". El umbral de significancia es más alto en este caso. Si desea leer más sobre esto, busque "tasa de descubrimiento falso".

En su caso, el sistema es lo suficientemente simple como para que pueda calcular el umbral con un poco de reflexión. Pero también se podría utilizar el método general: 1000 conjuntos de datos similares sin variación de velocidad, luego averiguar la distribución de frecuencias de números bajos coincidentes. Compare su conjunto de datos real con él. Si 1pm es el espacio escaso en los datos reales, pero 50/1000 conjuntos de datos simulados tienen un espacio igualmente escaso, entonces el resultado no es sólido.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.