Como simular dados para serem estatisticamente significativos?


18

Estou na 10ª série e pretendo simular dados para um projeto de feira de ciências de aprendizado de máquina. O modelo final será usado nos dados do paciente e preverá a correlação entre determinados horários da semana e o efeito que isso tem na adesão ao medicamento nos dados de um único paciente. Os valores de adesão serão binários (0 significa que eles não tomaram o medicamento, 1 significa que eles tomaram). Estou procurando criar um modelo de aprendizado de máquina capaz de aprender com o relacionamento entre a hora da semana e separar a semana em 21 horários, três para cada hora do dia (1 é segunda-feira pela manhã, 2 é segunda-feira à tarde, etc.) Eu estou procurando simular 1.000 pacientes no valor de dados. Cada paciente terá 30 semanas de dados. Quero inserir certas tendências associadas a um horário da semana e aderência. Por exemplo, em um conjunto de dados, posso dizer que o intervalo de tempo 7 da semana tem uma relação estatisticamente significativa com a adesão. Para determinar se o relacionamento é estatisticamente significativo ou não, seria necessário realizar um teste t de duas amostras comparando um intervalo de tempo com cada um dos outros e garantir que o valor de significância seja menor que 0,05.

No entanto, em vez de simular meus próprios dados e verificar se as tendências que inseri são significativas ou não, prefiro trabalhar de trás para frente e talvez usar um programa que eu poderia pedir para atribuir a um determinado intervalo de tempo uma tendência significativa com aderência e retornaria dados binários que contêm a tendência solicitada e também dados binários para os outros intervalos de tempo que contêm algum ruído, mas não produzem uma tendência estatisticamente significativa.

Existe algum programa que possa me ajudar a conseguir algo assim? Ou talvez um módulo python?

Qualquer ajuda (mesmo comentários gerais sobre o meu projeto) será extremamente apreciada!


4
Esta é uma grande pergunta. E algo assim é o que a maioria dos cientistas deveria fazer antes de solicitar uma bolsa, na fase de desenho do estudo. Vejo com muita frequência que as pessoas coletam seus dados primeiro e tentam descobrir como analisá-los depois, com o resultado de que o estatístico pode apenas ser capaz de dizer do que o experimento morreu, nas palavras de Ronald Fisher .
S. Kolassa - Restabelece Monica

@StephanKolassa No entanto, é muito difícil avaliar quais dados estarão disponíveis em alguns experimentos com dados humanos e, em outras configurações, um usa dados que estão disponíveis e não podem coletar mais ...
llrs

2
@llrs: Isso está completamente correto. E, é claro, deve informar o exercício de simulação. É melhor pensar antecipadamente sobre quais dados estão disponíveis, em vez de descobrir após o experimento que dados cruciais não podem ser obtidos.
S. Kolassa - Restabelece Monica

(+1) Acho que a votação para encerrar esta pergunta é um tanto censurável
Robert Long

@RobertLong, por que você diz isso? Pergunto simplesmente porque quero ter certeza de que não estou perdendo nada na resposta que a torne menos credível.
Neelasha Bhattacharjee

Respostas:


14

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 rnormpara uma distribuição normal, runifpara o uniforme distribuição, rbetapara a distribuição beta, e assim por diante. No R, digitar ?Distributionsmostrará uma página de ajuda sobre eles. No entanto, existem muitos outros pacotes interessantes, como mvtnormousimstudyque 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 rbinomempates 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 Interceptrepresenta 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.


Muito obrigado pela recomendação do livro! Apenas o que eu precisava para a leitura de férias!
MD-Tech

Muito obrigado por isso! Eu sabia que precisava de um modelo de regressão logística para o aspecto de aprendizado de máquina do meu projeto, mas parece ter uma aplicação para simular os dados também. No entanto, fiquei com a impressão de que a regressão logística exige que a ordem dos tempos seja importante, mas nesse caso não é o caso, pois cada vez é uma categoria diferente, sem relação com a outra. Cheguei a essa conclusão depois de discutir com meu professor de matemática, mas nós dois podemos estar errados. Você poderia esclarecer por que exatamente a regressão logística pode ser usada aqui?
Neelasha Bhattacharjee

@NeelashaBhattacharjee Simular os dados e ajustar o modelo de regressão logística são duas etapas separadas - poderíamos simular os mesmos dados e analisá-los usando uma tabela de contingência e estatística de qui-quadrado, se quiséssemos. Você está certo de que o modelo que eu me encaixo não codifica nenhuma ordem nos tempos. No entanto, os modelos de regressão fazem suposições sobre como a variável dependente é distribuída, e não as variáveis ​​independentes. Poderíamos ter ordenado preditores, preditores contínuos, preditores de contagem etc., e todos eles seriam adequados para a regressão logística.
Mark20:

@NeelashaBhattacharjee A regressão logística pode ser usada aqui, pois estamos modelando uma variável dependente dicotômica - ou seja, uma com dois e apenas dois resultados possíveis. O que uma regressão logística faz é usar a "função de ligação logística" para ajustar todos os valores previstos para a equação de regressão (por exemplo, b0 + b1 * x) entre 0 e 1. E chamamos esses números de probabilidade de que alguém tenha a valor variável dependente de 1. #
Mark White

Muito obrigado! No entanto, eu queria saber como você era capaz de analisar os valores de p entre os dois conjuntos de dados simulados e determinar se um tinha uma tendência significativa e o outro. Para mim, os dois conjuntos têm valores de p que variam o suficiente para serem significativos.
Neelasha Bhattacharjee

4

Se você já conhece algum Python, definitivamente poderá conseguir o que precisa usando o Python base junto com numpye / ou pandas. Como Mark White sugere, porém, muitas coisas relacionadas a estatísticas e estatísticas são incorporadas ao R, então vale a pena dar uma olhada.

Abaixo está uma estrutura básica de como você pode abordar isso usando uma classe Python. Você pode usar np.random.normalpara ajustar o baseline_adherenceassunto de cada um para inserir algum ruído. Isso fornece uma aderência pseudo-aleatória, à qual você pode adicionar a aderência reduzida direcionada em dias específicos.

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

Este é um ótimo projeto. Há um desafio para projetos como esse, e seu método de usar dados simulados é uma ótima maneira de avaliá-los.

Você tem uma hipótese a priori, por exemplo, "as pessoas esquecem mais à noite"? Nesse caso, um teste estatístico que compara a frequência do esquecimento à noite em comparação com a manhã o testará. Esta é uma distribuição de Bernoulli, como disseram os respondentes anteriores.

A outra abordagem é rastrear seus dados para descobrir qual intervalo de tempo tem a maior taxa de falhas. É provável que haja um, então a pergunta é "este é apenas um resultado casual?". O limite de significância é mais alto neste caso. Se você quiser ler sobre isso, pesquise "taxa de descoberta falsa".

No seu caso, o sistema é simples o suficiente para que você possa calcular o limite com um pouco de reflexão. Mas o método geral também pode ser usado: simule 1000 conjuntos de dados sem variação de taxa e descubra a distribuição de frequência de números baixos coincidentes. Compare seu conjunto de dados real com ele. Se 13:00 for o slot esparso nos dados reais, mas os conjuntos de dados simulados 50/1000 tiverem um slot igualmente esparso, o resultado não será robusto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.