Come simulare dati statisticamente significativi?


18

Sono in terza media e sto cercando di simulare i dati per un progetto di fiera della scienza di apprendimento automatico. Il modello finale verrà utilizzato sui dati del paziente e prevede la correlazione tra determinati periodi della settimana e l'effetto che ciò ha sull'aderenza del farmaco all'interno dei dati di un singolo paziente. I valori di aderenza saranno binari (0 significa che non hanno preso la medicina, 1 significa che l'hanno fatto). Sto cercando di creare un modello di apprendimento automatico in grado di apprendere dalla relazione tra il periodo della settimana e che abbia suddiviso la settimana in 21 fasce orarie, tre per ogni ora del giorno (1 è lunedì mattina, 2 è lunedì pomeriggio, eccetera.). Sto cercando di simulare dati per un valore di 1.000 pazienti. Ogni paziente avrà un valore di 30 settimane di dati. Voglio inserire alcune tendenze associate a un periodo della settimana e all'adesione. Per esempio, in un set di dati posso dire che l'intervallo di tempo 7 della settimana ha una relazione statisticamente significativa con l'adesione. Al fine di determinare se la relazione è statisticamente significativa o meno, mi richiederebbe di eseguire un test t a due campioni confrontando una fascia oraria con ciascuna delle altre e assicurarsi che il valore della significatività sia inferiore a 0,05.

Tuttavia, piuttosto che simulare i miei dati e verificare se le tendenze che ho inserito sono significative o meno, preferirei lavorare all'indietro e forse utilizzare un programma che potrei chiedere di assegnare a una determinata fascia oraria una tendenza significativa con aderenza, e ritornerebbe dati binari che contengono al suo interno la tendenza che ho richiesto, e anche dati binari per le altre fasce orarie che contengono del rumore ma non producono una tendenza statisticamente significativa.

Esiste un programma che può aiutarmi a ottenere qualcosa del genere? O forse un modulo Python?

Qualsiasi aiuto (anche commenti generali sul mio progetto) sarà estremamente apprezzato !!


4
Questa è un'ottima domanda E qualcosa del genere è ciò che la maggior parte degli scienziati dovrebbe fare prima di richiedere una sovvenzione, nella fase di progettazione dello studio. Vedo troppo spesso che le persone raccolgono prima i loro dati e provano a capire come analizzarli in seguito, con il risultato che lo statistico potrebbe solo essere in grado di dire di cosa è morto l'esperimento, con le parole di Ronald Fisher .
S. Kolassa - Ripristina Monica il

@StephanKolassa Tuttavia, è molto difficile valutare quali dati saranno disponibili in alcuni esperimenti con dati umani, e in altri
contesti

2
@llrs: è completamente corretto. E dovrebbe ovviamente informare l'esercizio di simulazione. Meglio pensare in anticipo a quali dati sono disponibili, piuttosto che scoprire dopo l'esperimento che non è possibile ottenere dati cruciali.
S. Kolassa - Ripristina Monica il

(+1) Trovo il voto per chiudere questa domanda in qualche modo discutibile
Robert Long,

@RobertLong, perché lo dici? Lo chiedo semplicemente perché voglio assicurarmi di non perdere nulla nella risposta che lo renda meno credibile.
Neelasha Bhattacharjee,

Risposte:


14

