Saya mencoba membuat gambar yang menunjukkan hubungan antara salinan virus dan cakupan genom (GCC). Seperti inilah data saya:
Pada awalnya, saya hanya merencanakan regresi linier tetapi pengawas saya mengatakan itu tidak benar, dan untuk mencoba kurva sigmoidal. Jadi saya melakukan ini menggunakan geom_smooth:
library(scales)
ggplot(scatter_plot_new, aes(x = Copies_per_uL, y = Genome_cov, colour = Virus)) +
geom_point() +
scale_x_continuous(trans = log10_trans(), breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) +
geom_smooth(method = "gam", formula = y ~ s(x), se = FALSE, size = 1) +
theme_bw() +
theme(legend.position = 'top', legend.text = element_text(size = 10), legend.title = element_text(size = 12), axis.text = element_text(size = 10), axis.title = element_text(size=12), axis.title.y = element_text(margin = margin (r = 10)), axis.title.x = element_text(margin = margin(t = 10))) +
labs(x = "Virus copies/µL", y = "GCC (%)") +
scale_y_continuous(breaks=c(25,50,75,100))
Namun, penyelia saya mengatakan ini juga tidak benar karena kurva membuatnya terlihat seperti GCC bisa lebih dari 100%, yang tidak bisa.
Pertanyaan saya adalah: apa cara terbaik untuk menunjukkan hubungan antara salinan virus dan GCC? Saya ingin menjelaskan bahwa A) salinan virus rendah = GCC rendah, dan B) setelah sejumlah virus menyalin dataran tinggi GCC.
Saya telah meneliti banyak metode berbeda - GAM, LOESS, logistik, sebagian - tetapi saya tidak tahu bagaimana cara mengetahui metode apa yang terbaik untuk data saya.
EDIT: ini adalah datanya:
>print(scatter_plot_new)
Subsample Virus Genome_cov Copies_per_uL
1 S1.1_RRAV RRAV 100 92500
2 S1.2_RRAV RRAV 100 95900
3 S1.3_RRAV RRAV 100 92900
4 S2.1_RRAV RRAV 100 4049.54
5 S2.2_RRAV RRAV 96.9935 3809
6 S2.3_RRAV RRAV 94.5054 3695.06
7 S3.1_RRAV RRAV 3.7235 86.37
8 S3.2_RRAV RRAV 11.8186 84.2
9 S3.3_RRAV RRAV 11.0929 95.2
10 S4.1_RRAV RRAV 0 2.12
11 S4.2_RRAV RRAV 5.0799 2.71
12 S4.3_RRAV RRAV 0 2.39
13 S5.1_RRAV RRAV 4.9503 0.16
14 S5.2_RRAV RRAV 0 0.08
15 S5.3_RRAV RRAV 4.4147 0.08
16 S1.1_UMAV UMAV 5.7666 1.38
17 S1.2_UMAV UMAV 26.0379 1.72
18 S1.3_UMAV UMAV 7.4128 2.52
19 S2.1_UMAV UMAV 21.172 31.06
20 S2.2_UMAV UMAV 16.1663 29.87
21 S2.3_UMAV UMAV 9.121 32.82
22 S3.1_UMAV UMAV 92.903 627.24
23 S3.2_UMAV UMAV 83.0314 615.36
24 S3.3_UMAV UMAV 90.3458 632.67
25 S4.1_UMAV UMAV 98.6696 11180
26 S4.2_UMAV UMAV 98.8405 12720
27 S4.3_UMAV UMAV 98.7939 8680
28 S5.1_UMAV UMAV 98.6489 318200
29 S5.2_UMAV UMAV 99.1303 346100
30 S5.3_UMAV UMAV 98.8767 345100
sumber
method.args=list(family=quasibinomial))
argumen kegeom_smooth()
dalam kode ggplot asli Anda.se=FALSE
. Selalu menyenangkan untuk menunjukkan kepada orang-orang seberapa besar sebenarnya ketidakpastian itu ...Jawaban:
Cara lain untuk menggunakan ini adalah dengan menggunakan formulasi Bayesian, mungkin akan sedikit berat untuk memulainya tetapi cenderung membuatnya lebih mudah untuk mengungkapkan secara spesifik masalah Anda serta mendapatkan ide yang lebih baik tentang di mana "ketidakpastian" adalah
Stan adalah sampler Monte Carlo dengan antarmuka terprogram yang relatif mudah digunakan, perpustakaan tersedia untuk R dan lainnya, tetapi saya menggunakan Python di sini
kami menggunakan sigmoid seperti orang lain: ia memiliki motivasi biokimia serta secara matematis sangat nyaman untuk bekerja dengannya. parameterisasi yang bagus untuk tugas ini adalah:
di mana
alpha
mendefinisikan titik tengah dari kurva sigmoid (yaitu di mana ia melintasi 50%) danbeta
mendefinisikan kemiringan, nilai-nilai yang mendekati nol lebih rata.untuk menunjukkan seperti apa ini, kami dapat menarik data Anda dan memplotnya dengan:
di mana
raw_data.txt
berisi data yang Anda berikan dan saya mengubah cakupan menjadi sesuatu yang lebih berguna. koefisien 5.5 dan 3 terlihat bagus dan memberikan plot yang sangat mirip dengan jawaban lainnya:untuk "menyesuaikan" fungsi ini menggunakan Stan, kita perlu mendefinisikan model kita menggunakan bahasanya sendiri yang merupakan campuran antara R dan C ++. model sederhana akan menjadi seperti:
yang mudah-mudahan berbunyi OK. kami memiliki
data
blok yang mendefinisikan data yang kami harapkan ketika kami mengambil sampel model,parameters
menentukan hal-hal yang disampel, danmodel
mendefinisikan fungsi kemungkinan. Anda memberi tahu Stan untuk "mengkompilasi" model, yang membutuhkan waktu, dan kemudian Anda dapat mengambil sampel dengan beberapa data. sebagai contoh:arviz
memudahkan plot diagnostik yang bagus, saat mencetak fit memberi Anda ringkasan parameter R-style yang bagus:standar deviasi yang besar pada
beta
mengatakan bahwa data benar-benar tidak memberikan banyak informasi tentang parameter ini. juga beberapa jawaban yang memberikan 10+ digit signifikan pada model mereka terlalu melebih-lebihkankarena beberapa jawaban mencatat bahwa setiap virus mungkin memerlukan parameternya sendiri, saya memperluas model untuk memperbolehkan
alpha
danbeta
bervariasi menurut "Virus". semuanya menjadi sedikit fiddly, tetapi kedua virus hampir pasti memilikialpha
nilai yang berbeda (yaitu Anda memerlukan lebih banyak salinan / μL dari RRAV untuk cakupan yang sama) dan plot yang menunjukkan ini adalah:datanya sama seperti sebelumnya, tetapi saya telah menggambar kurva untuk 40 sampel posterior.
UMAV
tampaknya relatif ditentukan, sementaraRRAV
dapat mengikuti kemiringan yang sama dan membutuhkan jumlah salinan yang lebih tinggi, atau memiliki kemiringan yang lebih curam dan jumlah salinan yang serupa. sebagian besar massa posterior membutuhkan jumlah salinan yang lebih tinggi, tetapi ketidakpastian ini mungkin menjelaskan beberapa perbedaan dalam jawaban lain yang menemukan hal-hal yang berbeda.Saya kebanyakan menggunakan menjawab ini sebagai latihan untuk meningkatkan pengetahuan saya tentang Stan, dan saya telah meletakkan buku catatan Jupyter ini di sini kalau-kalau ada yang tertarik / ingin meniru ini.
sumber
(Diedit dengan mempertimbangkan komentar akun di bawah ini. Terima kasih kepada @BenBolker & @WeiwenNg untuk masukan yang bermanfaat.)
Sesuaikan regresi logistik fraksional dengan data. Sangat cocok untuk data persentase yang dibatasi antara 0 dan 100% dan dapat dibenarkan secara teoritis di banyak bidang biologi.
Perhatikan bahwa Anda mungkin harus membagi semua nilai dengan 100 agar sesuai, karena program sering memperkirakan data berkisar antara 0 dan 1. Dan seperti yang disarankan Ben Bolker, untuk mengatasi kemungkinan masalah yang disebabkan oleh asumsi ketat distribusi binomial mengenai varians, gunakan distribusi kuasibinomial sebagai gantinya.
Saya telah membuat beberapa asumsi berdasarkan kode Anda, seperti ada 2 virus yang Anda minati dan mereka mungkin menunjukkan pola yang berbeda (yaitu mungkin ada interaksi antara jenis virus dan jumlah salinan).
Pertama, modelnya pas:
Jika Anda mempercayai nilai-p, output tidak menyarankan bahwa kedua virus berbeda bermakna. Ini berbeda dengan hasil @ NickCox di bawah ini, meskipun kami menggunakan metode yang berbeda. Saya juga tidak akan terlalu percaya diri dengan 30 poin data.
Kedua, plot:
Tidak sulit untuk membuat kode cara memvisualisasikan output sendiri, tetapi tampaknya ada paket ggPredict yang akan melakukan sebagian besar pekerjaan untuk Anda (tidak dapat menjamin untuk itu, saya belum mencobanya sendiri). Kode akan terlihat seperti:Pembaruan: Saya tidak lagi merekomendasikan kode atau fungsi ggPredict lebih umum. Setelah mencobanya saya menemukan bahwa titik-titik yang diplot tidak mencerminkan data input tetapi malah diubah karena alasan yang aneh (beberapa titik yang diplot berada di atas 1 dan di bawah 0). Jadi saya sarankan untuk mengkodekannya sendiri, meskipun itu lebih sulit.
sumber
family=quasibinomial()
untuk menghindari peringatan (dan masalah mendasar dengan asumsi varians yang terlalu ketat). Ikuti saran @ mkt untuk masalah lainnya.Ini bukan jawaban yang berbeda dari @mkt tetapi grafik pada khususnya tidak akan cocok dengan komentar. Pertama-tama saya memasukkan kurva logistik di Stata (setelah mencatat prediktornya) ke semua data dan mendapatkan grafik ini
Persamaannya adalah
100
invlogit
(-4.192654 + 1.880951log10
(Copies
))Sekarang saya memasukkan kurva secara terpisah untuk setiap virus dalam skenario paling sederhana dari virus yang mendefinisikan variabel indikator. Di sini untuk catatan adalah skrip Stata:
Ini mendorong keras pada dataset kecil tetapi nilai-P untuk virus terlihat mendukung pemasangan dua kurva secara bersama-sama.
sumber
Coba fungsi sigmoid . Ada banyak formulasi bentuk ini termasuk kurva logistik. Singgung hiperbolik adalah pilihan populer lainnya.
Mengingat plot, saya tidak bisa mengesampingkan fungsi langkah sederhana juga. Saya khawatir Anda tidak akan dapat membedakan antara fungsi langkah dan sejumlah spesifikasi sigmoid. Anda tidak memiliki pengamatan di mana persentase Anda berada dalam kisaran 50%, sehingga perumusan langkah sederhana bisa menjadi pilihan yang paling tidak tepat yang berkinerja tidak lebih buruk daripada model yang lebih kompleks
sumber
Berikut adalah 4PL (4 parameter logistik) yang cocok, baik terbatas maupun tidak terbatas, dengan persamaan seperti CA Holstein, M. Griffin, J. Hong, PD Sampson, "Metode Statistik untuk Menentukan dan Membandingkan Batas Deteksi Bioassays", Anal . Chem 87 (2015) 9795-9801. Persamaan 4PL ditunjukkan dalam kedua angka dan makna parameter adalah sebagai berikut: a = asimtot lebih rendah, b = faktor kemiringan, c = titik belok, dan d = asimtot atas.
Gambar 1 membatasi a hingga sama dengan 0% dan d sama dengan 100%:
Gambar 2 tidak memiliki kendala pada 4 parameter dalam persamaan 4PL:
Ini menyenangkan, saya tidak berpura-pura mengetahui sesuatu yang biologis dan akan menarik untuk melihat bagaimana semuanya beres!
sumber
Saya mengekstraksi data dari sebar Anda, dan pencarian persamaan saya menghasilkan persamaan tipe logistik 3-parameter sebagai kandidat yang baik: "y = a / (1.0 + b * exp (-1.0 * c * x))", di mana " x "adalah basis log 10 per plot Anda. Parameter yang dipasang adalah a = 9.0005947126706630E + 01, b = 1.2831794858584102E + 07, dan c = 6.6483431489473155E + 00 untuk data saya yang diekstraksi, kesesuaian (log 10 x) data asli akan menghasilkan hasil yang sama jika Anda menyesuaikan kembali data asli menggunakan nilai saya sebagai perkiraan parameter awal. Nilai parameter saya menghasilkan R-squared = 0,983 dan RMSE = 5,625 pada data yang diekstraksi.
EDIT: Sekarang pertanyaannya telah diedit untuk memasukkan data aktual, berikut adalah plot menggunakan persamaan 3-parameter di atas dan perkiraan parameter awal.
sumber
Karena saya harus membuka mulut besar tentang Heaviside, inilah hasilnya. Saya mengatur titik transisi ke log10 (viruscopies) = 2.5. Lalu saya menghitung standar deviasi dari dua bagian dari kumpulan data - yaitu, Heaviside mengasumsikan data di kedua sisi memiliki semua turunan = 0.
Sisi RH std dev = 4.76
LH sisi std dev = 7.72
Karena ternyata ada 15 sampel dalam setiap batch, std dev keseluruhan adalah mean, atau 6,24.
Dengan asumsi "RMSE" yang dikutip dalam jawaban lain adalah "RMS error" secara keseluruhan, fungsi Heaviside akan muncul untuk melakukan setidaknya serta, jika tidak lebih baik daripada, sebagian besar "kurva-Z" (dipinjam dari nomenklatur respons fotografis) cocok sini.
sunting
Grafik tidak berguna, tetapi diminta dalam komentar:
sumber