Wie kann man Daten simulieren, um statistisch signifikant zu sein?


18

Ich bin in der 10. Klasse und möchte Daten für ein Projekt auf einer Messe für maschinelles Lernen simulieren. Das endgültige Modell wird für Patientendaten verwendet und sagt die Korrelation zwischen bestimmten Zeiten der Woche und den Auswirkungen voraus, die dies auf die Medikamenteneinhaltung innerhalb der Daten eines einzelnen Patienten hat. Die Adhärenzwerte sind binär (0 bedeutet, dass sie das Arzneimittel nicht eingenommen haben, 1 bedeutet, dass sie es getan haben). Ich möchte ein Modell für maschinelles Lernen erstellen, das aus der Beziehung zwischen der Wochenzeit lernen kann, und habe die Woche in 21 Zeitfenster unterteilt, drei für jede Tageszeit (1 ist Montagmorgen, 2 ist Montagnachmittag, etc.). Ich möchte Daten für 1.000 Patienten simulieren. Jeder Patient wird 30 Wochen Daten haben. Ich möchte bestimmte Trends einfügen, die mit einer Zeit der Woche und der Einhaltung verbunden sind. Beispielsweise, In einem Datensatz kann ich sagen, dass Zeitfenster 7 der Woche einen statistisch signifikanten Zusammenhang mit der Einhaltung hat. Damit ich feststellen kann, ob die Beziehung statistisch signifikant ist oder nicht, muss ich einen t-Test mit zwei Stichproben durchführen, bei dem ein Zeitfenster mit dem anderen verglichen wird, und sicherstellen, dass der Signifikanzwert unter 0,05 liegt.

Anstatt jedoch meine eigenen Daten zu simulieren und zu überprüfen, ob die von mir eingefügten Trends signifikant sind oder nicht, würde ich lieber rückwärts arbeiten und möglicherweise ein Programm verwenden, das ich bitten könnte, einem bestimmten Zeitfenster einen signifikanten Trend mit Einhaltung zuzuweisen, und es würde zurückkehren Binärdaten, die den von mir gewünschten Trend enthalten, sowie Binärdaten für die anderen Zeitfenster, die Rauschen enthalten, jedoch keinen statistisch signifikanten Trend erzeugen.

Gibt es ein Programm, mit dem ich so etwas erreichen kann? Oder vielleicht ein Python-Modul?

Jede Hilfe (auch allgemeine Kommentare zu meinem Projekt) wird sehr geschätzt !!


4
Das ist eine gute Frage. Und so etwas sollten die meisten Wissenschaftler tun, bevor sie sich in der Phase des Studiendesigns um ein Stipendium bewerben. Ich sehe viel zu oft, dass die Leute zuerst ihre Daten sammeln und versuchen, herauszufinden, wie sie anschließend analysiert werden, mit dem Ergebnis, dass der Statistiker möglicherweise nur in der Lage ist, mit den Worten von Ronald Fisher zu sagen, woran das Experiment gestorben ist .
S. Kolassa - Monica

@StephanKolassa Es ist jedoch sehr schwer einzuschätzen, welche Daten in einigen Experimenten mit menschlichen Daten verfügbar sein werden, und in anderen Einstellungen werden Daten verwendet, die verfügbar sind und nicht mehr
gesammelt werden

2
@llrs: Das ist völlig richtig. Und es sollte natürlich die Simulationsübung informieren. Überlegen Sie sich lieber vorher, welche Daten verfügbar sind, als nach dem Experiment herauszufinden, dass wichtige Daten nicht abgerufen werden können.
S. Kolassa - Wiedereinsetzung von Monica

(+1) Ich finde die Abstimmung zum Schließen dieser Frage etwas anstößig
Robert Long

@RobertLong, warum sagst du das? Ich frage einfach, weil ich sicherstellen möchte, dass in der Antwort nichts fehlt, was sie weniger glaubwürdig macht.
Neelasha Bhattacharjee

Antworten:


14