Commenti generali

  • "Sono in terza media e sto cercando di simulare i dati per un progetto di fiera della scienza di apprendimento automatico." Eccezionale. Non mi importava affatto della matematica in prima media; Penso di aver preso qualcosa come Algebra 2 quell'anno ...? Non vedo l'ora che tu mi lasci senza lavoro tra qualche anno! Di seguito alcuni consigli, ma: cosa stai cercando di imparare da questa simulazione? Con cosa hai già familiarità con la statistica e l'apprendimento automatico? Sapere questo aiuterebbe me (e gli altri) a mettere insieme un aiuto più specifico.

  • Python è un linguaggio molto utile, ma sono dell'opinione che R sia migliore per simulare i dati. La maggior parte dei libri / blog / studi / classi che ho incontrato sulla simulazione di dati (anche quelli che la gente chiama "metodi Monte Carlo" per essere fantasiosi) sono in R. Il linguaggio R è conosciuto come "dagli statistici, per gli statistici, "e la maggior parte degli accademici, che si basano su studi di simulazione per mostrare il loro metodo di lavoro, usano R. Molte funzioni interessanti sono nel linguaggio R di base (ovvero non sono necessari pacchetti aggiuntivi), come rnormper una distribuzione normale, runifper l'uniforme distribuzione, rbetaper la distribuzione beta e così via. In R, digitando ?Distributionsmostrerai una pagina di aiuto su di essi. Tuttavia, ci sono molti altri pacchetti interessanti come mvtnormosimstudyche sono utili. Consiglierei DataCamp.com per l'apprendimento di R, se conosci solo Python; Penso che siano buoni per essere delicatamente introdotti alle cose

  • Sembra che tu stia succedendo molto qui: vuoi dati nel tempo (longitudinali), all'interno del soggetto (forse usando un modello multilivello) e che abbiano una componente stagionale (forse un modello di serie temporale), tutti prevedendo un risultato dicotomico (qualcosa come una regressione logistica). Penso che molte persone che iniziano con gli studi di simulazione (incluso me stesso) vorrebbero mettere insieme un sacco di cose contemporaneamente, ma questo può essere davvero scoraggiante e complicato. Quindi quello che consiglierei di fare è iniziare con qualcosa di semplice - magari creare una o due funzioni per generare dati - e poi costruire da lì.

Commenti specifici

Sembra che la tua ipotesi di base sia: "L'ora del giorno prevede se qualcuno aderisce o meno all'assunzione delle medicine". E vuoi due creare due insiemi di dati simulati: quella in cui v'è un rapporto e uno in cui non c'è non è .

Si menziona anche la simulazione di dati per rappresentare più osservazioni della stessa persona. Ciò significa che ogni persona avrebbe la propria probabilità di aderenza e, forse, la propria inclinazione per la relazione tra ora del giorno e probabilità di aderenza. Suggerirei di esaminare modelli di regressione "multilivello" o "gerarchico" per questo tipo di relazione, ma penso che potresti iniziare più semplice di così.

Inoltre, menzioni una relazione continua tra tempo e probabilità di aderire al regime terapeutico, che mi fa anche pensare che la modellizzazione di serie temporali - in particolare guardando alle tendenze stagionali - ti sarebbe utile. Anche questo è simulabile, ma ancora una volta, penso che possiamo iniziare più semplice.

Diciamo che abbiamo 1000 persone e misuriamo se hanno preso o meno le loro medicine una sola volta. Sappiamo anche se sono stati assegnati a prenderlo al mattino, al pomeriggio o alla sera. Diciamo che prendere il farmaco è 1, non prenderlo è 0. Possiamo simulare dati dicotomici usando rbinomper i disegni da una distribuzione binomiale. Possiamo impostare ogni persona in modo che abbia 1 osservazione con una data probabilità. Diciamo che le persone hanno l'80% di probabilità di prenderlo al mattino, il 50% nel pomeriggio e il 65% di notte. Ho incollato il codice qui sotto, con alcuni commenti dopo #:

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)

Questo sommario mostra, in 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

Il Interceptrappresenta il pomeriggio e possiamo vedere che sia la sera che la mattina hanno una probabilità significativamente maggiore di aderire. Ci sono molti dettagli sulla regressione logistica che non posso spiegare in questo post, ma i test t presuppongono che tu abbia una variabile dipendente condizionata normalmente distribuita. I modelli di regressione logistica sono più appropriati quando si hanno esiti dicotomici (0 vs. 1) come questi. La maggior parte dei libri statistici introduttivi parlerà del test t , e molti libri introduttivi di machine learning parleranno della regressione logistica. Penso che l' introduzione all'apprendimento statistico: con Applications in R sia fantastica, e gli autori hanno pubblicato tutto online:https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf

Non sono sicuro dei buoni libri per gli studi di simulazione; Ho imparato solo facendo casino, leggendo ciò che altre persone hanno fatto e da un corso di laurea ho seguito il calcolo statistico (i materiali del professore sono qui: http://pj.freefaculty.org/guides/ ).

Infine, puoi anche simulare senza effetto impostando tutte le volte per avere la stessa probabilità:

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))

Che ritorna:

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

