Bagaimana cara mensimulasikan data agar signifikan secara statistik?

18

Saya di kelas 10 dan saya sedang mencari untuk mensimulasikan data untuk proyek pembelajaran sains mesin adil. Model akhir akan digunakan pada data pasien dan akan memprediksi korelasi antara waktu-waktu tertentu dalam seminggu dan efeknya terhadap kepatuhan pengobatan dalam data satu pasien. Nilai kepatuhan adalah biner (0 berarti mereka tidak minum obat, 1 berarti mereka meminum obat). Saya mencari untuk membuat model pembelajaran mesin yang dapat belajar dari hubungan antara waktu seminggu, dan telah memisahkan minggu menjadi 21 slot waktu, tiga untuk setiap waktu dalam sehari (1 adalah Senin pagi, 2 adalah Senin sore, dll.) Saya mencari untuk mensimulasikan data senilai 1.000 pasien. Setiap pasien akan memiliki data senilai 30 minggu. Saya ingin memasukkan tren tertentu yang terkait dengan waktu seminggu dan kepatuhan. Sebagai contoh, dalam satu set data saya dapat mengatakan bahwa slot waktu 7 minggu memiliki hubungan yang signifikan secara statistik dengan kepatuhan. Agar saya dapat menentukan apakah hubungan tersebut signifikan secara statistik atau tidak, akan mengharuskan saya melakukan uji-t dua sampel membandingkan satu slot waktu dengan yang lainnya dan memastikan nilai signifikansi kurang dari 0,05.

Namun, daripada mensimulasikan data saya sendiri dan memeriksa apakah tren yang saya masukkan signifikan atau tidak, saya lebih suka bekerja mundur dan mungkin menggunakan program yang saya bisa minta untuk memberi slot waktu tertentu tren yang signifikan dengan kepatuhan, dan itu akan kembali data biner yang berisi di dalamnya tren yang saya minta, dan juga data biner untuk slot waktu lainnya yang mengandung beberapa noise tetapi tidak menghasilkan tren yang signifikan secara statistik.

Apakah ada program yang dapat membantu saya mencapai sesuatu seperti ini? Atau mungkin modul python?

Bantuan apa pun (bahkan komentar umum tentang proyek saya) akan sangat dihargai !!

Neelasha Bhattacharjee
sumber
4
Ini pertanyaan yang bagus. Dan hal seperti inilah yang harus dilakukan sebagian besar ilmuwan sebelum mengajukan hibah, pada tahap desain penelitian. Saya melihat terlalu sering orang mengumpulkan data mereka terlebih dahulu dan mencoba mencari cara menganalisanya setelah itu, dengan hasil bahwa ahli statistik hanya dapat mengetahui apa yang mati karena eksperimen, dalam kata-kata Ronald Fisher .
S. Kolassa - Reinstate Monica
@StephanKolassa Namun, sangat sulit untuk menilai data apa yang akan tersedia dalam beberapa percobaan dengan data manusia, dan di pengaturan lain kita menggunakan data yang tersedia dan tidak dapat mengumpulkan lebih banyak ...
ll
2
@ lrs: Itu benar sekali. Dan tentu saja harus menginformasikan latihan simulasi. Lebih baik memikirkan terlebih dahulu tentang data apa yang tersedia, daripada mencari tahu setelah percobaan bahwa data penting tidak dapat diperoleh.
S. Kolassa - Reinstate Monica
(+1) Saya menemukan suara untuk menutup pertanyaan ini agak tidak menyenangkan
Robert Long
@ RobertTong, mengapa Anda mengatakan itu? Saya bertanya hanya karena saya ingin memastikan saya tidak melewatkan apa pun dalam respons yang membuatnya kurang kredibel.
Neelasha Bhattacharjee

Jawaban:

14

