มันอาจจะช่วยให้คุณรู้ว่าแกนแนวตั้งเป็นวัดที่เป็นความหนาแน่นของความน่าจะเป็น ดังนั้นหากมีการวัดแกนแนวนอนเป็นกิโลเมตรดังนั้นแกนแนวตั้งจึงถูกวัดเป็นความหนาแน่นของความน่าจะเป็น "ต่อกิโลเมตร" สมมติว่าเราวาดรูปสี่เหลี่ยมผืนผ้าบนตารางดังกล่าวซึ่งเป็น 5 "กม." กว้าง 0.1 "ต่อกิโลเมตร" สูง (ซึ่งคุณอาจต้องการที่จะเขียนเป็น "กม. - 1 ") พื้นที่สี่เหลี่ยมผืนผ้านี้คือ 5 กม. x 0.1 กม. - 1 = 0.5 หน่วยยกเลิกและเราเหลือเพียงความน่าจะเป็นครึ่งหนึ่ง−1−1
หากคุณเปลี่ยนหน่วยแนวนอนเป็น "เมตร" คุณจะต้องเปลี่ยนหน่วยแนวตั้งเป็น "ต่อเมตร" ตอนนี้สี่เหลี่ยมจะมีความกว้าง 5,000 เมตรและจะมีความหนาแน่น (ความสูง) 0.0001 ต่อเมตร คุณยังเหลือด้วยความน่าจะเป็นครึ่งหนึ่ง คุณอาจได้รับความยุ่งเหยิงว่ากราฟสองตัวนี้จะดูแปลกเมื่อเทียบกับหน้าอื่น ๆ (ไม่ต้องกว้างและสั้นกว่ากราฟอื่น ๆ ) แต่เมื่อคุณวาดพล็อตร่างกายคุณสามารถใช้อะไรก็ได้ ขนาดที่คุณชอบ ดูด้านล่างเพื่อดูว่าต้องมีความประหลาดเล็กน้อยเพียงใด
คุณอาจพบว่ามีประโยชน์ในการพิจารณาฮิสโทแกรมก่อนที่จะไปยังเส้นโค้งความหนาแน่นของความน่าจะเป็น มีหลายวิธีที่คล้ายคลึงกัน แกนแนวตั้งของฮิสโตแกรมคือความหนาแน่นของความถี่ [ต่อหน่วย ]xและพื้นที่เป็นตัวแทนของความถี่อีกครั้งเนื่องจากหน่วยแนวนอนและแนวตั้งตัดออกเมื่อมีการคูณ เส้นโค้ง PDF เป็นรูปแบบของฮิสโตแกรมรุ่นต่อเนื่องโดยมีความถี่รวมเท่ากับหนึ่ง
การเปรียบเทียบที่ใกล้ยิ่งขึ้นคือฮิสโตแกรมความถี่สัมพัทธ์ - เราบอกว่าฮิสโตแกรมนั้นได้รับการ "ทำให้เป็นมาตรฐาน" ดังนั้นองค์ประกอบของพื้นที่จะแสดงสัดส่วนของชุดข้อมูลดั้งเดิมของคุณแทนที่จะเป็นความถี่ดิบและพื้นที่ทั้งหมดของแท่งทั้งหมดเป็นหนึ่ง ความสูงนี้มีความหนาแน่นความถี่สัมพัทธ์ [ต่อxหน่วย] หากฮิสโตแกรมความถี่สัมพัทธ์มีแถบที่ทำงานตามxค่าจาก 20 กม. ถึง 25 กม. (ดังนั้นความกว้างของแถบคือ 5 กม.) และมีความหนาแน่นความถี่สัมพัทธ์ 0.1 ต่อกม. จากนั้นแถบนั้นมีสัดส่วน 0.5 ของข้อมูล สิ่งนี้สอดคล้องกับแนวคิดที่ว่ารายการที่สุ่มเลือกจากชุดข้อมูลของคุณมีความน่าจะเป็น 50% ของการโกหกในแถบนั้น ข้อโต้แย้งก่อนหน้านี้เกี่ยวกับผลกระทบของการเปลี่ยนแปลงในหน่วยยังคงใช้: เปรียบเทียบสัดส่วนของข้อมูลที่อยู่ในแถบ 20 กม. ถึง 25 กม. กับที่ใน 20,000 ถึง 25,000 เมตรบาร์สำหรับทั้งสองแปลง คุณอาจยืนยันเลขคณิตว่าพื้นที่ของแท่งทั้งหมดรวมเป็นหนึ่งในทั้งสองกรณี
สิ่งที่ฉันอาจหมายถึงโดยอ้างว่า PDF เป็น "ฮิสโตแกรมรุ่นต่อเนื่อง" ลองมาแถบขนาดเล็กภายใต้เส้นโค้งความหนาแน่นของความน่าจะเป็นพร้อมค่าในช่วง[ x , x + δ x ]ดังนั้นแถบเป็นδ xกว้างและความสูงของเส้นโค้งเป็นค่าคงที่ประมาณฉ( x ) เราสามารถลากแท่งที่มีความสูงนั้นได้ซึ่งพื้นที่f ( x )x[ x , x + δx ]δxf(x)แสดงถึงความน่าจะเป็นโดยประมาณของการนอนในแถบนั้นf(x)δx
เราจะหาพื้นที่ใต้เส้นโค้งระหว่างและx = b ได้อย่างไร? เราสามารถแบ่งช่วงเวลานั้นออกเป็นแถบเส้นเล็ก ๆ และหาผลรวมของพื้นที่ของแท่ง, ∑ f ( x )x=ax=bซึ่งจะสอดคล้องกับความน่าจะเป็นตัวอย่างของการโกหกในช่วง [ , ข ] เราเห็นว่าเส้นโค้งและแท่งไม่ได้จัดแนวอย่างแม่นยำดังนั้นจึงมีข้อผิดพลาดในการประมาณของเรา โดยการทำให้ δ xขนาดเล็กและขนาดเล็กสำหรับแต่ละแถบเราเติมเต็มช่วงเวลาที่มีมากขึ้นและแคบบาร์ซึ่ง Σ F ( x )∑f(x)δx[a,b]δxให้การประมาณพื้นที่ที่ดีขึ้น∑f(x)δx
ในการคำนวณพื้นที่อย่างแม่นยำแทนที่จะสมมติว่าเป็นค่าคงที่ในแต่ละแถบเราประเมินอินทิกรัล∫ b a f ( x ) d xและสิ่งนี้สอดคล้องกับความน่าจะเป็นที่แท้จริงของการนอนในช่วง[ a , b ] . การรวมเข้ากับส่วนโค้งทั้งหมดให้พื้นที่ทั้งหมด (เช่นความน่าจะเป็นทั้งหมด) หนึ่งด้วยเหตุผลเดียวกับที่รวมพื้นที่ของแท่งทั้งหมดของฮิสโตแกรมความถี่สัมพัทธ์ให้พื้นที่ทั้งหมด (เช่นสัดส่วนทั้งหมด) ของหนึ่ง การบูรณาการนั้นเป็นรุ่นต่อเนื่องของการรวมf(x)∫baf(x)dx[a,b]
รหัส R สำหรับแปลง
require(ggplot2)
require(scales)
require(gridExtra)
# Code for the PDF plots with bars underneath could be easily readapted
# Relative frequency histograms
x.df <- data.frame(km=c(rep(12.5, 1), rep(17.5, 2), rep(22.5, 5), rep(27.5, 2)))
x.df$metres <- x.df$km * 1000
km.plot <- ggplot(x.df, aes(x=km, y=..density..)) +
stat_bin(origin=10, binwidth=5, fill="steelblue", colour="black") +
xlab("Distance in km") + ylab("Relative frequency density per km") +
scale_y_continuous(minor_breaks = seq(0, 0.1, by=0.005))
metres.plot <- ggplot(x.df, aes(x=metres, y=..density..)) +
stat_bin(origin=10000, binwidth=5000, fill="steelblue", colour="black") +
xlab("Distance in metres") + ylab("Relative frequency density per metre") +
scale_x_continuous(labels = comma) +
scale_y_continuous(minor_breaks = seq(0, 0.0001, by=0.000005), labels=comma)
grid.arrange(km.plot, metres.plot, ncol=2)
x11()
# Probability density functions
x.df <- data.frame(x=seq(0, 1, by=0.001))
cutoffs <- seq(0.2, 0.5, by=0.1) # for bars
barHeights <- c(0, dbeta(cutoffs[1:(length(cutoffs)-1)], 2, 2), 0) # uses left of bar
x.df$pdf <- dbeta(x.df$x, 2, 2)
x.df$bar <- findInterval(x.df$x, cutoffs) + 1 # start at 1, first plotted bar is 2
x.df$barHeight <- barHeights[x.df$bar]
x.df$lastBar <- ifelse(x.df$bar == max(x.df$bar)-1, 1, 0) # last plotted bar only
x.df$lastBarHeight <- ifelse(x.df$lastBar == 1, x.df$barHeight, 0)
x.df$integral <- ifelse(x.df$bar %in% 2:(max(x.df$bar)-1), 1, 0) # all plotted bars
x.df$integralHeight <- ifelse(x.df$integral == 1, x.df$pdf, 0)
cutoffsNarrow <- seq(0.2, 0.5, by=0.025) # for the narrow bars
barHeightsNarrow <- c(0, dbeta(cutoffsNarrow[1:(length(cutoffsNarrow)-1)], 2, 2), 0) # uses left of bar
x.df$barNarrow <- findInterval(x.df$x, cutoffsNarrow) + 1 # start at 1, first plotted bar is 2
x.df$barHeightNarrow <- barHeightsNarrow[x.df$barNarrow]
pdf.plot <- ggplot(x.df, aes(x=x, y=pdf)) +
geom_area(fill="lightsteelblue", colour="black", size=.8) +
ylab("probability density") +
theme(panel.grid = element_blank(),
axis.text.x = element_text(colour="black", size=16))
pdf.lastBar.plot <- pdf.plot +
scale_x_continuous(breaks=tail(cutoffs, 2), labels=expression(x, x+delta*x)) +
geom_area(aes(x=x, y=lastBarHeight, group=lastBar), fill="steelblue", colour="black", size=.8) +
annotate("text", x=0.73, y=0.22, size=6, label=paste("P(paste(x<=X)<=x+delta*x)%~~%f(x)*delta*x"), parse=TRUE)
pdf.bars.plot <- pdf.plot +
scale_x_continuous(breaks=cutoffs[c(1, length(cutoffs))], labels=c("a", "b")) +
geom_area(aes(x=x, y=barHeight, group=bar), fill="steelblue", colour="black", size=.8) +
annotate("text", x=0.73, y=0.22, size=6, label=paste("P(paste(a<=X)<=b)%~~%sum(f(x)*delta*x)"), parse=TRUE)
pdf.barsNarrow.plot <- pdf.plot +
scale_x_continuous(breaks=cutoffsNarrow[c(1, length(cutoffsNarrow))], labels=c("a", "b")) +
geom_area(aes(x=x, y=barHeightNarrow, group=barNarrow), fill="steelblue", colour="black", size=.8) +
annotate("text", x=0.73, y=0.22, size=6, label=paste("P(paste(a<=X)<=b)%~~%sum(f(x)*delta*x)"), parse=TRUE)
pdf.integral.plot <- pdf.plot +
scale_x_continuous(breaks=cutoffs[c(1, length(cutoffs))], labels=c("a", "b")) +
geom_area(aes(x=x, y=integralHeight, group=integral), fill="steelblue", colour="black", size=.8) +
annotate("text", x=0.73, y=0.22, size=6, label=paste("P(paste(a<=X)<=b)==integral(f(x)*dx,a,b)"), parse=TRUE)
grid.arrange(pdf.lastBar.plot, pdf.bars.plot, pdf.barsNarrow.plot, pdf.integral.plot, ncol=2)