Ciò non mostra differenze significative tra i tempi, poiché ci si aspetterebbe che la probabilità sia la stessa tra i tempi.


Grazie mille per la raccomandazione sul libro! Proprio quello di cui avevo bisogno per leggere le vacanze!
MD-Tech

Grazie mille per questo! Sapevo che avevo bisogno di un modello di regressione logistica per l'aspetto dell'apprendimento automatico del mio progetto, ma sembra che abbia anche un'applicazione per simulare i dati. Tuttavia, avevo l'impressione che la regressione logistica richieda l'ordine dei tempi, ma in questo caso non è il caso poiché ogni volta è una categoria diversa senza alcuna relazione con l'altra. Sono giunto a questa conclusione dopo aver discusso con il mio insegnante di matematica, ma entrambi potremmo benissimo sbagliarci. Potresti chiarire perché qui si può usare esattamente la regressione logistica?
Neelasha Bhattacharjee,

@NeelashaBhattacharjee La simulazione dei dati e l'adattamento del modello di regressione logistica sono due passaggi separati: avremmo potuto simulare gli stessi dati e analizzarli utilizzando una tabella di contingenza e una statistica chi-quadrato se avessimo voluto. Hai ragione sul fatto che il modello adatto non codifica alcun ordine nei tempi. Tuttavia, i modelli di regressione fanno ipotesi su come viene distribuita la variabile dipendente , non sulle variabili indipendenti. Avremmo potuto ordinare predittori, predittori continui, contare predittori, ecc., E tutti andrebbero bene per la regressione logistica.
Mark White il

@NeelashaBhattacharjee La regressione logistica può essere utilizzata qui poiché stiamo modellando una variabile dipendente dicotomica, ovvero una con due e solo due possibili esiti. Quello che fa una regressione logistica è usare la "funzione di collegamento logistico" per fare in modo che tutti i valori previsti per l'equazione di regressione (ad esempio, b0 + b1 * x) si adattino tra 0 e 1. E chiamiamo questi numeri la probabilità che qualcuno abbia il valore variabile dipendente di 1.
Mark White il

Grazie mille! Tuttavia, mi chiedevo come hai potuto esaminare i valori p tra i due set di dati simulati e determinare se uno aveva un trend significativo e l'altro. Per me, entrambi gli insiemi hanno valori di p che variano abbastanza da essere significativi.
Neelasha Bhattacharjee,

4

Se conosci già un po 'di Python, sarai sicuramente in grado di ottenere ciò di cui hai bisogno usando Python di base insieme a numpye / o pandas. Come suggerisce Mark White, tuttavia, molte cose relative alla simulazione e alle statistiche sono inserite in R, quindi vale sicuramente la pena dare un'occhiata.

Di seguito è riportato un framework di base su come affrontarlo utilizzando una classe Python. È possibile utilizzare np.random.normalper regolare ilbaseline_adherence ciascun soggetto per inserire del rumore. Questo ti dà un'adesione pseudo-casuale, a cui puoi aggiungere l'adesione ridotta mirata in giorni specifici.

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

Questo è un grande progetto. Esiste una sfida per progetti come questo e il tuo metodo di utilizzo dei dati simulati è un ottimo modo per valutarli.

Hai un'ipotesi a priori, ad esempio "la gente è più smemorato di sera"? In tal caso, verrà testato da un test statistico che confronta la frequenza dell'oblio la sera rispetto al mattino. Questa è una distribuzione di Bernoulli, come dicevano i precedenti soccorritori.

L'altro approccio consiste nello scansionare i dati per scoprire quale fascia oraria ha la più alta percentuale di errori. Ce ne sarà sicuramente uno, quindi la domanda è "è solo un risultato casuale?". La soglia di significatività è più alta in questo caso. Se vuoi saperne di più su questo, cerca "tasso di rilevamento falso".

Nel tuo caso il sistema è abbastanza semplice da poter calcolare la soglia con un po 'di pensiero. Ma potrebbe anche essere usato il metodo generale: simula 1000 set di dati senza variazione di frequenza, quindi scopri la distribuzione di frequenza dei numeri bassi casuali. Confronta il tuo set di dati reale con esso. Se 1pm è lo slot sparse nei dati reali, ma i set di dati simulati 50/1000 hanno uno slot ugualmente sparse, il risultato non è affidabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.