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 rnorm
per una distribuzione normale, runif
per l'uniforme distribuzione, rbeta
per la distribuzione beta e così via. In R, digitando ?Distributions
mostrerai una pagina di aiuto su di essi. Tuttavia, ci sono molti altri pacchetti interessanti come mvtnorm
osimstudy
che 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 rbinom
per 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 Intercept
rappresenta 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.