นโยบายการจัดการความรู้ มหาวิทยาลัยสงขลานครินทร์ 1.ให้ใช้เครื่องมือการจัดการความรู้ผลักดัน คุณภาพคน และกระบวนทำงาน 2.ส่งเสริมการแลกเปลี่ยนประสบการณ์การทำงาน จากหน้างาน 3.ส่งเสริมให้มีเวทีเรียนรู้ร่วมกัน

Our Shangri-La
Ico64
Kittisakdi Choomalee

ภาควิชาเวชศาสตร์ชุมชน คณะแพทยศาสตร์ มหาวิทยาลัยสงขลานครินทร์
เครือข่าย
สมาชิก · ติดตาม: 0 · ผู้ติดตาม: 16

อ่าน: 3079
ความเห็น: 1

ก้าวย่างทางเดิน ลืมเลือนคืนวัน ดั้นด้นไป: เรื่องเล่าจาก research club - ๖ [C]

เรื่องเล่าจาก research club ตอนที่ ๖: แก้ไขเมื่อ pyramid.plot จาก package plotrix ถึงกับอืดเมื่อนำมาใช้กับประชากรขนาดใหญ่

ตัวเลือกสำหรับฟังก์ชัน pyramid.plot() ของ package plotrix นั้นมีตัวเลือกที่เกี่ยวข้องกับการกำหนดค่า label ให้กับแกนนอนของปิรามิดประชากรคือ

  • laxlab
  • raxlab

ตัวเลือก ๒ ตัวเลือกนี้ใช้สำหรับการกำหนดค่า scale ของแกนนอนหรือแกน X ของปิรามิดประชากร โดยที่ laxlab คือการกำหนดค่า sclae ของแกนนอนสำหรับข้อมูลประชากรทางด้านซ้ายมือ และ raxlab คือ คือการกำหนดค่า sclae ของแกนนอนสำหรับข้อมูลประชากรทางด้านขวามือ

 

ค่าเริ่มต้นของตัวเลือกทั้ง ๒ นี้ถูกกำหนดให้เป็นค่า NULL หรือไม่ได้กำหนดค่า scale ของแกนนอนไว้ และเมื่อไม่กำหนดค่าไว้ ฟังก์ชัน pyramid.plot() ก็จะใส่ scale ให้กับแกนนอนทั้งด้านซ้ายและด้านขวามือโดยใช้ค่าจากความถี่สูงสุดของประชากรแต่ละกลุ่มอายุในแต่ละด้าน (ซ้าย - ขวา) ของปิรามิดประชากร มาเป็นค่าสูงสุด (Maximum) ของ scale และค่าต่ำสุดของ scale คือ ศูนย์ (0)

ระหว่างค่าสูงสุดและต่ำสุดของ scale ฟังก์ชัน pyramid.plot() จะทำการใส่ค่า label หรือ tick แกนนอนในทุกค่าของค่าระหว่างค่าสูงสุดและต่ำสุดของความถี่ในแต่ละด้าน

 

ทั้งนี้นั้นต้องคิดสัดส่วนของ scale จากค่าพื้นที่ส่วนที่เป็น graphics device ของ R ในปัจจุบันด้วย

ส่งผลทำให้ขั้นตอนนี้เป็นขั้นตอนที่ใช้เวลานานมาก

การแก้ไขปัญหาความล่าช้าตรงนี้ทำได้โดยการกำหนดค่า laxlab และ raxlab ให้กับฟังก์ชัน pyramid.plot()

ค่าที่เหมาะสม (ค่าต่ำสุด - ค่าสูงสุด) ของ raxlab และ laxlab นั้น คิดจากค่าความถี่สูงสุดของประชากรในแต่ละกลุ่มอายุในแต่ละด้านของปิรามิดประชากรเหมือนกันกับการกำหนดค่าเริ่มต้นของฟังก์ชัน pyramid.plot() เพียงแต่ สิ่งที่สำคัญคือการกำหนดค่า scale หรือการ tick ค่าของแกนนอน

เมื่อไม่กำหนดฟังก์ชัน pyramid.plot() ก็จะ tick แกนนอนให้ทุกค่าของค่าระหว่างค่าต่ำสุด - สูงสุด

ดังนั้นเพื่อให้ขั้นตอนของการสร้าง tick ของแกนนอนใช้เวลาไม่มากเราจึงต้องกำหนดช่วงของการ tick ค่าในแกนนอนให้เหมาะสม

จากตัวอย่างในที่นี้ที่เป็นประชากรของประเทศไทยเมื่อปี พ.ศ. ๒๕๕๕ ค่าสูงสุดของความถี่ในแต่ละช่วงอายุคือ

 

> max(thpop55$male)
[1] 2672126

 

