พล็อตสถิติสรุปด้วย Mean, sd, min และ max?


10

ฉันมาจากพื้นหลังทางเศรษฐศาสตร์และมักจะอยู่ในวินัยสถิติสรุปของตัวแปรที่มีการรายงานในตาราง อย่างไรก็ตามฉันต้องการพล็อตพวกเขา

ฉันสามารถแก้ไขพล็อตกล่องเพื่อให้สามารถแสดงค่าเฉลี่ยส่วนเบี่ยงเบนมาตรฐานต่ำสุดและสูงสุด แต่ฉันไม่ต้องการทำเช่นนั้นเนื่องจากพล็อตกล่องถูกใช้เพื่อแสดงค่ามัธยฐานและ Q1 และ Q3

ตัวแปรทั้งหมดของฉันมีสเกลต่างกัน มันจะดีถ้ามีคนแนะนำวิธีที่มีความหมายโดยที่ฉันสามารถวางแผนสถิติสรุปเหล่านี้ได้ ฉันสามารถทำงานกับ R หรือ Stata ได้


1
ยินดีต้อนรับสู่รายการ หากคุณกำลังถามเกี่ยวกับRคำสั่งคำถามนี้อยู่นอกหัวข้อที่นี่ แต่ดูเหมือนว่าคุณกำลังถามเกี่ยวกับสิ่งที่พล็อตที่ดีจะมีลักษณะเป็นอย่างไรและครั้งที่สองเกี่ยวกับวิธีการสร้าง ถ้าเป็นเช่นนั้นฉันขอแนะนำให้ลบ "with R" ออกจากชื่อของคุณและอาจระบุว่าคุณมีRอยู่แล้วในร่างกาย
Peter Flom

คำตอบ:


16

มีเหตุผลที่ทำให้ boxplot ของ Tukey เป็นสากลมันสามารถนำไปใช้กับข้อมูลที่ได้มาจากการแจกแจงที่แตกต่างกันจาก Gaussian ถึง Poisson ฯลฯ Median, MAD (ค่าเบี่ยงเบนสัมบูรณ์กลาง) หรือ IQR (ช่วงควอไทล์) เป็นมาตรการที่แข็งแกร่งกว่าเมื่อข้อมูลเบี่ยงเบน ภาวะปกติ อย่างไรก็ตามค่าเฉลี่ยและ SD นั้นมีแนวโน้มที่จะผิดกฎหมายมากกว่าและควรตีความด้วยความเคารพต่อการแจกแจงต้นแบบ วิธีการแก้ปัญหาด้านล่างนี้เหมาะสำหรับข้อมูลปกติหรือบันทึกปกติ คุณอาจจะเรียกดูผ่านการคัดเลือกจากมาตรการที่แข็งแกร่งที่นี่และสำรวจแพคเกจ WRS R ที่นี่

# simulating dataset
set.seed(12)
d1 <- rnorm(100, sd=30)
d2 <- rnorm(100, sd=10)
d <- data.frame(value=c(d1,d2), condition=rep(c("A","B"),each=100))

# function to produce summary statistics (mean and +/- sd), as required for ggplot2
data_summary <- function(x) {
   mu <- mean(x)
   sigma1 <- mu-sd(x)
   sigma2 <- mu+sd(x)
   return(c(y=mu,ymin=sigma1,ymax=sigma2))
}

# require(ggplot2)
ggplot(data=d, aes(x=condition, y=value, fill=condition)) + 
geom_crossbar(stat="summary", fun.y=data_summary, fun.ymax=max, fun.ymin=min)

นอกจากนี้โดยการเพิ่ม+ geom_jitter()หรือ+ geom_point()รหัสข้างต้นคุณสามารถเห็นภาพค่าข้อมูลดิบพร้อมกัน


ขอขอบคุณที่ @Roland สำหรับการชี้ออกพล็อตไวโอลิน มันมีความได้เปรียบในการแสดงภาพความหนาแน่นของความน่าจะเป็นในเวลาเดียวกันกับสถิติสรุป:

# require(ggplot2)
ggplot(data=d, aes(x=condition, y=value, fill=condition)) + 
geom_violin() + stat_summary(fun.data=data_summary)

ตัวอย่างทั้งสองแสดงอยู่ด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่


2
ฉันต้องการพล็อตไวโอลินมากกว่านี้
Roland

1
ขึ้นอยู่กับวัตถุประสงค์ของการวิเคราะห์ค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานคือสิ่งที่คุณต้องการ ฉันไม่เข้าใจ แต่ความไม่ลงรอยกันใน summary.data.frame ของ R มันแสดงความหมาย แต่ไม่มี sds ฉันไม่สามารถนึกถึงหลาย ๆ สถานการณ์ที่หมายถึงมีประโยชน์ แต่ค่าเบี่ยงเบนมาตรฐานทำให้เข้าใจผิด
Michael M

แน่นอนบางครั้งคุณต้องเห็นค่าเฉลี่ยและ SD เพื่อให้คุณตัดสินว่ามันมีประโยชน์หรือไม่
นิคค็อกซ์

