มีฟังก์ชั่นเริ่มต้นสำหรับการกระจายแบบไม่ต่อเนื่องใน R หรือไม่?


28

การแจกแจงมาตรฐานส่วนใหญ่ใน R มีตระกูลคำสั่ง - pdf / pmf, cdf / cmf, quantile, deviates แบบสุ่ม (ตัวอย่างเช่น dnorm, pnorm, qnorm, rnorm)

ฉันรู้ว่ามันง่ายพอที่จะใช้ประโยชน์จากคำสั่งมาตรฐานในการทำซ้ำฟังก์ชั่นเหล่านี้สำหรับการแจกแจงแบบไม่ต่อเนื่องกัน แต่มีฟังก์ชั่นตระกูลในตัวที่ต้องการสำหรับการสร้างแบบจำลองการกระจายชุดแบบไม่ต่อเนื่องใน R


สำหรับผู้ที่ยังคงต้องการคำตอบฉันพบสิ่งนี้: purrr :: rdunif, ดู: rdrr.io/cran/purrr/man/rdunif.html
Nnie

1
@Nnie นั่นไม่ได้ตอบคำถามทั้งหมดที่ถามถึงฟังก์ชั่นที่สมบูรณ์ของครอบครัวในขณะที่คนที่คุณลิงก์มาจะสุ่มเท่านั้น
mdewey

ครอบครัวที่สมบูรณ์สามารถดูได้ที่rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/…ในแพ็คเกจ extraDistr
kcrisman

คำตอบ:


32

ตามที่นิโก้เขียนไว้พวกเขาไม่ได้นำไปใช้ในอาร์สมมติว่าเราทำงานใน 1..k ฟังก์ชันเหล่านั้นควรมีลักษณะดังนี้:

สำหรับรุ่นสุ่ม:

rdu<-function(n,k) sample(1:k,n,replace=T)

PDF:

ddu<-function(x,k) ifelse(x>=1 & x<=k & round(x)==x,1/k,0) 

CDF:

pdu<-function(x,k) ifelse(x<1,0,ifelse(x<=k,floor(x)/k,1))

4
ขอบคุณ ฉันคิดว่ามันจะมีประโยชน์ถ้ามีฟังก์ชั่นในตัว (พร้อมกับ min และ max paraemters เป็นครอบครัวเดียวกัน) มันน่าเกลียดเล็กน้อยที่จะต้องเพิ่มคำจำกัดความของฟังก์ชั่นลงในสคริปต์เพื่อใช้การกระจายแบบไม่ต่อเนื่องในแบบที่คุณจะใช้การแจกแจงแบบมาตรฐาน ฟังก์ชั่นบิวอินยังจัดการกับการจัดการข้อผิดพลาด (เช่น - หากพารามิเตอร์ไม่ใช่จำนวนเต็ม) และได้รับการปรับให้เหมาะกับความเร็ว

2
คำตอบที่ดี และสำหรับ quantiles เราสามารถทำอะไรเช่น qdu <- function (p, k) ifelse (p <= 0 | p> 1, return ("undefined"), ceiling (p * k))

15

นี่คือรหัสสำหรับการแจกแจงแบบไม่ต่อเนื่องในช่วง [min, max], ดัดแปลงจากตำแหน่งของ mbq:

dunifdisc<-function(x, min=0, max=1) ifelse(x>=min & x<=max & round(x)==x, 1/(max-min+1), 0)
punifdisc<-function(q, min=0, max=1) ifelse(q<min, 0, ifelse(q>=max, 1, (floor(q)-min+1)/(max-min+1)))
qunifdisc<-function(p, min=0, max=1) floor(p*(max-min+1))
runifdisc<-function(n, min=0, max=1) sample(min:max, n, replace=T)

11

CRAN งาน View: แจกแจงความน่าจะหน้าพูดว่า:

การกระจายตัวแบบไม่ต่อเนื่องสามารถหาได้ง่ายด้วยฟังก์ชั่นพื้นฐาน

ฉันเดาบางสิ่งในบรรทัดนี้ควรทำ:

a <- round(runif(1000, min=0, max=100))

แก้ไข

ดังที่ csgillespie ชี้ให้เห็นว่าสิ่งนี้ไม่ถูกต้อง ...

a <- ceiling(runif(1000, min=0, max=100))

จะทำงานได้ (โปรดทราบว่าตัวอย่างจะสร้างค่าระหว่าง1ถึง 100 ไม่ใช่ 0 และ 100)


2
นี่ไม่ถูกต้องสำหรับเคสขอบ หากต้องการดูสิ่งนี้ให้ลองเรียกใช้คำสั่งต่อไปนี้: table(round(runif(10000, min=0, max=2)))มันไม่เหมือนกันอย่างสิ้นเชิง
csgillespie

@csgillespie: เห็นอย่างฉันปรับปรุงคำตอบของฉัน :)
นิโก้

คุณใช้ceiling(runif(1000, min=-1, max=100))ไม่ได้เหรอ
gung - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.