กราฟิกทางเลือกในการ "จับแถบ" แปลง


15

ในส่วนของการวิจัยของฉันวิธีที่นิยมในการแสดงข้อมูลคือการใช้แผนภูมิแท่งร่วมกับ "handle-bars" ตัวอย่างเช่น,

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

"มือจับบาร์" สลับกันระหว่างข้อผิดพลาดมาตรฐานและส่วนเบี่ยงเบนมาตรฐานขึ้นอยู่กับผู้แต่ง โดยทั่วไปขนาดตัวอย่างสำหรับแต่ละ "บาร์" นั้นค่อนข้างเล็ก - ประมาณหก

แผนการเหล่านี้ดูเหมือนจะได้รับความนิยมเป็นพิเศษในสาขาวิทยาศาสตร์ชีวภาพ - ดูตัวอย่างเอกสารสองสามฉบับแรกของBMC Biology, vol 3สำหรับตัวอย่าง

ดังนั้นคุณจะนำเสนอข้อมูลนี้อย่างไร

ทำไมฉันไม่ชอบแปลงเหล่านี้

ส่วนตัวฉันไม่ชอบแปลงเหล่านี้

  1. เมื่อขนาดตัวอย่างเล็กทำไมไม่เพียงแสดงจุดข้อมูลแต่ละจุด
  2. มันคือ sd หรือ se ที่กำลังถูกแสดง? ไม่มีใครตกลงที่จะใช้
  3. ทำไมต้องใช้บาร์เลย ข้อมูลไม่ได้ (ปกติ) ไปจาก 0 แต่ผ่านครั้งแรกที่กราฟแสดงให้เห็นว่ามันไม่
  4. กราฟไม่ได้ให้ข้อมูลเกี่ยวกับช่วงหรือขนาดตัวอย่างของข้อมูล

สคริปต์ R

นี่คือรหัส R ที่ฉันใช้ในการสร้างพล็อต ด้วยวิธีนี้คุณสามารถ (ถ้าคุณต้องการ) ใช้ข้อมูลเดียวกัน

                                        #Generate the data
set.seed(1)
names = c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
prevs = c(38, 37, 31, 31, 29, 26, 40, 32, 39)

n=6; se = numeric(length(prevs))
for(i in 1:length(prevs))
  se[i] = sd(rnorm(n, prevs, 15))/n

                                        #Basic plot
par(fin=c(6,6), pin=c(6,6), mai=c(0.8,1.0,0.0,0.125), cex.axis=0.8)
barplot(prevs,space=c(0,0,0,3,0,0, 3,0,0), names.arg=NULL, horiz=FALSE,
        axes=FALSE, ylab="Percent", col=c(2,3,4), width=5, ylim=range(0,50))

                                        #Add in the CIs
xx = c(2.5, 7.5, 12.5, 32.5, 37.5, 42.5,  62.5, 67.5, 72.5)
for (i in 1:length(prevs)) {
  lines(rep(xx[i], 2), c(prevs[i], prevs[i]+se[i]))
  lines(c(xx[i]+1/2, xx[i]-1/2), rep(prevs[i]+se[i], 2))
}

                                        #Add the axis
axis(2, tick=TRUE, xaxp=c(0, 50, 5))
axis(1, at=xx+0.1, labels=names, font=1,
     tck=0, tcl=0, las=1, padj=0, col=0, cex=0.1)

6
การช่วยให้สาขาของคุณได้รับฉันทามติในคำถาม se v. sd จะเป็นการล่วงหน้าอย่างมาก พวกเขาหมายถึงสิ่งที่แตกต่างอย่างสิ้นเชิง
จอห์น

ฉันเห็นด้วย - se มักจะถูกเลือกเพราะมันให้พื้นที่ขนาดเล็ก!
csgillespie

อาจมีชื่อที่ให้ข้อมูลมากกว่านี้บ้าง?

