21 votos

¿Cómo simular datos para ser estadísticamente significativa?

Estoy en grado 10 y estoy buscando para simular los datos de una máquina de aprendizaje proyecto de feria de ciencia. El modelo final será utilizada en los datos de los pacientes y predecir la correlación entre ciertos momentos de la semana y el efecto que esto tiene en el cumplimiento de la medicación dentro de los datos de un solo paciente. La adhesión de valores binarios (0 significa que no tome la medicina, el 1 significa que lo hizo). Yo estoy mirando para crear una máquina modelo de aprendizaje que es capaz de aprender a partir de la relación entre el tiempo de la semana, y se han separado de la semana en 21 ranuras de tiempo, tres para cada hora del día (1 es lunes por la mañana, 2 es lunes por la tarde, etc.). Estoy buscando para simular 1.000 pacientes pena de datos. Cada paciente tendrá un 30 semanas de datos. Quiero insertar ciertas tendencias asociadas a una hora de la semana y la adherencia. Por ejemplo, en un conjunto de datos puedo decir que el tiempo de la ranura 7 de la semana tiene una relación estadísticamente significativa con la adherencia. En fin para mí, para determinar si la relación es estadísticamente significativa o no requeriría me la realización de un two sample t-test de comparación de una ranura de tiempo para cada uno de los otros y asegúrese de que el valor de significación es menor de 0,05.

Sin embargo, en lugar de la simulación de mis propios datos y la comprobación de si las tendencias que se inserta son significativos o no, preferiría trabajar hacia atrás y tal vez usar un programa que yo podría pedir a asignar un determinado espacio de tiempo una tendencia significativa con la adherencia, y volvería datos binarios que contiene dentro de sí la tendencia me lo pidió, y también los datos binarios de las otras ranuras de tiempo que contiene un poco de ruido, pero no produce un efecto estadísticamente significativo de la tendencia.

¿Hay algún programa que me puede ayudar a lograr algo como esto? O tal vez un módulo de python?

Cualquier ayuda de cualquier tipo (incluso comentarios generales acerca de mi proyecto) será muy apreciada!!

16voto

Mark White Puntos 569

Comentarios Generales

  • "Estoy en grado 10 y estoy buscando para simular los datos de una máquina de aprendizaje proyecto de feria de ciencia." Impresionante. No me importaba en absoluto acerca de las matemáticas en grado 10; creo que me tomé algo como Álgebra 2 de ese año...? No puedo esperar hasta que me puso fuera de un puesto de trabajo en un par de años! Puedo dar algunos consejos a continuación, pero: ¿Qué estás tratando de aprender a partir de esta simulación? Lo que ya estás familiarizado con las estadísticas y de aprendizaje de la máquina? Sabiendo esto ayudaría a mí (y a otros) armar un poco más de ayuda específicos.

  • Python es un lenguaje útil, pero yo soy de la opinión de que R es mejor para la simulación de los datos. La mayoría de los libros/blogs/estudios/clases he llegado a través de la simulación de los datos (también lo que la gente llama "métodos de Monte Carlo" para ser de lujo) en R. El lenguaje R se conoce como "por los estadísticos, para los estadísticos," y la mayoría de los académicos-que se basan en los estudios de simulación para mostrar sus métodos de trabajo-utilizar R. Un montón de funciones interesantes están en la base del lenguaje R (es decir, no hay paquetes adicionales necesarios), como rnorm para una distribución normal, runif para la distribución uniforme, rbeta de la distribución beta, y así sucesivamente. En R, escribiendo en ?Distributions le mostrará una página de ayuda sobre ellos. Sin embargo, hay muchas otras fresco paquetes como mvtnorm o simstudy que son útiles. Yo recomendaría DataCamp.com para el aprendizaje de R, si solo sabes Python; yo creo que son buenos para llegar introducido suavemente a las cosas

  • Parece que tienes mucho que hacer aquí: desea Que los datos que están a lo largo del tiempo (longitudinal), de sujeto (tal vez usando un modelo multinivel), y tienen un componente estacional para ellos (tal vez un modelo de serie temporal), todas la predicción de un resultado dicotómicas (algo así como una regresión logística). Creo que mucha de la gente que comienza con los estudios de simulación (incluido yo mismo) que desee echar un montón de cosas a la vez, pero esto puede ser muy difícil y complicado. Entonces, ¿qué me recomendaría hacer es empezar con algo simple-quizá haciendo una función o dos para la generación de datos y, a continuación, construir a partir de ahí.

Comentarios Específicos

