Uwagi ogólne
„Mam 10 klasę i staram się symulować dane dla projektu targów nauki maszynowego”. Niesamowite. W ogóle nie dbałem o matematykę w 10. klasie; Myślę, że wziąłem coś takiego jak Algebra 2 tego roku ...? Nie mogę się doczekać, aż zwolnisz mnie z pracy za kilka lat! Poniżej podaję kilka rad, ale: Czego próbujesz się nauczyć z tej symulacji? Co znasz już w statystyce i uczeniu maszynowym? Wiedza o tym pomogłaby mi (i innym) zebrać bardziej szczegółową pomoc.
Python jest bardzo przydatnym językiem, ale uważam, że R jest lepszy do symulacji danych. Większość książek / blogów / badań / zajęć, na które natknąłem się na symulowanie danych (również to, co ludzie nazywają „metodami Monte Carlo” jako wymyślnymi), jest w języku R. Język statystyczny jest znany przez statystyków, dla statystyk, „i większość naukowców - którzy opierają się na badaniach symulacyjnych w celu wykazania, że ich metody działają - używa R. Wiele fajnych funkcji znajduje się w podstawowym języku R (to znaczy, nie są wymagane żadne dodatkowe pakiety), na przykład rnorm
dla normalnej dystrybucji, runif
dla munduru dystrybucja, dystrybucja rbeta
beta i tak dalej. W R wpisanie ?Distributions
spowoduje wyświetlenie na nich strony pomocy. Istnieje jednak wiele innych fajnych pakietów, takich jak mvtnorm
lubsimstudy
które są przydatne. Poleciłbym DataCamp.com do nauki języka R, jeśli znasz tylko Python; Myślę, że są dobre do łagodnego wprowadzenia do rzeczy
Wygląda na to, że dużo się tu dzieje: chcesz danych, które są z czasem (podłużne), wewnątrz podmiotu (być może przy użyciu modelu wielopoziomowego) i mają do nich komponent sezonowy (być może model szeregów czasowych), wszystkie przewidujące dychotomiczny wynik (coś w rodzaju regresji logistycznej). Myślę, że wiele osób rozpoczynających studia symulacyjne (w tym ja) chce wrzucić wiele rzeczy na raz, ale może to być naprawdę zniechęcające i skomplikowane. Dlatego zalecałbym zacząć od czegoś prostego - na przykład zrobienia jednej lub dwóch funkcji do generowania danych - a następnie zbudować stamtąd.
Szczegółowe uwagi
Wygląda na to, że twoja podstawowa hipoteza brzmi: „Pora dnia pozwala przewidzieć, czy ktoś przyjmie leki”. I chcesz utworzyć dwa symulowane dwa zestawy danych: jeden, gdzie nie ma związku i jeden tam gdzie nie .
Wspominasz także o symulowaniu danych w celu reprezentowania wielu obserwacji tej samej osoby. Oznacza to, że każda osoba ma swoje własne prawdopodobieństwo przestrzegania, a także, być może, własne nachylenie zależności między porą dnia a prawdopodobieństwem przestrzegania. Sugerowałbym przyjrzenie się modelom regresji „wielopoziomowej” lub „hierarchicznej” dla tego rodzaju relacji, ale myślę, że można zacząć od czegoś prostszego.
Wspominasz także o ciągłym związku między czasem a prawdopodobieństwem zastosowania się do schematu leczenia, co sprawia, że myślę, że modelowanie szeregów czasowych - szczególnie patrząc na trendy sezonowe - byłoby dla ciebie pomocne. Można to również symulować, ale myślę, że możemy zacząć od prostszego.
Załóżmy, że mamy 1000 osób i mierzymy, czy przyjmowali lek tylko raz. Wiemy również, czy przydzielono je do przyjmowania rano, po południu czy wieczorem. Powiedzmy, że przyjmowanie leku wynosi 1, a nie przyjmowanie 0. Możemy symulować dane dychotomiczne, używając rbinom
do rysowania z rozkładu dwumianowego. Każdą osobę możemy ustawić na 1 obserwację z danym prawdopodobieństwem. Powiedzmy, że ludzie mają 80% szans na przyjęcie rano, 50% po południu i 65% w nocy. Wklejam poniższy kod z kilkoma komentarzami po #
:
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)
To podsumowanie pokazuje częściowo:
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
Intercept
Reprezentuje popołudnie, i widzimy, że zarówno wieczorem i rano są znacznie wyższe prawdopodobieństwo przywierania. Istnieje wiele szczegółów na temat regresji logistycznej, których nie mogę wyjaśnić w tym poście, ale testy t zakładają, że masz zmienną zależną warunkowo normalnie dystrybuowaną. Modele regresji logistycznej są bardziej odpowiednie, gdy masz dychotomiczne wyniki (0 vs. 1) takie jak te. Większość książek o statystykach wprowadzających będzie mówić o t- teście, a wiele książek o wprowadzaniu do maszyn będzie mówić o regresji logistycznej. Myślę, że wprowadzenie do uczenia statystycznego: z aplikacjami w języku R jest świetne, a autorzy opublikowali wszystko online:https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf
Nie jestem pewien co do dobrych książek do badań symulacyjnych; Nauczyłem się po prostu grzebiąc, czytając to, co zrobili inni, i na studiach podyplomowych zacząłem obliczenia statystyczne (materiały profesora znajdują się tutaj: http://pj.freefaculty.org/guides/ ).
Na koniec możesz także przeprowadzić symulację bez efektu, ustawiając wszystkie czasy na takie samo prawdopodobieństwo:
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))
Które zwraca:
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
Nie pokazuje to znaczących różnic między czasami, ponieważ można by oczekiwać, że prawdopodobieństwo będzie takie samo w czasie.