ในที่นี้เราจะคิดเฉพาะด้านใดด้านหนึ่ง (หรือเพศใดเพศหนึ่ง) เท่านั้น โดยตั้งอยู่บนพื้นฐานที่ว่า อัตราส่วนระหว่างเพศชายและเพศหญิงเป็น ๑ ต่อ ๑ หรือใกล้เคียง

ความถี่สูงสุดคือ ๒,๖๗๒,๑๒๖

ดังนั้นหากไม่กำหนดค่า scale ให้กับ laxalb และ raxlab ฟังก์ชัน pyramid.plot(0 จะทำการ tick แกนนอนให้ทุกค่าคือ ๒,๖๗๒,๑๒๖ ค่าหรือครั้งแต่ด้าน (ซ้ายและขวา) ทำให้ต้องใช้เวลานาน (ต้องคิดสัดส่วนจากพื้นที่การแสดงผลของ graphic device ด้วย)

 

นอกจากนี้การกำหนดช่วงของการ tick ค่าแกนนอนก็สำคัญ เพื่อไม่ให้มีการ tick แกนนอนถี่เกินไป

 

ค่าต่ำสุดคือศูนย์ ค่าสูงสุดคือ ๒,๖๗๒,๑๒๖ เรากำหนดค่าช่วงของการ tick สมมติว่าให้มี ๑๐ ช่วง ดังนั้นช่วงห่างของแต่ละ tick จะเป็น ๒,๖๗๒,๑๒๖/ ๑๐ = ๒๖๗,๒๑๒.๖ หรือทำให้เป็นตัวเลขกลม ๆ

เรากำหนดให้ค่าสูลสุดเป็น ๓,๐๐,๐๐๐ กำหนดช่วงห่าง ๑๐ ช่วง ดังนั้นช่วงห่างช่วงละ ๓ แสน

 

ดังนั้นตัวเลือก lxlab และ rxlab มีค่าเป็น

laxlab=seq(0,3e6,by=3e5)

raxlab=seq(0,3e6,by=3e5)

 

บรรทัดคำสั่งสร้างปิรามิดประชากร

> par(mar=pyramid.plot(lx,rx,labels=agegroup, gap=3e5,unit="Freq", laxlab=seq(0,3e6,by=3e5),raxlab=seq(0,3e6,by=3e5)))

 

ผลที่ได้เป็น

 

 

เราจะเห็ยว่าค่าที่ label ให้กับแกนนอนยังดูไม่สวยนัก เนื่องจากช่วงที่แบ่งเป็น ๑๐ ช่วงเมื่อเทียบกับค่าที่ต้อง label ให้กับแต่ละ tick เทียบกับสัดส่วนของแกนนอนแต่ละด้านแล้ว พบว่ามีพื้นที่น้อยไม่สามารถแสดงค่าตรงจุด tick แกนนอนได้ทุกค่า

 

เราลองแบ่งการ tick แกนนอนออกเป็นครั้งละ ๑ ล้าน

 

บรรทัดคำสั่ง

> par(mar=pyramid.plot(lx,rx,labels=agegroup, gap=3e5,unit="Freq", laxlab=seq(0,3e6,by=1e6),raxlab=seq(0,3e6,by=1e6)))

 

ผลที่ได้

 

 

เราพบว่าการสร้างปิรามิดประชากรขนาดใหญ่เมื่อเรากำหนดค่า lxlab และค่า rxlab ที่เหมาะสมนั้น ฟังก์ชัน pyramid.plot() จะใช้เวลาในการสร้างปิรามิดประชากรเพียงแค่ช่วงเวลาสั้น ๆ เท่านั้นเอง ใกล้เคียงกับการสร้างปิรามิดประชากรด้วยด้วยฟังก์ชัน pyramid() ของ package epicalc

 

ค่าตัวเลข 3e+06, 2e+06 หรือ 1e+06 คือค่าที่เขียนอยู่ในรูปแบบ Scientific notation

3e+06 คือ 3 x 1,000,000 หรือ 3 คูณสิบยกกำลัง ๖

 

อิอิอิ

 

เราเอง

 

เพลง: Everybody pays
ศิลปิน: Mark Knopfler

 

หมวดหมู่บันทึก: พัฒนางานประจำ
สัญญาอนุญาต: ซีซี: แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกัน Cc-by-nc-sa
สร้าง: 16 กรกฎาคม 2557 12:45 แก้ไข: 28 เมษายน 2563 17:28 [ แจ้งไม่เหมาะสม ]
ดอกไม้
สมาชิกที่ให้กำลังใจ: Ico24 คนธรรมดา, Ico24 ทดแทน, และ 2 คนอื่น.
สมาชิกที่ให้กำลังใจ
 
Facebook
Twitter
Google

บันทึกอื่นๆ

ความเห็น

พยายามแล้วน่ะน้าน่ะ อ่านของน้าแต่

มันคงเฉพาะทาง และต้องศึกษาจากน้าต่อไปเรื่อย ๆ ฮิ

คุณต้องทำการเข้าระบบก่อนแสดงความเห็น