3
เพียงเพื่อการอ้างอิงฉันได้เห็นแผนภูมิแท่งเหล่านี้มีแถบข้อผิดพลาดที่เรียกว่า "Dynamite Plots" ก่อนหน้านี้ ต่อไปนี้เป็นข้อมูลอ้างอิงบางส่วนที่ให้คำแนะนำที่เหมือนกันทุกประการ (แผนภูมิจุด) Tatsuki Koyama, ระวังการระเบิดโปสเตอร์และดรัมมอนด์และ Vowler 2011
Andy W

1
โปรดเพิ่มภาพอีกครั้งหากทำได้ ใช้เครื่องมืออัปโหลดรูปภาพในครั้งนี้เพื่อไม่ให้กลายเป็นลิงก์ที่ไม่ทำงาน
endolith

คำตอบ:


16

ขอบคุณสำหรับทุกคำตอบ เพื่อความสมบูรณ์ฉันคิดว่าฉันควรรวมสิ่งที่ฉันมักจะทำ ฉันมักจะรวมคำแนะนำที่ได้รับ: จุด, boxplots (เมื่อ n มีขนาดใหญ่) และช่วง se (หรือ sd)

( ลบออกโดยโมเดอเรเตอร์เนื่องจากไซต์ที่โฮสต์รูปภาพไม่ทำงานอย่างถูกต้องอีกต่อไป )

จากพล็อตจุดเป็นที่ชัดเจนว่าข้อมูลมีการแพร่กระจายมากขึ้นจากพล็อต "จับบาร์" ที่แนะนำ ในความเป็นจริงมีค่าเป็นลบใน A3!


ฉันได้ทำคำตอบนี้ CW ดังนั้นฉันไม่ได้รับตัวแทน


3
นั่นเป็นคำตอบที่ดี นอกจากนี้ฉันขอแนะนำให้ทำคะแนนตามแนวนอนเพื่อไม่ให้ซ้อนทับกันโดยเฉพาะถ้าคุณมีคะแนนต่อกลุ่มมากกว่านี้ ใน ggplot2, geom_jitter () จะทำเช่นนั้น
Harlan

@Harlan: ฉันเห็นด้วย แม้ว่าฉันจะมีคะแนนมากขึ้นฉันก็อาจใช้ boxplot
csgillespie

1
ฉันยังชอบ scatterplots สำหรับชุดข้อมูลขนาดเล็ก (nb ฉันใช้คำว่า 'dotplot' เพื่ออ้างถึงพล็อตที่แตกต่างกันเล็กน้อย) อย่างไรก็ตามสำหรับสิ่งที่คุ้มค่า barplot ด้านบนนั้นสะอาดและอ่านง่ายกว่าอันนี้ ฉันไม่แน่ใจว่ามันทำให้ดีขึ้น แต่มันก็คุ้มค่าที่จะชี้ให้เห็น
gung - Reinstate Monica

@Harlan: อีกวิธีหนึ่งทำให้จุดโปร่งใสเพื่อให้จุดหลายจุดซ้อนกันและสร้างจุดสีเข้มขึ้น?
endolith

คุณมีภาพต้นฉบับเพื่อแทนที่ลิงค์นี้หรือไม่?
endolith

10

คำปราศรัยของ Frank Harrell (ยอดเยี่ยมที่สุด) มีชื่อว่า "Information Allergy" ที่ useR! เมื่อเดือนที่แล้วแสดงทางเลือกเหล่านี้: แทนที่จะซ่อนข้อมูลดิบผ่านการรวมแถบที่ให้ไว้ข้อมูลดิบจะถูกแสดงเป็นจุด (หรือจุด) "ทำไมต้องซ่อนข้อมูล" ความคิดเห็นของแฟรงค์

