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 rnorm
untuk distribusi normal, runif
untuk seragam distribusi, rbeta
untuk distribusi beta, dan sebagainya. Di R, mengetik ?Distributions
akan menampilkan halaman bantuan untuk Anda. Namun, ada banyak paket keren lainnya seperti mvtnorm
atausimstudy
itu 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 rbinom
untuk 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 Intercept
mewakili 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.