Có các chức năng mặc định cho các phân phối thống nhất rời rạc trong R không?


28

Hầu hết các bản phân phối chuẩn trong R đều có một nhóm lệnh - pdf / pmf, cdf / cmf, quantile, lệch ngẫu nhiên (ví dụ: dnorm, pnorm, qnorm, rnorm).

Tôi biết việc sử dụng một số lệnh tiêu chuẩn để tái tạo các hàm này cho các phân phối thống nhất riêng biệt là đủ dễ dàng, nhưng đã có một nhóm chức năng tích hợp ưa thích để mô hình hóa các phân phối thống nhất rời rạc trong R mà tôi không biết?


Đối với những người vẫn đang tìm kiếm một câu trả lời, tôi đã tìm thấy điều này: purrr :: rdunif, xem: rdrr.io/cran/purrr/man/rdunif.html
Nnie

1
@Nnie, điều đó không thực sự trả lời toàn bộ câu hỏi yêu cầu hoàn thành họ hàm trong khi câu hỏi bạn liên kết chỉ rút ra ngẫu nhiên.
mdewey

Gia đình hoàn chỉnh có sẵn tại rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/iêu trong gói ExtraDistr, rõ ràng.
kcrisman

Câu trả lời:


32

Như nico đã viết, chúng không được triển khai trong R. Giả sử chúng tôi làm việc trong 1..k, các chức năng đó sẽ giống như:

Đối với thế hệ ngẫu nhiên:

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
Cảm ơn. Tôi nghĩ sẽ rất hữu ích khi có các hàm tích hợp (với các hàm tối thiểu và cực đại ala thuộc họ unif). Thật là hơi xấu khi phải thêm các định nghĩa hàm vào các tập lệnh chỉ để sử dụng các bản phân phối thống nhất riêng biệt theo cách bạn sẽ sử dụng các bản phân phối tiêu chuẩn khác. Các hàm dựng sẵn cũng xử lý lỗi xử lý (ví dụ: nếu tham số không phải là số nguyên) và được tối ưu hóa cho tốc độ.

2
Câu trả lời tốt đẹp. Và đối với các lượng tử, chúng ta có thể làm một cái gì đó như qdu <- function (p, k) ifelse (p <= 0 | p> 1, return ("không xác định"), trần (p * k))

15

Đây là mã cho phân phối thống nhất rời rạc trong phạm vi [min, max], được điều chỉnh từ bài đăng của 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

Trang xem nhiệm vụ CRAN: Trang phân phối xác suất cho biết:

Phân phối thống nhất rời rạc có thể dễ dàng thu được với các chức năng cơ bản.

Tôi đoán một cái gì đó trên dòng này nên làm:

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

CHỈNH SỬA

Như csgillespie đã chỉ ra, điều này không chính xác ...

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

sẽ hoạt động mặc dù (lưu ý rằng ví dụ sẽ tạo ra các giá trị trong khoảng từ 1 đến 100, không phải từ 0 đến 100)


2
Điều này không đúng cho các trường hợp cạnh. Để thấy điều này, hãy thử chạy lệnh sau: table(round(runif(10000, min=0, max=2)))Rõ ràng không phải là đồng phục rời rạc.
csgillespie

@csgillespie: phát hiện độc đáo, tôi đã cập nhật câu trả lời của mình :)
nico

Bạn không thể sử dụng ceiling(runif(1000, min=-1, max=100))?
gung - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.