เมื่อพิจารณาจากการผสมผสานของ alpa การนัดหยุดงานเป็นข้อเสนอแนะที่สมเหตุสมผลที่สุด (และการพูดคุยทั้งหมดที่เต็มไปด้วยความดี


1
เป็นวิดีโอหรือไม่ มันฟังดูยอดเยี่ยม
Henrik

1
ฉันคิดว่าคำว่า "จะเป็นที่สุด" - บันทึกการกล่าวคำปราศรัย
Dirk Eddelbuettel

1
นี่เป็นเรื่องง่ายใน ggplot ฉันคิดว่านั่นก็คือhad.co.nz/ggplot2/geom_jitter.html
Mike Dewar

1
jitterยังเป็นในแบบธรรมดา R

2
เพียงสำหรับโปรโตคอลการพูดคุยของ Frank (ในวิดีโอ) ขณะนี้ออนไลน์: r-bloggers.com/RUG/2010/08/user-2010-conference-videos
Tal Galili

7

จากมุมมองทางจิตวิทยาฉันแนะนำให้พล็อตข้อมูลรวมถึงความไม่แน่นอนของคุณเกี่ยวกับข้อมูล ดังนั้นในพล็อตที่คุณแสดงฉันจะไม่รำคาญกับการขยายแถบไปจนถึงศูนย์ซึ่งทำหน้าที่เพียงเพื่อลดความสามารถของตาในการแยกความแตกต่างในช่วงของข้อมูล

นอกจากนี้ฉันตรงไปตรงมาต่อต้านการต่อรอง; กราฟแท่งจะจับคู่ตัวแปรสองตัวเข้ากับคุณลักษณะความงามเดียวกัน (ตำแหน่งแกน x) ซึ่งอาจทำให้เกิดความสับสน วิธีที่ดีกว่าคือการหลีกเลี่ยงการทำแผนที่ความซ้ำซ้อนโดยการทำแผนที่ตัวแปรหนึ่งตัวไปยังแกน x และอีกตัวแปรหนึ่งไปยังแอตทริบิวต์ความงามอื่น (เช่นรูปร่างจุดหรือสีหรือทั้งสองอย่าง)

ในพล็อตของคุณด้านบนคุณจะรวมเฉพาะแถบข้อผิดพลาดด้านบนของค่าซึ่งเป็นอุปสรรคต่อความสามารถในการเปรียบเทียบช่วงเวลาของความไม่แน่นอนที่เกี่ยวข้องกับแถบด้านบนและด้านล่างของค่า

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

library(ggplot2)
a = data.frame(names,prevs,se)
a$let = substr(a$names,1,1)
a$num = substr(a$names,2,2)
ggplot(data = a)+
layer(
    geom = 'point'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , shape = let
    )
)+
layer(
    geom = 'line'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , linetype = let
        , group = let
    )    
)+
layer(
    geom = 'errorbar'
    , mapping = aes(
        x = num
        , ymin = prevs-se
        , ymax = prevs+se
        , colour = let
    )
    , alpha = .5
    , width = .5
)

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


1
ฉันควรเพิ่มว่าคำแนะนำ "พล็อตเฉพาะข้อมูลและความไม่แน่นอน" ของฉันควรมีคุณสมบัติ: เมื่อนำเสนอข้อมูลไปยังผู้ชมที่มีประสบการณ์ / ความเชี่ยวชาญด้วยตัวแปรที่ถูกพล็อตให้พล็อตเฉพาะข้อมูลและความไม่แน่นอน เมื่อนำเสนอข้อมูลไปยังผู้ชมที่ไร้เดียงสาและเมื่อศูนย์เป็นจุดข้อมูลที่มีความหมายอันดับแรกฉันจะแสดงข้อมูลที่ขยายไปถึงศูนย์เพื่อให้ผู้ชมสามารถปรับขนาดได้จากนั้นซูมเข้าเพื่อแสดงข้อมูลและความไม่แน่นอน
Mike Lawrence

เนื่องจากคุณมีปัญหาในการเขียนรหัส R คุณสามารถรวมภาพ jpeg ของพล็อตสุดท้ายได้หรือไม่ ฉันพบว่าเพิ่งอัปโหลดภาพไปที่img84.imageshack.usและการเชื่อมโยงไปยังมันค่อนข้างง่าย โอ้ขอบคุณสำหรับคำตอบ :)
csgillespie

