2012-05-07 68 views
12

Tôi đang sử dụng đoạn mã sau để tạo ra một phân phối chuẩn tiêu chuẩn trong R:Làm một phân phối chuẩn tiêu chuẩn trong R

x<-seq(-4,4,length=200) 
y<-dnorm(x,mean=0, sd=1) 
plot(x,y, type="l", lwd=2) 

Tôi cần trục x để được dán nhãn tại giá trị trung bình và tại các điểm ba độ lệch chuẩn trên và dưới mức trung bình. Tôi có thể thêm các nhãn này bằng cách nào?

+0

bài tập về nhà ...? Thử đặt 'axes = FALSE' trong lệnh' plot() 'và sau đó xem'? Axis' ... –

+2

Thậm chí nếu đây là bài tập về nhà, và bạn đang tìm kiếm một hàm được thiết kế để hiển thị các khía cạnh của phân bố chuẩn, tôi đến trên 'normal.and.t.dist' trong gói' HH' một lúc trước. – BenBarnes

Trả lời

16

Cách dễ nhất (nhưng không phải chung) là giới hạn các giới hạn của trục x. +/- 1: 3 sigma sẽ được gắn nhãn như vậy và giá trị trung bình sẽ được gắn nhãn là 0 - chỉ ra 0 độ lệch so với giá trị trung bình.

plot(x,y, type = "l", lwd = 2, xlim = c(-3.5,3.5)) 

enter image description here

Một lựa chọn khác là sử dụng nhãn cụ thể hơn:

plot(x,y, type = "l", lwd = 2, axes = FALSE, xlab = "", ylab = "") 
axis(1, at = -3:3, labels = c("-3s", "-2s", "-1s", "mean", "1s", "2s", "3s")) 
14

Sử dụng mã của David, bạn có thể bỏ qua việc tạo ra x và chỉ sử dụng curve() trên dnorm chức năng:

curve(dnorm, -3.5, 3.5, lwd=2, axes = FALSE, xlab = "", ylab = "") 
axis(1, at = -3:3, labels = c("-3s", "-2s", "-1s", "mean", "1s", "2s", "3s")) 

Nhưng điều này không sử dụng mã đã cho nữa. Nếu đây là bài tập về nhà, hãy gắn thẻ như vậy.


Small tip, sử dụng liên tục trong hai <- hoặc = với không gian xung quanh họ, nó sẽ làm cho cuộc sống của bạn dễ dàng hơn nhiều. Ví dụ:

x <- seq(-4, 4, length=200) 
y <- dnorm(x, mean=0, sd=1) 
plot(x, y, type="l", lwd=2) 
5

Một cực kỳ hiệu quả và khác thường, nhưng đẹp giải pháp, mà tác phẩm dựa trên ý tưởng của mô phỏng Monte Carlo, là thế này:

  1. mô phỏng nhiều thu hút (hoặc mẫu) từ một định phân phối (nói bình thường).
  2. vẽ sơ đồ mật độ của các hình vẽ này bằng cách sử dụng rnorm. Chức năng rnorm mất như các đối số (A, B, C) và trả về một vector của Một mẫu từ phân phối chuẩn tập trung ở B, với độ lệch chuẩn C.

Vì vậy để có một mẫu kích thước 50.000 từ một tiêu chuẩn bình thường (ví dụ, một chuẩn với trung bình 0 và độ lệch chuẩn 1), và vẽ mật độ của nó, chúng ta thực hiện như sau:

x = rnorm(50000,0,1) 

plot(density(x)) 

Như số lần rút đến vô cùng, điều này sẽ hội tụ thành phân phối cho bình thường. Để minh họa điều này, hãy xem hình ảnh dưới đây cho thấy từ trái sang phải và từ trên xuống dưới 5000.500.500000, và 5 triệu mẫu. 5000,50000,500000, and 5 million samples from the normal PDF

+0

câu trả lời hay - ngay cả khi nó không sử dụng PDF bình thường trực tiếp, nó là khái quát để vẽ bất kỳ phân phối nào có thể được lấy mẫu. –

3

Nếu bạn muốn làm điều gì đó mà không sử dụng chức năng R được tích hợp sẵn hoặc bạn muốn thực hiện điều này ngoài R, bạn có thể sử dụng công thức sau.

enter image description here

x<-seq(-4,4,length=200) 
s = 1 
mu = 0 
y <- (1/(s * sqrt(2*pi))) * exp(-((x-mu)^2)/(2*s^2)) 
plot(x,y, type="l", lwd=2, col = "blue", xlim = c(-3.5,3.5)) 
3

Trong trường hợp tổng quát, ví dụ: Bình thường (2, 1)

f <- function(x) dnorm(x, 2, 1) 
plot(f, -1, 5) 

Đây là một rất chung chung, e có thể được định nghĩa một cách tự do, với bất kỳ thông số nào đó, cho ví dụ:

f <- function(x) dbeta(x, 0.1, 0.1) 
plot(f, 0, 1) 
0

Tôi đặc biệt yêu thích Lưới cho mục tiêu này. Nó dễ dàng thực hiện thông tin đồ họa như khu vực cụ thể theo một đường cong, một trong những bạn thường yêu cầu khi giao dịch với xác suất các vấn đề như tìm P (một < X < b) vv hãy có một cái nhìn:

library(lattice) 

e4a <- seq(-4, 4, length = 10000)   # Data to set up out normal 
e4b <- dnorm(e4a, 0, 1) 

     xyplot(e4b ~ e4a,     # Lattice xyplot 
       type = "l", 
       main = "Plot 2", 
       panel = function(x,y, ...){ 
        panel.xyplot(x,y, ...) 
        panel.abline(v = c(0, 1, 1.5), lty = 2) #set z and lines 

        xx <- c(1, x[x>=1 & x<=1.5], 1.5)   #Color area 
        yy <- c(0, y[x>=1 & x<=1.5], 0) 
        panel.polygon(xx,yy, ..., col='red') 
       }) 

enter image description here

Trong ví dụ này, tôi làm cho khu vực giữa z = 1z = 1.5 nổi bật. Bạn có thể di chuyển dễ dàng các tham số này theo vấn đề của bạn.

Nhãn trục là tự động.

Các vấn đề liên quan