Parece que su hipótesis básica es: "La hora del día predice si o no una persona se adhiere a tomar su medicación." Y a usted le gustaría, dos, crear dos conjuntos de datos simulados: Uno donde no es una relación, y donde no hay no.

También mencionar la simulación de datos para representar múltiples observaciones de la misma persona. Esto significa que cada persona tiene su propia probabilidad de adherencia así como, tal vez, su propia pendiente de la relación entre el tiempo de día y probabilidad de adherirse. Yo sugeriría mirar en "multinivel" o "jerárquica" de los modelos de regresión para este tipo de relación, pero creo que se podría empezar más sencillo que esto.

También, se menciona una relación de continuidad entre el tiempo y la probabilidad de adherirse al régimen de medicación, lo que me hace pensar también en las series de tiempo de modelado-específicamente en las tendencias de la temporada-sería útil para usted. Esto también es simular, pero de nuevo, creo que podemos empezar más simple.

Digamos que tenemos 1000 personas, y podemos medir si son o no tomó su medicamento sólo una vez. También sabemos que si ellos fueron asignados a la toma en la mañana, la tarde o la noche. Digamos que tomar la medicina es 1, no teniendo es 0. Podemos simular dicotómica de datos usando rbinom de sorteos a partir de una distribución binomial. Podemos establecer que cada persona tenga 1 observación con una determinada probabilidad. Vamos a decir que la gente está un 80% de probabilidades de tomar en la mañana, el 50% en la tarde, y el 65% en la noche. Me pegue el código de abajo, con algunos comentarios después de la #:

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 noche y la mañana son significativamente mayor probabilidad de adherirse. Hay un montón de detalles acerca de regresión logística que no puedo explicar en este post, pero t-pruebas suponga que tiene un condicional normalmente distribuida de la variable dependiente. Modelos de regresión logística son más apropiadas cuando se tiene dicotómica (0 vs 1) los resultados como estos. La mayoría de introducción a las estadísticas, libros hablará sobre el t-test, y un montón de actividades de aprendizaje de la máquina libros de hablar de regresión logística. Creo Introducción a la Estadística de Aprendizaje: Con Aplicaciones en R es grande, y los autores publicados en línea todo el asunto: https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf

Yo no estoy tan seguro acerca de los buenos libros para los estudios de simulación; aprendí de cachondeo, de leer lo que otras personas hicieron, y de un curso de postgrado tomé en informática de estadística (profesor de materiales están aquí: http://pj.freefaculty.org/guides/).

Por último, también puede simular tener ningún efecto por la configuración de todos los tiempos tienen 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 muestra que no hay diferencias significativas entre los tiempos, como cabría esperar de la probabilidad de ser el mismo a través de los tiempos.

4voto

NessDan Puntos 545

Si sabes algo de Python, entonces definitivamente va a ser capaz de conseguir lo que usted necesita usar la base de Python junto con numpy y/o pandas. Como Marca Blanca sugiere sin embargo, un montón de simulación y estadísticas relacionadas con la materia que está cocido al horno en R, por lo que definitivamente vale la pena un vistazo.

A continuación es un marco básico para que puedan acercarse a este uso de una clase de Python. Usted podría utilizar np.random.normal para ajustar el baseline_adherence de cada tema para insertar un poco de ruido. Esto le da una pseudo-aleatorio de la adhesión, a los que se puede agregar, el objetivo de reducción de la adherencia 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")

2voto

chrishmorris Puntos 9

Este es un gran proyecto. Hay un reto para este tipo de proyectos, y su método de utilización de los datos simulados es una gran manera de evaluar.

¿Tiene usted una hipótesis a priori, por ejemplo, "las personas son más olvidadizos en la noche"? En ese caso, una prueba estadística que compara la frecuencia de olvidar en la noche en comparación con la mañana de la prueba. Esta es una distribución de Bernoulli, como anterior a los socorristas, dijo.

El otro enfoque es el de arrastre de tus datos para averiguar que la ranura de tiempo tiene la tasa más alta de fracaso. No está obligado a ser uno, así que la pregunta es "¿esto es sólo una posibilidad resultado?". El umbral de significación es mayor en este caso. Si quieres leer acerca de esto, la búsqueda para la "tasa de falso descubrimiento".

En su caso, el sistema es bastante simple que se puede calcular el umbral con un poco de pensamiento. Pero en general, el método podría ser utilizado también: similate 1000 conjuntos de datos con la no variación de la frecuencia, a continuación, busque la distribución de la frecuencia de coincidencia de números bajos. Comparar su verdadero conjunto de datos. Si la 1pm es la escasa ranura en los datos reales, pero 50/1000 conjuntos de datos simulados tienen igualmente escasa ranura, entonces el resultado no es robusto.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X