@csgillespie: เสร็จแล้ว
Mike Lawrence

ฉันพบว่าง่ายต่อการอ่านพล็อตเช่นนี้พร้อมgeom_ribbon()ระบุข้อผิดพลาด หากคุณไม่ต้องการสร้างการประมาณที่ชัดเจนสำหรับภูมิภาคระหว่าง 1 ถึง 2 อย่างน้อยก็ลดความกว้างของแถบข้อผิดพลาด
JoFrhwld

@JoFrwld: ฉันชอบริบบิ้นด้วยเหมือนกัน แต่ฉันมักจะสำรองไว้สำหรับกรณีที่ตัวแปรแกน x เป็นตัวเลขอย่างแท้จริง รุ่นของฉัน "ไม่ต้องลากเส้นเว้นแต่ว่าตัวแปรแกน x เป็นตัวเลข" กฎที่ฉันอ้างว่าละเมิดคำตอบของฉันด้านบน: Op
Mike Lawrence

2

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

เป็นเรื่องสำคัญที่จะต้องมีความสมดุลของความเรียบง่ายและข้อมูลเพื่อจุดประสงค์ที่แตกต่างกัน แต่เมื่อฉันใช้พล็อตเหล่านี้ฉันกำลังพูดว่า - "ทั้งสองกลุ่มนี้แตกต่างจากกันในทางที่สำคัญ" [หรือไม่]

ดูเหมือนจะดีสำหรับฉัน แต่ฉันสนใจที่จะได้ยินตัวอย่างเคาน์เตอร์ ฉันคิดว่าโดยนัยในการใช้พล็อตคือข้อมูลไม่ได้มีการกระจาย bizzare ซึ่งทำให้ค่าเฉลี่ยไม่ถูกต้องหรือทำให้เข้าใจผิด


ฉันได้เพิ่มหัวข้อเล็ก ๆ ลงไปว่าทำไมฉันถึงไม่ชอบแผนการเหล่านี้
csgillespie

1
@Chris ตรวจสอบสิ่งนี้เกี่ยวกับการตีความที่ทับซ้อนกันของ CIs pubs.amstat.org/doi/abs/10.1198/000313001317097960นอกจากนี้คำถามเดิมยังเป็นคำถามที่สับสนเกี่ยวกับการใช้ SE หรือ SD สลับกันในขณะที่พวกเขาเป็นสองสิ่งที่แตกต่างกัน
tosonb1

หรือสำหรับการวิเคราะห์ในเว็บไซต์นี้ดูstats.stackexchange.com/questions/18215 @ tosonb1 ลิงก์ของคุณหมดเวลา คุณสามารถให้การอ้างอิงไปยังกระดาษหรือไม่
whuber

2

หากข้อมูลเป็นอัตรา : นั่นคือจำนวนความสำเร็จหารด้วยจำนวนการทดลองวิธีการที่สวยงามมากคือพล็อตช่องทาง ตัวอย่างเช่นดูhttp://qshc.bmj.com/content/11/4/390.2.full (ขอโทษถ้าลิงค์ต้องสมัครสมาชิก - แจ้งให้เราทราบและฉันจะหาอีก)

อาจเป็นไปได้ที่จะปรับให้เข้ากับข้อมูลประเภทอื่น แต่ฉันไม่ได้เห็นตัวอย่างใด ๆ

UPDATE:

นี่คือลิงก์ไปยังตัวอย่างที่ไม่จำเป็นต้องสมัครสมาชิก (และมีคำอธิบายที่ดีเกี่ยวกับวิธีการใช้): http://understandinguncertainty.org/fertility

พวกเขาสามารถใช้สำหรับข้อมูลที่ไม่ใช่อัตราโดยเพียงแค่วางแผนค่าเฉลี่ยกับข้อผิดพลาดมาตรฐาน แต่พวกเขาอาจสูญเสียความเรียบง่ายของพวกเขา