Komentar umum

  • "Saya di kelas 10 dan saya sedang mencari untuk mensimulasikan data untuk proyek adil pembelajaran mesin." Luar biasa. Saya tidak peduli sama sekali tentang matematika di kelas 10; Saya pikir saya mengambil sesuatu seperti Aljabar 2 tahun itu ...? Saya tidak bisa menunggu sampai Anda membuat saya keluar dari pekerjaan dalam beberapa tahun! Saya memberikan beberapa saran di bawah ini, tetapi: Apa yang Anda coba pelajari dari simulasi ini? Apa yang sudah Anda ketahui dalam statistik dan pembelajaran mesin? Mengetahui hal ini akan membantu saya (dan lainnya) mengumpulkan beberapa bantuan yang lebih spesifik.

  • Python adalah bahasa yang sangat berguna, tapi saya berpendapat bahwa R lebih baik untuk mensimulasikan data. Sebagian besar buku / blog / studi / kelas yang saya temui pada simulasi data (juga apa yang orang-orang sebut "metode Monte Carlo" untuk menjadi mewah) berada di R. Bahasa R dikenal sebagai "oleh ahli statistik, untuk ahli statistik, "dan sebagian besar akademisi — yang bergantung pada studi simulasi untuk menunjukkan metode mereka bekerja — gunakan R. Banyak fungsi keren dalam bahasa dasar R (yaitu, tidak perlu paket tambahan), seperti rnormuntuk distribusi normal, runifuntuk seragam distribusi, rbetauntuk distribusi beta, dan sebagainya. Di R, mengetik ?Distributionsakan menampilkan halaman bantuan untuk Anda. Namun, ada banyak paket keren lainnya seperti mvtnormatausimstudyitu berguna. Saya akan merekomendasikan DataCamp.com untuk mempelajari R, jika Anda hanya tahu Python; Saya pikir mereka bagus untuk diperkenalkan dengan lembut pada berbagai hal

  • Sepertinya Anda memiliki banyak hal yang terjadi di sini: Anda menginginkan data yang melebihi waktu (longitudinal), dalam-subjek (mungkin menggunakan model bertingkat), dan memiliki komponen musiman pada mereka (mungkin model seri waktu), semuanya memprediksi hasil dikotomis (seperti regresi logistik). Saya pikir banyak orang yang memulai dengan studi simulasi (termasuk saya) ingin melempar banyak barang sekaligus, tetapi ini bisa sangat menakutkan dan rumit. Jadi yang saya sarankan lakukan adalah mulai dengan sesuatu yang sederhana - mungkin membuat satu atau dua fungsi untuk menghasilkan data - dan kemudian membangun dari sana.

Komentar Khusus

Sepertinya hipotesis dasar Anda adalah: "Waktu dalam sehari memprediksi apakah seseorang mematuhi atau tidak minum obat mereka." Dan Anda ingin dua membuat dua set data simulasi: Satu di mana ada adalah hubungan dan satu di mana ada tidak .

Anda juga menyebutkan data simulasi untuk mewakili beberapa pengamatan dari orang yang sama. Ini berarti bahwa setiap orang akan memiliki probabilitas kepatuhan mereka sendiri serta, mungkin, kemiringan mereka sendiri untuk hubungan antara waktu hari dan probabilitas kepatuhan. Saya akan menyarankan melihat model regresi "bertingkat" atau "hierarkis" untuk jenis hubungan ini, tetapi saya pikir Anda bisa mulai lebih sederhana dari ini.

Juga, Anda menyebutkan hubungan terus-menerus antara waktu dan probabilitas untuk mengikuti rejimen pengobatan, yang juga membuat saya berpikir pemodelan rangkaian waktu — khususnya melihat tren musiman — akan membantu Anda. Ini juga bisa disimulasikan, tapi sekali lagi, saya pikir kita bisa mulai lebih sederhana.

Katakanlah kita memiliki 1000 orang, dan kita mengukur apakah mereka minum obat satu kali saja atau tidak. Kita juga tahu jika mereka ditugaskan untuk mengambilnya di pagi, siang, atau malam hari. Katakanlah mengambil obatnya adalah 1, bukan meminumnya adalah 0. Kita dapat mensimulasikan data dikotomi menggunakan rbinomuntuk menarik dari distribusi binomial. Kita dapat mengatur setiap orang untuk memiliki 1 observasi dengan probabilitas yang diberikan. Katakanlah orang-orang 80% akan meminumnya di pagi hari, 50% di sore hari, dan 65% di malam hari. Saya tempel kode di bawah ini, dengan beberapa komentar setelah #:

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)

Ringkasan ini menunjukkan, sebagian:

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

Yang Interceptmewakili sore, dan kita dapat melihat bahwa baik malam dan pagi kemungkinan secara signifikan lebih tinggi untuk patuh. Ada banyak detail tentang regresi logistik yang tidak dapat saya jelaskan dalam posting ini, tetapi uji- t mengasumsikan bahwa Anda memiliki variabel dependen yang terdistribusi secara normal dan bersyarat. Model regresi logistik lebih tepat ketika Anda memiliki hasil dikotomis (0 vs 1) seperti ini. Kebanyakan buku statistik pengantar akan berbicara tentang uji- t , dan banyak buku pembelajaran mesin pengantar akan berbicara tentang regresi logistik. Saya pikir https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf Pengantar Pembelajaran Statistik: Dengan Aplikasi dalam R bagus, dan penulis memposting semuanya secara online:

