Comentários gerais
"Estou na 10ª série e pretendo simular dados para um projeto de feira de ciências de aprendizado de máquina". Impressionante. Eu não me importava com matemática na 10ª série; Eu acho que peguei algo como Álgebra 2 naquele ano ...? Mal posso esperar até você me deixar de trabalhar em alguns anos! Dou alguns conselhos abaixo, mas: O que você está tentando aprender com esta simulação? Com o que você já está familiarizado em estatística e aprendizado de máquina? Saber disso me ajudaria (e outros) a reunir alguma ajuda mais específica.
Python é uma linguagem muito útil, mas sou da opinião de que R é melhor para simular dados. A maioria dos livros / blogs / estudos / aulas que encontrei sobre a simulação de dados (também o que as pessoas chamam de "métodos de Monte Carlo" são chiques) estão em R. A linguagem R é conhecida como "por estatísticos, para estatísticos, "e a maioria dos acadêmicos - que dependem de estudos de simulação para mostrar que seus métodos funcionam - usam R. Muitas funções interessantes estão na linguagem R básica (ou seja, nenhum pacote adicional necessário), como rnorm
para uma distribuição normal, runif
para o uniforme distribuição, rbeta
para a distribuição beta, e assim por diante. No R, digitar ?Distributions
mostrará uma página de ajuda sobre eles. No entanto, existem muitos outros pacotes interessantes, como mvtnorm
ousimstudy
que são úteis. Eu recomendaria o DataCamp.com para aprender R, se você apenas conhece Python; Eu acho que eles são bons para serem gentilmente apresentados às coisas
Parece que você tem muita coisa acontecendo aqui: você quer dados com o tempo (longitudinal), dentro do assunto (talvez usando um modelo multinível) e que tenham um componente sazonal (talvez um modelo de série temporal), todos prevendo um resultado dicotômico (algo como uma regressão logística). Acho que muitas pessoas que começam os estudos de simulação (inclusive eu) querem jogar um monte de coisas de uma só vez, mas isso pode ser realmente assustador e complicado. Então, o que eu recomendaria fazer é começar com algo simples - talvez criar uma função ou duas para gerar dados - e depois construir a partir daí.
Comentários específicos
Parece que sua hipótese básica é: "A hora do dia prediz se alguém adere ou não a tomar seus medicamentos". E você gostaria dois criam dois conjuntos de dados simulados: um onde não é um relacionamento e aquele em que há não .
Você também menciona a simulação de dados para representar várias observações da mesma pessoa. Isso significa que cada pessoa teria sua própria probabilidade de adesão, bem como, talvez, sua própria inclinação para a relação entre hora do dia e probabilidade de adesão. Eu sugeriria olhar para modelos de regressão "multinível" ou "hierárquico" para esse tipo de relacionamento, mas acho que você poderia começar mais simples que isso.
Além disso, você menciona uma relação contínua entre tempo e probabilidade de aderir ao regime de medicação, o que também me faz pensar que a modelagem de séries temporais - olhando especificamente para as tendências sazonais - seria útil para você. Isso também é capaz de simular, mas, novamente, acho que podemos começar mais simples.
Digamos que temos 1000 pessoas e medimos se eles tomaram ou não seus remédios apenas uma vez. Também sabemos se eles foram designados para levá-lo pela manhã, tarde ou noite. Digamos que tomar o medicamento seja 1 e não 0. Podemos simular dados dicotômicos usando rbinom
empates de uma distribuição binomial. Podemos definir que cada pessoa tenha 1 observação com uma determinada probabilidade. Digamos que as pessoas tenham 80% de chance de tomá-lo pela manhã, 50% à tarde e 65% à noite. Eu colo o código abaixo, com alguns comentários depois #
:
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 resumo mostra, em 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
O Intercept
representa a tarde, e podemos ver que a noite e a manhã têm uma probabilidade significativamente maior de aderir. Há muitos detalhes sobre a regressão logística que não posso explicar neste post, mas os testes t presumem que você tenha uma variável dependente condicionalmente distribuída normalmente. Modelos de regressão logística são mais apropriados quando você tem resultados dicotômicos (0 vs. 1) como esses. A maioria dos livros introdutórios de estatística fala sobre o teste t , e muitos livros introdutórios de aprendizado de máquina falam sobre regressão logística. Eu acho ótimo Introdução ao aprendizado estatístico: com aplicativos em R , e os autores postaram tudo online:https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf
Não tenho tanta certeza sobre bons livros para estudos de simulação; Eu aprendi apenas brincando, lendo o que as outras pessoas fizeram, e em um curso de graduação que fiz em computação estatística (os materiais do professor estão aqui: http://pj.freefaculty.org/guides/ ).
Por fim, você também pode simular sem efeito, definindo todos os tempos para ter a mesma probabilidade:
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 retorna:
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
Isso não mostra diferenças significativas entre os tempos, como seria de esperar da probabilidade ser a mesma ao longo dos tempos.