1
@TWL: หัวข้อกว้างเกินไปที่จะอภิปรายที่นี่ แต่ใช้เวลาสำหรับการประเมินทางเศรษฐกิจของยาเสพติด: สำหรับผู้ป่วยอาจเป็นสิ่งสำคัญที่จะรู้ระยะเวลาการรักษาเฉลี่ยในขณะที่สำหรับ บริษัท ประกันสุขภาพมันเป็นระยะเวลาการรักษาเฉลี่ยเพราะพวกเขาต้องจ่ายสำหรับผู้ป่วยแต่ละราย ข้อเท็จจริงที่น่าสงสัย: ในกรณีของการแจกแจงเอ็กซ์โปเนนเชียลค่าเฉลี่ย +/- 1 ส่วนเบี่ยงเบนมาตรฐานครอบคลุม 68% ของมวลทั้งหมดค่าเฉลี่ย +/- 2 sds ครอบคลุมประมาณ 95% ของมวลทั้งหมด สำหรับคนปกติ (แต่เป็นเพียงโอกาส))
Michael M

1
ขอขอบคุณทุกฉันเช่นแปลงไวโอลินเสนอเพื่อจะไปข้างหน้ากับทางเลือกที่ :-)
Ridhima

9

มีความเป็นไปได้มากมาย

ตัวเลือกหนึ่งที่ฉันได้เห็นใช้ซึ่งหลีกเลี่ยงความสับสนกับ boxplots (สมมติว่าคุณมีค่ามัธยฐานหรือข้อมูลดั้งเดิมที่มีอยู่) คือการพล็อต boxplot และเพิ่มสัญลักษณ์ที่ทำเครื่องหมายค่าเฉลี่ย (หวังว่าจะมีตำนาน เวอร์ชันของ boxplot ที่เพิ่มเครื่องหมายสำหรับค่าเฉลี่ยถูกกล่าวถึงเช่นใน Frigge et al (1989) [1]:

Boxplots แสดงค่าเฉลี่ยที่ทำเครื่องหมายไว้เช่นกัน

พล็อตด้านซ้ายแสดงสัญลักษณ์ + เป็นเครื่องหมายหมายถึงและพล็อตด้านขวาใช้รูปสามเหลี่ยมที่ขอบปรับตัวเครื่องหมายเฉลี่ยจากพล็อตแบบคาน - และ - ศูนย์กลางของ Doane & Tracy [2]

ดูโพสต์ดังนั้นนี้นี้และอันนี้ด้วย

หากคุณไม่มี (หรือไม่ต้องการแสดง) ค่ามัธยฐานของพล็อตใหม่จะต้องใช้และจากนั้นก็เป็นการดีที่จะให้มันแตกต่างจากกล่องภาพ

บางทีสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

± sd สำหรับแต่ละตัวอย่างโดยใช้สัญลักษณ์ที่แตกต่างกันและจากนั้นจะวาดรูปสี่เหลี่ยมผืนผ้าหรืออาจดีกว่าเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

± sd สำหรับแต่ละตัวอย่างโดยใช้สัญลักษณ์ที่แตกต่างกันแล้วลากเส้น (ในความเป็นจริงในปัจจุบันซึ่งจริง ๆ แล้วเป็นรูปสี่เหลี่ยมผืนผ้าเหมือนเมื่อก่อน แต่วาดแคบ ๆ ควรเปลี่ยนเป็นวาดเส้น )

หากตัวเลขของคุณอยู่ในระดับที่แตกต่างกันมาก แต่เป็นบวกคุณอาจพิจารณาทำงานกับบันทึกหรือคุณอาจทำทวีคูณเล็ก ๆ ที่มีตาชั่งที่แตกต่างกัน (แต่ทำเครื่องหมายไว้อย่างชัดเจน)

รหัส (ปัจจุบันไม่เฉพาะรหัส 'nice' แต่ในขณะนี้เป็นเพียงการสำรวจความคิดมันไม่ใช่แบบฝึกหัดเกี่ยวกับการเขียนโค้ด R ที่ดี):

fivenum.ms=function(x) {r=range(x);m=mean(x);s=sd(x);c(r[1],m-s,m,m+s,r[2])}
eps=.015

plot(factor(c(1,2)),range(c(A,B)),type="n",border=0)
points((rep(c(1,2),each=5)),c(fivenum.ms(A),fivenum.ms(B)),col=rep(c(2,4),each=5),pch=rep(c(1,16,9,16,1),2),ylim=c(range(A,B)),cex=1.2,lwd=2,xlim=c(0.5,2.5),ylab="",xlab="")
rect(1-1.2*eps,fivenum.ms(A)[2],1+1.4*eps,fivenum.ms(A)[4],lwd=2,col=2,den=0)
rect(2-1.2*eps,fivenum.ms(B)[2],2+1.4*eps,fivenum.ms(B)[4],lwd=2,col=4,den=0)

plot(factor(c(1,2)),range(c(A,B)),type="n",border=0)
points((rep(c(1,2),each=5)),c(fivenum.ms(A),fivenum.ms(B)),col=rep(c(2,4),each=5),pch=rep(c(1,16,9,16,1),2),ylim=c(range(A,B)),cex=1.2,lwd=2,xlim=c(0.5,2.5),ylab="",xlab="")
rect(1-eps/9,fivenum.ms(A)[2],1+eps/3,fivenum.ms(A)[4],lwd=2,col=2,den=0)
rect(2-eps/9,fivenum.ms(B)[2],2+eps/3,fivenum.ms(B)[4],lwd=2,col=4,den=0)

[1] Frigge, M. , DC Hoaglin และ B. Iglewicz (1989),
"การใช้งานบางส่วนของพล็อตกล่อง"
อเมริกันสถิติ , 43 (ก.พ. ): 50-54

[2] Doane DP และ RL Tracy (2000),
"การใช้ Beam และ Fulcrum แสดงการสำรวจข้อมูล"
American Statistics , 54 (4): 289–290, พฤศจิกายน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.