Allgemeine Kommentare

  • "Ich bin in der 10. Klasse und möchte Daten für ein Projekt auf einer Messe für maschinelles Lernen simulieren." Genial. In der 10. Klasse interessierte mich Mathe überhaupt nicht. Ich glaube, ich habe in diesem Jahr so ​​etwas wie Algebra 2 genommen ...? Ich kann es kaum erwarten, dass du mich in ein paar Jahren arbeitslos machst! Ich gebe unten einige Ratschläge, aber: Was versuchen Sie aus dieser Simulation zu lernen? Was kennen Sie bereits in Statistik und maschinellem Lernen? Das zu wissen würde mir (und anderen) helfen, etwas spezifischere Hilfe zusammenzustellen.

  • Python ist eine sehr nützliche Sprache, aber ich bin der Meinung, dass R besser für die Simulation von Daten ist. Die meisten Bücher / Blogs / Studien / Kurse, die ich zur Simulation von Daten gefunden habe (auch was die Leute als "Monte Carlo Methoden" bezeichnen), sind in R geschrieben. Die R-Sprache wird von Statistikern als "für Statistiker" bezeichnet. "und die meisten Akademiker - die sich auf Simulationsstudien stützen, um zu zeigen, wie ihre Methoden funktionieren - verwenden R. Viele coole Funktionen befinden sich in der Basis-R-Sprache (das heißt, es sind keine zusätzlichen Pakete erforderlich), wie zum Beispiel rnormfür eine Normalverteilung runiffür die Uniform Distribution, rbetafür die Beta-Distribution und so weiter. Wenn Sie in R eingeben, ?Distributionswird eine Hilfeseite angezeigt. Es gibt jedoch viele andere coole Pakete wie mvtnormodersimstudydas sind nützlich. Ich würde DataCamp.com zum Erlernen von R empfehlen, wenn Sie nur Python kennen. Ich denke, dass sie gut dafür sind, sich sanft in die Dinge einzuführen

  • Anscheinend ist hier eine Menge los: Sie möchten Daten, die über einen längeren Zeitraum (in Längsrichtung), innerhalb des Subjekts (möglicherweise unter Verwendung eines mehrstufigen Modells) und mit einer saisonalen Komponente (möglicherweise einem Zeitreihenmodell) vorliegen und alle vorhersagen ein dichotomes Ergebnis (so etwas wie eine logistische Regression). Ich denke, viele Leute, die mit Simulationsstudien anfangen (auch ich selbst), wollen eine Menge Sachen auf einmal reinwerfen, aber das kann wirklich entmutigend und kompliziert sein. Ich würde also empfehlen, mit etwas Einfachem zu beginnen - vielleicht ein oder zwei Funktionen zum Generieren von Daten - und dann von dort aus aufzubauen.

Spezifische Kommentare

Es sieht so aus, als ob Ihre grundlegende Hypothese lautet: "Die Tageszeit sagt voraus, ob jemand an der Einnahme seiner Medikamente festhält oder nicht." Und Sie möchten zwei zwei simulierte Datensätze erstellen: Eines , wo es ist eine Beziehung , und eine , wo gibt es nicht .

Sie erwähnen auch das Simulieren von Daten, um mehrere Beobachtungen derselben Person darzustellen. Dies bedeutet, dass jede Person ihre eigene Wahrscheinlichkeit der Einhaltung sowie möglicherweise ihre eigene Steigung für die Beziehung zwischen Tageszeit und Wahrscheinlichkeit der Einhaltung haben würde. Ich würde vorschlagen, "mehrstufige" oder "hierarchische" Regressionsmodelle für diese Art von Beziehung zu untersuchen, aber ich denke, Sie könnten einfacher anfangen.

Außerdem erwähnen Sie eine kontinuierliche Beziehung zwischen Zeit und Wahrscheinlichkeit der Einhaltung des Medikationsschemas, was mich auch dazu veranlasst, Zeitreihenmodelle - insbesondere saisonale Trends - als hilfreich für Sie zu betrachten. Das ist auch simulierbar, aber ich denke, wir können einfacher anfangen.

Nehmen wir an, wir haben 1000 Menschen und messen, ob sie ihre Medizin nur einmal eingenommen haben oder nicht. Wir wissen auch, ob sie beauftragt wurden, es morgens, nachmittags oder abends zu nehmen. Nehmen wir an, dass die Einnahme des Arzneimittels 1 ist und nicht 0. Wir können dichotome Daten simulieren, indem wir rbinomAuszüge aus einer Binomialverteilung verwenden. Wir können für jede Person eine Beobachtung mit einer bestimmten Wahrscheinlichkeit festlegen. Nehmen wir an, 80% der Menschen nehmen es morgens, 50% nachmittags und 65% nachts ein. Ich füge den folgenden Code mit einigen Kommentaren ein #:

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)

Diese Zusammenfassung zeigt teilweise:

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

Das Interceptstellt den Nachmittag dar, und wir können sehen, dass sowohl am Abend als auch am Morgen eine signifikant höhere Wahrscheinlichkeit des Anhaftens besteht. Es gibt viele Details zur logistischen Regression, die ich in diesem Beitrag nicht erläutern kann, aber bei t- Tests wird davon ausgegangen, dass Sie eine bedingt normalverteilte abhängige Variable haben. Logistische Regressionsmodelle eignen sich eher für dichotome (0 vs. 1) Ergebnisse wie diese. Die meisten einführenden Statistikbücher befassen sich mit dem t- Test, und viele einführende Bücher zum maschinellen Lernen befassen sich mit logistischer Regression. Ich denke, die Einführung in das statistische Lernen: Mit Applications in R ist großartig, und die Autoren haben das Ganze online gepostet:https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf

Ich bin mir bei guten Büchern für Simulationsstudien nicht so sicher. Ich lernte nur durch herumspielen, lesen, was andere Leute taten, und durch einen Abschlusskurs über statistisches Rechnen (Materialien für Professoren finden Sie hier: http://pj.freefaculty.org/guides/ ).

Zuletzt können Sie auch simulieren, dass keine Auswirkung vorliegt, indem Sie alle Zeiten auf die gleiche Wahrscheinlichkeit einstellen:

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))

Welches gibt zurück:

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