บทความวิกิพีเดียไม่ดีเท่าที่กล่าวถึงการใช้ในการวิเคราะห์เมตาเท่านั้น ฉันขอยืนยันว่าพวกเขาอาจมีประโยชน์ในบริบทอื่น ๆ อีกมากมาย


ข้อมูลไม่จำเป็นต้องใช้อัตรา มันอาจเป็นอะไรก็ได้
csgillespie

ลิงก์สมัครสมาชิกน่าเสียดาย
Matt Parker

... แต่นี่คือลิงค์ของ Wikipedia เกี่ยวกับช่องทาง: en.wikipedia.org/wiki/Funnel_plot
Matt Parker

2

ฉันจะใช้ boxplots ที่นี่; สะอาด, มีความหมาย, ไม่ใช่พารามิเตอร์ ... หรือvioplotถ้าการแจกแจงนั้นน่าสนใจยิ่งขึ้น


2
ฉันไม่แน่ใจว่า boxplots หรือ vioplots จะเหมาะกับขนาดตัวอย่างเล็ก ๆ น้อย ๆ (n = 6)
csgillespie

ใช่ฉันยอมรับว่าฉันยังไม่ได้อ่านคำถามอย่างละเอียดเพียงพอดังนั้นจึงเป็นแนวคิดทั่วไป อย่างไรก็ตามฉันคิดว่า 6 คะแนนนั้นน้อยมาก แต่ก็เพียงพอสำหรับการทำ boxplot ฉันได้ทำการทดลองบางอย่างและพวกเขามีความหมาย ในทางกลับกัน boxplot แน่นอนไม่ได้ระบุจำนวนการสังเกต (ซึ่งเป็นข้อมูลที่สำคัญเล็กน้อยที่นี่) ดังนั้นฉันควรจะใช้การรวมกันของมันและจุด

ด้วย 6 คะแนน - พล็อตกระจายน่าจะดีที่สุด (อาจเพิ่มจุดสีแดงเพื่อหาค่าเฉลี่ย)
Tal Galili

2
โดยทั่วไปฉันใช้ boxplots กับจุดซ้อนทับฉันพบว่า "ภาพ" มาก ในเรื่องของความคิดของฉัน
โก้

1
@csgillespie: อะไรจะบ่งบอกว่าแผนการแปลงและแถบมัสสุจะดีกว่า? พวกเขากำลังแสดงข้อมูลเดียวกันโดยทั่วไปเป็น boxplot (ในขณะที่คุณชี้ให้เห็นว่าเคราสามารถเป็นตัวแทนของสิ่งต่าง ๆ ) พวกเขาเพียงแค่ให้ข้อผิดพลาดในทิศทางเดียวซึ่งอาจทำให้เกิดความสับสนค่อนข้างถ้าไม่แย้ง ... . แต่ beanplots / violinplots จะยังคงทำงานแม้สำหรับขนาดตัวอย่างที่ค่อนข้างต่ำเพราะมันเป็นเพียงการประมาณค่าความหนาแน่นของเกาส์, ตามที่ผมอธิบายที่นี่
naught101

1

ลดความซับซ้อนของรหัสที่ยอดเยี่ยมของ @ csgillespie จากด้านบน:

qplot(
    data=a,
    x=num,
    y=prevs,
    colour=let,
    shape=let,
    group=let,
    ymin=prevs-se,
    ymax=prevs+se,
    position=position_dodge(width=0.25),
    geom=c("point", "line", "errorbar")
    )

0

ฉันชอบ geom_pointrange กับ errorbar และคิดว่าเส้นนั้นเบี่ยงเบนความสนใจมากกว่ามีประโยชน์ นี่คือรุ่นที่ฉันพบว่าสะอาดกว่ารุ่น @James หรือ @csgillespie:

qplot(
 data=a,
 x=num,
 y=prevs,
 colour=let,
 ymin=prevs-se,
 ymax=prevs+se,
 position=position_dodge(width=0.25),
 geom=c("pointrange"), size=I(2)
 )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.