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 rnormdla normalnej dystrybucji, runifdla munduru dystrybucja, dystrybucja rbetabeta i tak dalej. W R wpisanie ?Distributionsspowoduje wyświetlenie na nich strony pomocy. Istnieje jednak wiele innych fajnych pakietów, takich jak mvtnormlubsimstudyktó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 rbinomdo 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
InterceptReprezentuje 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.