Dies zeigt keine signifikanten Unterschiede zwischen den Zeiten, wie wir es erwarten würden, wenn die Wahrscheinlichkeit über die Zeiten hinweg gleich ist.


Vielen Dank für die Buchempfehlung! Genau das, was ich zum Lesen im Urlaub brauchte!
MD-Tech

Vielen Dank dafür! Ich wusste, dass ich ein logistisches Regressionsmodell für den maschinellen Lernaspekt meines Projekts benötigte, aber es scheint auch eine Anwendung für die Simulation der Daten zu haben. Ich hatte jedoch den Eindruck, dass logistische Regression für die Reihenfolge der Zeiten eine Rolle spielt, aber in diesem Fall ist dies nicht der Fall, da jedes Mal eine andere Kategorie ohne Beziehung zum anderen ist. Ich bin zu diesem Schluss gekommen, nachdem ich mit meinem Mathematiklehrer darüber gesprochen hatte, aber wir könnten beide sehr gut falsch liegen. Können Sie bitte erläutern, warum hier genau die logistische Regression angewendet werden kann?
Neelasha Bhattacharjee

@NeelashaBhattacharjee Das Simulieren der Daten und das Anpassen des logistischen Regressionsmodells sind zwei separate Schritte - wir hätten die gleichen Daten simulieren und mithilfe einer Kontingenztabelle und einer Chi-Quadrat-Statistik analysieren können, wenn wir dies wollten. Sie haben Recht, dass das Modell, das ich anpasse, in der Zeit keine Reihenfolge codiert. Regressionsmodelle gehen jedoch davon aus, wie die abhängige Variable verteilt ist, nicht von den unabhängigen Variablen. Wir hätten Prädiktoren, kontinuierliche Prädiktoren, Zählprädiktoren usw. bestellen können, und alle wären für eine logistische Regression in Ordnung.
Mark White

@NeelashaBhattacharjee Die logistische Regression kann hier verwendet werden, da wir eine dichotome abhängige Variable modellieren, dh eine mit zwei und nur zwei möglichen Ergebnissen. Eine logistische Regression verwendet die "logistische Verknüpfungsfunktion", um alle vorhergesagten Werte für die Regressionsgleichung (z. B. b0 + b1 * x) auf einen Wert zwischen 0 und 1 anzupassen. Wir nennen diese Zahlen die Wahrscheinlichkeit, dass jemand die hat abhängiger variabler Wert von 1.
Markieren Sie White

Ich danke dir sehr! Ich habe mich jedoch gefragt, wie Sie die p-Werte zwischen den beiden simulierten Datensätzen betrachten und feststellen können, ob einer einen signifikanten Trend aufweist und der andere. Für mich haben beide Mengen p-Werte, die so unterschiedlich sind, dass sie signifikant sind.
Neelasha Bhattacharjee

4

Wenn Sie bereits Python kennen, können Sie mit Base Python numpyund / oder auf jeden Fall das erreichen, was Sie brauchen pandas. Wie Mark White jedoch vorschlägt, ist eine Menge simulations- und statistikbezogener Dinge in R eingebettet, also auf jeden Fall einen Blick wert.

Im Folgenden finden Sie ein Grundgerüst, wie Sie mit einer Python-Klasse vorgehen können. Sie können jedes Motiv so np.random.normaleinstellen, dass baseline_adherenceRauschen entsteht. Dies gibt Ihnen eine pseudozufällige Einhaltung, zu der Sie die gezielte reduzierte Einhaltung an bestimmten Tagen hinzufügen können.

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

Dies ist ein großartiges Projekt. Projekte wie dieses sind mit einer Herausforderung verbunden, und Ihre Methode zur Verwendung simulierter Daten ist eine hervorragende Möglichkeit, diese zu bewerten.

Haben Sie eine A-priori-Hypothese, z. B. "Menschen sind abends vergesslicher"? In diesem Fall wird ein statistischer Test durchgeführt, der die Häufigkeit des Vergessens am Abend im Vergleich zum Morgen vergleicht. Dies ist eine Bernoulli-Verteilung, wie die vorherigen Antwortenden sagten.

Der andere Ansatz besteht darin, Ihre Daten zu durchsuchen, um herauszufinden, welches Zeitfenster die höchste Fehlerrate aufweist. Es muss eines geben, also lautet die Frage: "Ist das nur ein Zufallsergebnis?". Die Signifikanzschwelle ist in diesem Fall höher. Wenn Sie sich darüber informieren möchten, suchen Sie nach "false discovery rate".

In Ihrem Fall ist das System so einfach, dass Sie die Schwelle mit Bedacht berechnen können. Es kann jedoch auch die allgemeine Methode angewendet werden: Simulieren Sie 1000 Datensätze ohne Ratenschwankung und ermitteln Sie dann die Häufigkeitsverteilung zufällig kleiner Zahlen. Vergleichen Sie Ihren realen Datensatz damit. Wenn 1pm der dünn besetzte Slot in den realen Daten ist, aber 50/1000 simulierte Datensätze einen genauso dünn besetzten Slot haben, ist das Ergebnis nicht robust.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.