Saya tidak yakin tentang buku-buku bagus untuk studi simulasi; Saya belajar dari bermain-main, membaca apa yang dilakukan orang lain, dan dari program pascasarjana saya mengambil komputasi statistik (materi profesor ada di sini: http://pj.freefaculty.org/guides/ ).

Terakhir, Anda juga dapat mensimulasikan tidak berpengaruh dengan mengatur semua waktu untuk memiliki probabilitas yang sama:

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

Yang mengembalikan:

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

Ini tidak menunjukkan perbedaan yang signifikan antara waktu, seperti yang kita harapkan dari probabilitas yang sama di semua waktu.

Mark White
sumber
Terima kasih banyak atas rekomendasi buku! Apa yang saya butuhkan untuk membaca liburan!
MD-Tech
Terima kasih banyak atas ini! Saya tahu bahwa saya memerlukan model regresi logistik untuk aspek pembelajaran mesin dari proyek saya, tetapi tampaknya memiliki aplikasi dalam mensimulasikan data juga. Namun, saya mendapat kesan bahwa regresi logistik membutuhkan urutan waktu menjadi penting, tetapi dalam kasus ini tidak demikian karena setiap kali merupakan kategori yang berbeda tanpa ada kaitannya dengan yang lain. Saya sampai pada kesimpulan ini setelah berdiskusi dengan guru matematika saya, tetapi kami berdua bisa saja salah. Bisakah Anda menjelaskan mengapa regresi logistik dapat digunakan di sini?
Neelasha Bhattacharjee
@NeelashaBhattacharjee Mensimulasikan data dan menyesuaikan model regresi logistik adalah dua langkah terpisah — kita bisa mensimulasikan data yang sama dan menganalisisnya menggunakan tabel kontingensi dan statistik chi-square jika kita mau. Anda benar bahwa model yang saya pas tidak menyandikan urutan apa pun di kali. Namun, model regresi membuat asumsi tentang bagaimana variabel dependen didistribusikan, bukan variabel independen. Kita bisa memesan prediktor, prediktor kontinu, prediktor penghitung, dll., Dan semuanya akan baik-baik saja untuk regresi logistik.
Mark White
@NeelashaBhattacharjee Regresi logistik dapat digunakan di sini karena kami memodelkan variabel dependen dikotomis — yaitu, satu dengan dua dan hanya dua hasil yang mungkin. Apa yang dilakukan regresi logistik adalah menggunakan "fungsi tautan logistik" untuk membuat semua nilai prediksi untuk persamaan regresi (misalnya, b0 + b1 * x) cocok antara 0 dan 1. Dan kami menyebut angka-angka ini probabilitas bahwa seseorang memiliki nilai variabel dependen dari 1.
Mark White
Terima kasih banyak! Namun, saya bertanya-tanya bagaimana Anda bisa melihat nilai p antara dua set data yang disimulasikan dan menentukan apakah satu memiliki tren yang signifikan dan yang lainnya. Bagi saya, kedua set memiliki nilai p yang cukup bervariasi untuk menjadi signifikan.
Neelasha Bhattacharjee
4

Jika Anda sudah tahu beberapa Python, maka Anda pasti akan dapat mencapai apa yang Anda butuhkan menggunakan basis Python bersama numpydan / atau pandas. Seperti yang Mark White sarankan, banyak simulasi dan hal-hal yang berhubungan dengan statistik dimasukkan ke dalam R, jadi pasti patut dilihat.

Di bawah ini adalah kerangka dasar untuk bagaimana Anda mungkin mendekati ini menggunakan kelas Python. Anda dapat menggunakan np.random.normaluntuk mengatur baseline_adherencesetiap subjek untuk memasukkan beberapa noise. Ini memberi Anda kepatuhan pseudo-acak, di mana Anda dapat menambahkan kepatuhan yang ditargetkan berkurang pada hari-hari tertentu.

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")
Andrew
sumber
1

Ini adalah proyek yang hebat. Ada tantangan untuk proyek-proyek seperti ini, dan metode Anda menggunakan data simulasi adalah cara yang bagus untuk menilai itu.

Apakah Anda memiliki hipotesis a priori, misalnya "orang lebih pelupa di malam hari"? Dalam hal itu, uji statistik yang membandingkan frekuensi lupa di malam hari dibandingkan pagi hari akan mengujinya. Ini adalah distribusi Bernoulli, seperti yang dikatakan responden sebelumnya.

Pendekatan lain adalah menjaring data Anda untuk mengetahui slot waktu mana yang memiliki tingkat kegagalan tertinggi. Pasti ada satu, jadi pertanyaannya adalah "apakah ini hanya hasil kebetulan?". Ambang untuk signifikansi lebih tinggi dalam kasus ini. Jika Anda ingin membaca tentang ini, cari "tingkat penemuan palsu".

Dalam kasus Anda, sistemnya cukup sederhana sehingga Anda dapat menghitung ambang dengan sedikit pemikiran. Tetapi metode umum juga dapat digunakan: similate 1000 dataset tanpa variasi laju, kemudian cari tahu distribusi frekuensi angka rendah yang kebetulan. Bandingkan dataset asli Anda dengan itu. Jika 1pm adalah slot jarang dalam data nyata, tetapi 50/1000 dataset simulasi memiliki slot sama-sama jarang, maka hasilnya tidak kuat.

chrishmorris
sumber