บทที่ 4
Multivariate
Data
ข้อมูลที่ประกอบด้วยตัวแปรมากกว่า
2 ตัว นั้นสามารถทำการสรุปและศึกษาลักษณะของข้อมูลชุดนี้ได้ด้วยวิธีที่คล้ายคลึงกับวิธีที่ใช้กับข้อมูลที่มีตัวแปรเดียวและสองตัวแปร ถึงแม้ว่าจะมีความแตกต่างในเรื่องการศึกษาความสัมพันธ์ของ ตัวแปรหลายตัวก็ตาม ซึ่งความแตกต่างนี้สามารถแก้ไขได้โดยการพิจารณาความสัมพันธ์ระหว่างตัวแปรเหล่านี้พร้อมๆ กัน หรือใช้วิธีที่กำหนดให้ตัวแปรหนึ่งมีค่าคงที่ในขณะที่พิจารณาตัวแปรตัวอื่นๆ
4.1 Viewing
Multivariate Data
ในบทนี้เราจะพิจารณาถึงตัวอย่างของข้อมูลที่ประกอบด้วยตัวแปรหลายตัว 3 ตัวอย่าง คือ การสรุปข้อมูลที่ได้จากการสำรวจ (ข้อมูลเชิงกลุ่ม) การเปรียบเทียบตัวอย่างที่เป็ นอิสระกันหลายชุด และการหาความสัมพันธ์ระหว่างตัวแปรหลายๆตัว
4.1.1 การสรุปข้อมูลเชิงกลุ่ม
จากที่ผ่านมาเราใช้ตารางในการทำการสรุปสำหรับข้อมูล 2 ตัวแปร และเราสามารถใช้ตารางในการทำการสรุปเกี่ยวกับ ข้อมู ลหลายตัวแปรได้เช่นเดียวกัน อย่างไรก็ตามตารางที่ ได้จะแสดงเพียงความสัมพันธ์ระหว่างตัวแปรทีละสองตัวเท่านั้น ทำให้เราต้องใช้ตารางหลายตารางในการพิจารณาตัวแปรหลายๆตัว
ตัวอย่างที่ 4.1
ข้อมู ลชุด student.expenses (UsingR) ประกอบด้วยผลที่ ได้จากการสำรวจ โดยที่ นักศึกษาที่ เป็นตัวอย่าง แต่ละคนจะถูกถามว่าเขามีหนี้สินประเภทใดอยูใน 5 ประเภท
> library(UsingR)
> data(student.expenses)
> student.expenses
cell.phone cable.tv dial.up cable.modem car
1 Y Y Y N Y
2 Y N N N N
3 N N N N Y
4 Y Y N Y Y
5 N N N N N
6 Y N Y N Y
7 Y N N Y N
8 N N N N Y
9 Y Y N N Y
10 Y N Y N N
ในบทนี้เราจะพิจารณาถึงตัวอย่างของข้อมูลที่ประกอบด้วยตัวแปรหลายตัว 3 ตัวอย่าง คือ การสรุปข้อมูลที่ได้จากการสำรวจ (ข้อมูลเชิงกลุ่ม) การเปรียบเทียบตัวอย่างที่เป็ นอิสระกันหลายชุด และการหาความสัมพันธ์ระหว่างตัวแปรหลายๆตัว
4.1.1 การสรุปข้อมูลเชิงกลุ่ม
จากที่ผ่านมาเราใช้ตารางในการทำการสรุปสำหรับข้อมูล 2 ตัวแปร และเราสามารถใช้ตารางในการทำการสรุปเกี่ยวกับ ข้อมู ลหลายตัวแปรได้เช่นเดียวกัน อย่างไรก็ตามตารางที่ ได้จะแสดงเพียงความสัมพันธ์ระหว่างตัวแปรทีละสองตัวเท่านั้น ทำให้เราต้องใช้ตารางหลายตารางในการพิจารณาตัวแปรหลายๆตัว
ตัวอย่างที่ 4.1
ข้อมู ลชุด student.expenses (UsingR) ประกอบด้วยผลที่ ได้จากการสำรวจ โดยที่ นักศึกษาที่ เป็นตัวอย่าง แต่ละคนจะถูกถามว่าเขามีหนี้สินประเภทใดอยูใน 5 ประเภท
> library(UsingR)
> data(student.expenses)
> student.expenses
cell.phone cable.tv dial.up cable.modem car
1 Y Y Y N Y
2 Y N N N N
3 N N N N Y
4 Y Y N Y Y
5 N N N N N
6 Y N Y N Y
7 Y N N Y N
8 N N N N Y
9 Y Y N N Y
10 Y N Y N N
จากข้อมูลนี้จะเห็นได้ว่าข้อมูลมีลักษณะเป็
นตารางขนาดเล็ก แต่ก็ยังคงมีรายละเอียดมากเกินไปที่เราจะสามารถ
มองเห็นแนวโน้มของข้อมูลได้ง่าย เราต้องการที่จะสรุปเกี่ยวกับข้อมูลนี้โดยใช้ R ซึ่งทำได้โดยใช้คำสั่ง table() ในการสร้างตาราง 2 ทาง เมื่อพิจารณาถึงความสัมพันธ์ระหว่างการมี cell-phone และรถยนต์
> attach(student.expenses)
> names(student.expenses)
[1] "cell.phone" "cable.tv" "dial.up" "cable.modem" "car"
> table(cell.phone,car)
car
cell.phone N Y
N 1 2
Y 3 4
จากตารางที่ได้จะเห็นได้ว่านักศึกษาเกือบทั้งหมดจะมี cell-phone หรือ รถยนต์ หรืออย่างใดอย่างหนึ่ง และมีนักศึกษา เพียงคนเดียวเท่านั้นที่ไม่มีทั้งสองอย่างนี้
Three-way contigency tableหรือ n-way contingency table เป็ นตารางที่แสดงความสัมพันธ์ระหว่างตัวแปร 3 ตัว หรือn ตัว วิธีการสร้างตารางแบบนี้คือ การกำหนดระดับของตัวแปรหนึ่ง ในขณะที่สร้าง หรือn ตัว วิธีการสร้างตารางแบบนี้คือ การกำหนดระดับของตัวแปรหนึ่ง ในขณะที่สร้างตารางสองทางสำหรับตัวแปร สองตัวที่เราสนใจ เช่น เราสนใจศึกษาว่าค่าใช้จ่ายสำหรับ cable modem มีผลกระทบต่อความสัมพันธ์ระหว่างการมี cell-phone และการมีรถยนต์หรือไม่ เราสามารถสร้างตารางสามทางได้ดังนี้
> table(cell.phone,car,cable.modem)
, , cable.modem = N
car
มองเห็นแนวโน้มของข้อมูลได้ง่าย เราต้องการที่จะสรุปเกี่ยวกับข้อมูลนี้โดยใช้ R ซึ่งทำได้โดยใช้คำสั่ง table() ในการสร้างตาราง 2 ทาง เมื่อพิจารณาถึงความสัมพันธ์ระหว่างการมี cell-phone และรถยนต์
> attach(student.expenses)
> names(student.expenses)
[1] "cell.phone" "cable.tv" "dial.up" "cable.modem" "car"
> table(cell.phone,car)
car
cell.phone N Y
N 1 2
Y 3 4
จากตารางที่ได้จะเห็นได้ว่านักศึกษาเกือบทั้งหมดจะมี cell-phone หรือ รถยนต์ หรืออย่างใดอย่างหนึ่ง และมีนักศึกษา เพียงคนเดียวเท่านั้นที่ไม่มีทั้งสองอย่างนี้
Three-way contigency tableหรือ n-way contingency table เป็ นตารางที่แสดงความสัมพันธ์ระหว่างตัวแปร 3 ตัว หรือn ตัว วิธีการสร้างตารางแบบนี้คือ การกำหนดระดับของตัวแปรหนึ่ง ในขณะที่สร้าง หรือn ตัว วิธีการสร้างตารางแบบนี้คือ การกำหนดระดับของตัวแปรหนึ่ง ในขณะที่สร้างตารางสองทางสำหรับตัวแปร สองตัวที่เราสนใจ เช่น เราสนใจศึกษาว่าค่าใช้จ่ายสำหรับ cable modem มีผลกระทบต่อความสัมพันธ์ระหว่างการมี cell-phone และการมีรถยนต์หรือไม่ เราสามารถสร้างตารางสามทางได้ดังนี้
> table(cell.phone,car,cable.modem)
, , cable.modem = N
car
cell.phone N Y
N 1 2
Y 2 3
, , cable.modem = Y
car
cell.phone N Y
N 0 0
Y 1 1
จากตารางที่ได้จะเห็นว่านักศึกษาที่มีค่าใช้จ่ายเกี่ยวกับ cable modem นั้นต้องตัดค่าใช้จ่ายเกี่ยวกับ cell-phone และรถยนต์ออกไป จากคำสั่ง table() จะเห็นได้ว่าฟังก์ชันนี้จะใช้ตัวแปรสองตัวแรกในการสร้างตารางหลัก และใช้ตัวแปรตัวที่สามในการสร้างตารางที่ แตกต่างกันสำหรับแต่ละระดับของตัวแปรตัวนี้
อย่างไรก็ตามการสร้างตารางลักษณะนี้ทำให้เปลืองพื้นที่ในการแสดงผลลัพธ์ เราสามารถสร้างตารางสามทางได้อีกรูปหนึ่งโดยใช้คำสั่ง ftable() (flatten table) ดังนี้
> ftable(table(cell.phone,car,cable.modem),
+ col.vars=c("cable.modem", "car")) # specify column variables
cable.modem N Y
car N Y N Y
cell.phone
N 1 2 0 0
Y 2 3 1 1
N 1 2
Y 2 3
, , cable.modem = Y
car
cell.phone N Y
N 0 0
Y 1 1
จากตารางที่ได้จะเห็นว่านักศึกษาที่มีค่าใช้จ่ายเกี่ยวกับ cable modem นั้นต้องตัดค่าใช้จ่ายเกี่ยวกับ cell-phone และรถยนต์ออกไป จากคำสั่ง table() จะเห็นได้ว่าฟังก์ชันนี้จะใช้ตัวแปรสองตัวแรกในการสร้างตารางหลัก และใช้ตัวแปรตัวที่สามในการสร้างตารางที่ แตกต่างกันสำหรับแต่ละระดับของตัวแปรตัวนี้
อย่างไรก็ตามการสร้างตารางลักษณะนี้ทำให้เปลืองพื้นที่ในการแสดงผลลัพธ์ เราสามารถสร้างตารางสามทางได้อีกรูปหนึ่งโดยใช้คำสั่ง ftable() (flatten table) ดังนี้
> ftable(table(cell.phone,car,cable.modem),
+ col.vars=c("cable.modem", "car")) # specify column variables
cable.modem N Y
car N Y N Y
cell.phone
N 1 2 0 0
Y 2 3 1 1
4.1.2 การเปรียบเทียบตัวอย่างหลายกลุ่มที่เป็นอิสระกัน
เมื่อเรามีข้อมูลหลายๆตัวแปรและตัวแปรเหล่านี้เป็ นชนิดเดียวกัน เรามักต้องการที่ จะเปรียบเทียบตัวแปรเหล่านี้เกี่ยวกับ ค่ากลาง การกระจาย และการแจกแจง ซึ่งการเปรียบเทียบเหล่านี้สามารถทำได้โดยง่ายโดยการใช้ Boxplots
ตัวอย่างที่ 4.2
ข้อมูลชุด ewr (UsingR) เป็ นข้อมู ลเกี่ยวกับ taxi-in-and-out ของเครื่องบินที่ลงจอดที่ สนามบิน Newark Liberty ซึ่ งประกอบด้วยระยะทางเฉลี่ ยรายเดือนที่ เครื่องบินใช้ taxi ในการขึ้น-ลง สนามบินของสายการบิน 8 สายการบิน ข้อมูลนี้ใช้เพื่อศึกษาว่าเครื่องบินของสายการบินใดที่ ขึ้น-ลง สนามบินเร็วกว่าสายการบินอื่น เราสร้าง Boxplots เพื่อ ศึกษาลักษณะของข้อมูลของสายการบินทั้ง 8 ดังนี้
> attach(ewr)
> names(ewr)
[1] "Year" "Month" "AA" "CO" "DL" "HP" "NW"
[8] "TW" "UA" "US" "inorout"
> boxplot(AA, CO, DL, HP, NW, TW, UA, US)
ได้กราฟดังรูปที่ 4.1 ซึ่งแสดงให้เห็นว่าสายการบินที่ 2 (Continental) เป็ นสายการบินที่แย่ที่สุด เนื่องจากมีค่าต่ำสุด ค่าสูงสุด และค่ามัธยฐานของข้อมูลมากที่สุดเมื่อเทียบกับสายการบินอื่นๆ อย่างไรก็ตามสายการบินที่ 4 (America West) มีค่ามัธยฐานมากที่สุด
เมื่อเรามีข้อมูลหลายๆตัวแปรและตัวแปรเหล่านี้เป็ นชนิดเดียวกัน เรามักต้องการที่ จะเปรียบเทียบตัวแปรเหล่านี้เกี่ยวกับ ค่ากลาง การกระจาย และการแจกแจง ซึ่งการเปรียบเทียบเหล่านี้สามารถทำได้โดยง่ายโดยการใช้ Boxplots
ตัวอย่างที่ 4.2
ข้อมูลชุด ewr (UsingR) เป็ นข้อมู ลเกี่ยวกับ taxi-in-and-out ของเครื่องบินที่ลงจอดที่ สนามบิน Newark Liberty ซึ่ งประกอบด้วยระยะทางเฉลี่ ยรายเดือนที่ เครื่องบินใช้ taxi ในการขึ้น-ลง สนามบินของสายการบิน 8 สายการบิน ข้อมูลนี้ใช้เพื่อศึกษาว่าเครื่องบินของสายการบินใดที่ ขึ้น-ลง สนามบินเร็วกว่าสายการบินอื่น เราสร้าง Boxplots เพื่อ ศึกษาลักษณะของข้อมูลของสายการบินทั้ง 8 ดังนี้
> attach(ewr)
> names(ewr)
[1] "Year" "Month" "AA" "CO" "DL" "HP" "NW"
[8] "TW" "UA" "US" "inorout"
> boxplot(AA, CO, DL, HP, NW, TW, UA, US)
ได้กราฟดังรูปที่ 4.1 ซึ่งแสดงให้เห็นว่าสายการบินที่ 2 (Continental) เป็ นสายการบินที่แย่ที่สุด เนื่องจากมีค่าต่ำสุด ค่าสูงสุด และค่ามัธยฐานของข้อมูลมากที่สุดเมื่อเทียบกับสายการบินอื่นๆ อย่างไรก็ตามสายการบินที่ 4 (America West) มีค่ามัธยฐานมากที่สุด
รูปที่ 4.1: Boxplot ของข้อมูล taxi-in-and-out
4.1.3 Comparing Relationships
เราสามารถใช้ Scatterplot ในการศึกษาความสัมพันธ์ระหว่ างตัวแปรมากกว่าสองตัวได้ โดยการสร้าง Scatterplot หลายๆรูป หรือสร้างกราฟรูปเดียวแต่ใช้เครื่องหมายที่แตกต่างกันหรือสีที่แตกต่างกันในการจำแนกแต่ละคู่ของตัวแปรก็ได้
ตัวอย่างที่ 4.3
ชุดข้อมูล babies (UsingR) มีตัวแปรหลายตัวที่เก็บรวบรวมมาจากมารดามือใหม่ ซึ่งเป็นส่วนหนึ่งของ
การศึกษาเกี่ยวกับสุขภาพและพัฒนาการของเด็ก ตัวแปรเหล่านี้ประกอบด้วย ระยะเวลาของการตั้งครรภ์ (gestation period) อายุของมารดา (maternal age) ปริมาณการสูบบุหรี่ของมารดา (smoke) และปัจจัยอื่นๆ เช่น ระดับการศึกษาของมารดา ซึ่งในข้อมูลชุดนี้มีตัวแปรทั้งหมด 23 ตัวแปร
จากข้อมูลชุดนี้ เราจะสร้าง scatter plot ที่แสดงความสัมพันธ์ระหว่างระยะเวลาในการตั้งครรภ์และน้ำหนักแรกเกิดของทารก โดยแบ่งกลุ่มตามการสูบบุหรี่ของมารดา ซึ่งเราจะใช้ลักษณะของจุดที่แตกต่างกันในการระบุกลุ่มของข้อมูลตามการสูบบุหรี่ของมารดา
> par(mfrow = c(1,2), cex = 0.65)
> gestation[gestation == 999] = NA # 999 is code for NA
> plot(gestation,wt) # scatterplot
> plot(gestation,wt,pch=smoke) # different plot characters
> table(smoke) # values of plot characters
smoke 0 1 2 3 9
544 484 95 103 10
> legend(locator(1),
+ legend=c("never", "yes", "until pregnant", "long ago", "unknown"),
+ pch=c(0:3,9))
จากชุดคำสั่งในข้างต้นจะได้กราฟดังรูปที่ 4.2 ในกราฟรูปแรกทางซ้ายมือจะเห็นได้ว่ายิ่งระยะเวลาในการตั้งครรภ์มากน้ำหนักแรกเกิดของทารกจะมากขึ้นด้วย นอกจากนั้นเรายังสามารถศึกษาเพิ่มเติมได้อีกว่าปัจจัยอื่นๆ เช่น การสูบบุหรี่ของมารดามีผลกระทบต่อความสัมพันธ์นี้หรือไม่ได้โดยดู จากกราฟทางด้านขวามือ
เราสามารถใช้ Scatterplot ในการศึกษาความสัมพันธ์ระหว่ างตัวแปรมากกว่าสองตัวได้ โดยการสร้าง Scatterplot หลายๆรูป หรือสร้างกราฟรูปเดียวแต่ใช้เครื่องหมายที่แตกต่างกันหรือสีที่แตกต่างกันในการจำแนกแต่ละคู่ของตัวแปรก็ได้
ตัวอย่างที่ 4.3
ชุดข้อมูล babies (UsingR) มีตัวแปรหลายตัวที่เก็บรวบรวมมาจากมารดามือใหม่ ซึ่งเป็นส่วนหนึ่งของ
การศึกษาเกี่ยวกับสุขภาพและพัฒนาการของเด็ก ตัวแปรเหล่านี้ประกอบด้วย ระยะเวลาของการตั้งครรภ์ (gestation period) อายุของมารดา (maternal age) ปริมาณการสูบบุหรี่ของมารดา (smoke) และปัจจัยอื่นๆ เช่น ระดับการศึกษาของมารดา ซึ่งในข้อมูลชุดนี้มีตัวแปรทั้งหมด 23 ตัวแปร
จากข้อมูลชุดนี้ เราจะสร้าง scatter plot ที่แสดงความสัมพันธ์ระหว่างระยะเวลาในการตั้งครรภ์และน้ำหนักแรกเกิดของทารก โดยแบ่งกลุ่มตามการสูบบุหรี่ของมารดา ซึ่งเราจะใช้ลักษณะของจุดที่แตกต่างกันในการระบุกลุ่มของข้อมูลตามการสูบบุหรี่ของมารดา
> par(mfrow = c(1,2), cex = 0.65)
> gestation[gestation == 999] = NA # 999 is code for NA
> plot(gestation,wt) # scatterplot
> plot(gestation,wt,pch=smoke) # different plot characters
> table(smoke) # values of plot characters
smoke 0 1 2 3 9
544 484 95 103 10
> legend(locator(1),
+ legend=c("never", "yes", "until pregnant", "long ago", "unknown"),
+ pch=c(0:3,9))
จากชุดคำสั่งในข้างต้นจะได้กราฟดังรูปที่ 4.2 ในกราฟรูปแรกทางซ้ายมือจะเห็นได้ว่ายิ่งระยะเวลาในการตั้งครรภ์มากน้ำหนักแรกเกิดของทารกจะมากขึ้นด้วย นอกจากนั้นเรายังสามารถศึกษาเพิ่มเติมได้อีกว่าปัจจัยอื่นๆ เช่น การสูบบุหรี่ของมารดามีผลกระทบต่อความสัมพันธ์นี้หรือไม่ได้โดยดู จากกราฟทางด้านขวามือ
ฟังก์ชัน table() ใช้ช่วยในการหาช่วงของค่าของการสูบบุหรี่ของมารดา
เราสามารถดูจาก help page ของ babies ได้ว่าค่าเหล่านี้หมายถึงอะไร
รูปที่ 4.2: Scaterplots of gestation versus
weight by smoke factor
อย่างไรก็ตามเราจะเห็นได้ว่าในรูปที่ 4.2 มีความหนาแน่นของจุดมากเกินไป ทำให้เราเห็นลักษณะความสัมพันธ์ในแต่ละกลุ่มไม่ชัดเจน
ดังนั้นเราอาจใช้สีที่แตกต่างกันเข้ามาช่วยเพื่อให้กราฟดูได้ง่ายขึ้น โดยใช้ argument col= ในฟังก์ชัน plot() เข้ามาช่วย ในตัวอย่างนี้เราจะใช้ rainbow() เพื่อสร้างสี 5 สี ในการแยกความแตกต่างระหว่างค่าของsmoke ดังนี้
> smoke[smoke == 9] = 4 # change "9" to a "4"
> plot(gestation,wt,col=rainbow(5)[smoke+1]) # add 1 at smoke
> smoke[smoke == 9] = 4 # change "9" to a "4"
> plot(gestation,wt,col=rainbow(5)[smoke+1]) # add 1 at smoke
Plotting additional
points and functions
ในบางครั้งเราต้องการเพิ่มจุดหรือเส้นเข้าไปในกราฟที่สร้างไว้ เช่นการเพิ่มเส้นถดถอยเข้าไปใน scatterplot เป็ นต้นเพื่อช่วยให้เข้าใจถึงฟังก์ชันการพลอตกราฟใน R เราควรทราบว่าฟังก์ชันที่ใช้ในการสร้างกราฟนั้นแบ่งเป็ นสองชนิดคือ"high-level" เช่น plot() และ "low-level" เช่น abline() ความแตกต่างระหว่างฟังก์ชันสองชนิดนี้คือ ฟังก์ชัน "high-level" จะเป็ นการสร้างกราฟลงในหน้าต่างของกราฟ แต่ฟังก์ชัน "low-level" จะเป็ นการเพิ่มกราฟเข้าไปในกราฟที่สร้างไว้ก่อนแล้วจากฟังก์ชัน "high-level" ตารางที่ 4.1 รวบรวมฟังก์ชันสำหรับการสร้างกราฟที่มีประโยชน์
ในบางครั้งเราต้องการเพิ่มจุดหรือเส้นเข้าไปในกราฟที่สร้างไว้ เช่นการเพิ่มเส้นถดถอยเข้าไปใน scatterplot เป็ นต้นเพื่อช่วยให้เข้าใจถึงฟังก์ชันการพลอตกราฟใน R เราควรทราบว่าฟังก์ชันที่ใช้ในการสร้างกราฟนั้นแบ่งเป็ นสองชนิดคือ"high-level" เช่น plot() และ "low-level" เช่น abline() ความแตกต่างระหว่างฟังก์ชันสองชนิดนี้คือ ฟังก์ชัน "high-level" จะเป็ นการสร้างกราฟลงในหน้าต่างของกราฟ แต่ฟังก์ชัน "low-level" จะเป็ นการเพิ่มกราฟเข้าไปในกราฟที่สร้างไว้ก่อนแล้วจากฟังก์ชัน "high-level" ตารางที่ 4.1 รวบรวมฟังก์ชันสำหรับการสร้างกราฟที่มีประโยชน์
plot() ใช้สร้าง scatterplot ซึ่งกราฟจะเป็ นกราฟจุดถ้าใช้เงื่อนไขเป็ น type = "l" จะเป็ นการสร้าง
กราฟเส้น และยังมีเงื่อนไขอื่นๆให้เลือกใช้
points() เป็น"low-level"ฟังก์ชันในการสร้างกราฟที่มีเงื่อนไขต่างๆเหมือนplot()
lines() คล้ายกับpoints()แต่ละมีการเชื่อมจุดด้วยเส้นตรง
ablines() เป็นฟังก์ชันที่ใช้ในการเพิ่มเส้นเข้าไปในรูป
มีเงื่อนไขคือ a= และ b= เพื่อพลอตเส้นy=
a+ bx และมีเงื่อนไข h= และ v= เพื่อพลอตเส้นนอนและเส้นตั้งฉาก
curve() เป็นทั้ง
"high-level" และ "low-level"
ฟังก์ชัน เพื่อสร้างกราฟของฟังก์ชันของx เมื่อใช้เงื่อนไข
add=TRUE จะเป็นการเพิ่มกราฟเส้นโค้งเข้าไปในรูปที่มีอยูแล้ว โดยใช้สเกลกับค่าของx แต่ถ้าไม่มี
เงื่อนไข add=TRUE จะเป็นการสร้างกราฟใหม่ในช่วงที่กำหนดโดย from=และ to= โดยมี default
เป็ น 0 และ 1
add=TRUE จะเป็นการเพิ่มกราฟเส้นโค้งเข้าไปในรูปที่มีอยูแล้ว โดยใช้สเกลกับค่าของx แต่ถ้าไม่มี
เงื่อนไข add=TRUE จะเป็นการสร้างกราฟใหม่ในช่วงที่กำหนดโดย from=และ to= โดยมี default
เป็ น 0 และ 1
rug() เป็ นการเพิ่มเส้นไปตามแนวแกนx หรือy เพื่อแสดงค่าของข้อมูลในชุดข้อมูลตัวแปรเดียว มี defualt
เป็ นการสร้างเส้นบนแกนx และใช้ side=2 เพื่อสร้างเส้นตามแกนy
เป็ นการสร้างเส้นบนแกนx และใช้ side=2 เพื่อสร้างเส้นตามแกนy
arrows() เพิ่อลูกศรในรูป
text() เพิ่มตัวอักษรในรูปที่ตำแหน่งที่กำหนด
title() เพิ่มชื่อให้กับกราฟ มีเงื่อนไขคือ main= จะเพิ่มชื่อหลักของกราฟ sub= เพิ่มชื่อรองของกราฟ
xlab= และ ylab= เพิ่มชื่อให้แกนx และแกนy
legend() เพิ่มlegendให้กับกราฟ
รูปที่ 4.3: Scaterplots of gestation versus weight by smoke factor (using colour to separate values of smoke)
เราจะลองสร้างกราฟของตัวอย่างเข้าไปในกราฟ
โดยเริ่มจากการสร้าง scatterplot ก่อน
> gestation[gestation == 999] = NA
> f = wt[smoke == 0] ~ gestation[smoke == 0]
> plot(f, xlab="gestation", ylab="wt")
> abline(lm(f)) #> f1 = wt[smoke == 1] ~ gestation[smoke == 1]
> points(f1,pch=16)
> abline(lm(f1),cex=2,lty=2)
> legend(150,175,legend=c("0=never smoked","1=smokes now"),
+ pch=c(1,16), lty=1:2)
> detach(babies)
ได้กราฟดังรูปที่ 4.4
4.2 R Basics: Data Frames and Lists
สำหรับข้อมูลที่ ประกอบด้วยตัวแปรหลายๆตัว เราสามารถเข้าถึงและทำงานกับตัวแปรแต่ละตัวได้อย่างเป็ นอิสระกันอย่างไรก็ตามในบางครั้งการเข้าถึงตัวแปรทุกตัวในคราวเดียวกันก็อาจเป็ นประโยชน์ในการวิเคราะห์ข้อมูลได้ เช่นทำให้ง่ายต่อการการเก็บบันทึกงานของเรา และง่ายต่อการจัดการ ใน R ชุดของข้อมูลที่ประกอบด้วยตัวแปรตั้งแต่หนึ่งตัวขึ้นไปนั้น เรียกว่า data frame เราใช้ Data frame ในการเก็บข้อมูลในรูปของตาราง โดยที่แต่ละแถวจะเป็ นค่าสังเกตของหน่วยตัวอย่างเดียวกันและแต่ละคอลัมน์คือเวกเตอร์ข้อมูลประกอบด้วยค่าสังเกตของตัวแปรๆหนึ่ง ตัวแปรใน data frame หนึ่งๆไม่จำเป็นต้องเป็ นชนิดเดียวกัน บางตัวอาจเป็ นตัวแปรเชิงปริมาณ บางตัวอาจเป็ นตัวแปรเชิงกลุ่มก็ได้ แต่ในคอลัมน์เดียวกันข้อมูลต้องเป็ นชนิดเดียวกัน ถ้าตารางข้อมูลประกอบด้วยเวกเตอร์ข้อมูลที่เป็ นชนิดเดียวกันทั้งหมด เช่น เป็นข้อมูลเชิงปริมาณทั้งหมดตารางข้อมูลนี้สามารถเก็บไว้ในรูปของเมตริกซ์ได้เช่นเดียวกัน ถึงแม้ว่า data frame อาจจะไม่ใช่มตริกซ์ (เนื่องจากข้อมูลในdata frame ไม่จำเป็นต้องเป็ นตัวเลข) แต่การเข้าถึงข้อมูลนั้นทำได้ในทำนองเดียวกัน List เป็นการเก็บข้อมูลในรูปแบบทั่วๆไป และมีความยืดหยุ่นมากกว่าการใช้ data frame เราสามารถใช้ list ในการเก็บข้อมูลของตัวแปรที่มีขนาดไม่เท่ากันได้ list อาจประกอบด้วยเวกเตอร์ข้อมูล data frame ฟังก์ชัน หรือแม้กระทั่งอีก list หนึ่งก็ได้
Data frame นั้นถือเป็น list ชนิดพิเศษ ซึ่งสามารถเข้าถึงข้อมูลใน data frame ได้ทั้งแบบของเมตริกซ์และ list
4.2.1 การสร้าง Data Frame หรือ List
เราสามารถสร้าง data frame ได้โดยใช้ฟังก์ชัน data.frame() และสร้าง listโดยใช้ฟังก์ชัน list() และสามารถเรียกใช้ data frame ด้วยฟังก์ชัน read.table() หรือ read.csv() เช่น
> x = 1:2 # define x
> y = letters[1:2] # y = c("a","b")
> z = 1:3 # z has 3 elements, x,y only 2
> data.frame(x,y) # rectangular, cols are variables
x y
1 1 a
2 2 b
> data.frame(x,y,z) # not all the same size
Error in data.frame(x, y, z) : arguments imply differing number of rows: 2, 3
จะเห็นได้มี error เกิดขึ้น เนื่องจากตัวแปรแต่ละตัวหรือแต่ละคอลัมน์มีขนาดไม่เท่ากัน ซึ่งตามคุณสมบัติของ dataframe นั้นตัวแปรทุ กตัวใน data frame ต้องมีขนาดเท่ ากัน ดังนั้นหากตัวแปรที่ เราต้องการสร้างให้เป็นชุดข้อมูลมีขนาดไม่เท่ากัน เราสามารถสร้างได้ในรูปของ list ดังต่อไปนี้
> list(x,y,z)
[[1]]
[1] 1 2
> gestation[gestation == 999] = NA
> f = wt[smoke == 0] ~ gestation[smoke == 0]
> plot(f, xlab="gestation", ylab="wt")
> abline(lm(f)) #> f1 = wt[smoke == 1] ~ gestation[smoke == 1]
> points(f1,pch=16)
> abline(lm(f1),cex=2,lty=2)
> legend(150,175,legend=c("0=never smoked","1=smokes now"),
+ pch=c(1,16), lty=1:2)
> detach(babies)
ได้กราฟดังรูปที่ 4.4
4.2 R Basics: Data Frames and Lists
สำหรับข้อมูลที่ ประกอบด้วยตัวแปรหลายๆตัว เราสามารถเข้าถึงและทำงานกับตัวแปรแต่ละตัวได้อย่างเป็ นอิสระกันอย่างไรก็ตามในบางครั้งการเข้าถึงตัวแปรทุกตัวในคราวเดียวกันก็อาจเป็ นประโยชน์ในการวิเคราะห์ข้อมูลได้ เช่นทำให้ง่ายต่อการการเก็บบันทึกงานของเรา และง่ายต่อการจัดการ ใน R ชุดของข้อมูลที่ประกอบด้วยตัวแปรตั้งแต่หนึ่งตัวขึ้นไปนั้น เรียกว่า data frame เราใช้ Data frame ในการเก็บข้อมูลในรูปของตาราง โดยที่แต่ละแถวจะเป็ นค่าสังเกตของหน่วยตัวอย่างเดียวกันและแต่ละคอลัมน์คือเวกเตอร์ข้อมูลประกอบด้วยค่าสังเกตของตัวแปรๆหนึ่ง ตัวแปรใน data frame หนึ่งๆไม่จำเป็นต้องเป็ นชนิดเดียวกัน บางตัวอาจเป็ นตัวแปรเชิงปริมาณ บางตัวอาจเป็ นตัวแปรเชิงกลุ่มก็ได้ แต่ในคอลัมน์เดียวกันข้อมูลต้องเป็ นชนิดเดียวกัน ถ้าตารางข้อมูลประกอบด้วยเวกเตอร์ข้อมูลที่เป็ นชนิดเดียวกันทั้งหมด เช่น เป็นข้อมูลเชิงปริมาณทั้งหมดตารางข้อมูลนี้สามารถเก็บไว้ในรูปของเมตริกซ์ได้เช่นเดียวกัน ถึงแม้ว่า data frame อาจจะไม่ใช่มตริกซ์ (เนื่องจากข้อมูลในdata frame ไม่จำเป็นต้องเป็ นตัวเลข) แต่การเข้าถึงข้อมูลนั้นทำได้ในทำนองเดียวกัน List เป็นการเก็บข้อมูลในรูปแบบทั่วๆไป และมีความยืดหยุ่นมากกว่าการใช้ data frame เราสามารถใช้ list ในการเก็บข้อมูลของตัวแปรที่มีขนาดไม่เท่ากันได้ list อาจประกอบด้วยเวกเตอร์ข้อมูล data frame ฟังก์ชัน หรือแม้กระทั่งอีก list หนึ่งก็ได้
Data frame นั้นถือเป็น list ชนิดพิเศษ ซึ่งสามารถเข้าถึงข้อมูลใน data frame ได้ทั้งแบบของเมตริกซ์และ list
4.2.1 การสร้าง Data Frame หรือ List
เราสามารถสร้าง data frame ได้โดยใช้ฟังก์ชัน data.frame() และสร้าง listโดยใช้ฟังก์ชัน list() และสามารถเรียกใช้ data frame ด้วยฟังก์ชัน read.table() หรือ read.csv() เช่น
> x = 1:2 # define x
> y = letters[1:2] # y = c("a","b")
> z = 1:3 # z has 3 elements, x,y only 2
> data.frame(x,y) # rectangular, cols are variables
x y
1 1 a
2 2 b
> data.frame(x,y,z) # not all the same size
Error in data.frame(x, y, z) : arguments imply differing number of rows: 2, 3
จะเห็นได้มี error เกิดขึ้น เนื่องจากตัวแปรแต่ละตัวหรือแต่ละคอลัมน์มีขนาดไม่เท่ากัน ซึ่งตามคุณสมบัติของ dataframe นั้นตัวแปรทุ กตัวใน data frame ต้องมีขนาดเท่ ากัน ดังนั้นหากตัวแปรที่ เราต้องการสร้างให้เป็นชุดข้อมูลมีขนาดไม่เท่ากัน เราสามารถสร้างได้ในรูปของ list ดังต่อไปนี้
> list(x,y,z)
[[1]]
[1] 1 2
[[2]]
[1] "a" "b"
[1] "a" "b"
[[3]]
[1] 1 2 3
พิจารณาจากผลที่ได้จากการใช้ list(x,y,z) สัญลักษณ์ [[1]] บ่งชี้ถึงเวกเตอร์ข้อมูลที่ 1 ในขณะที่ [1] ในบรรทัดถัดมาบ่งชี้ถึงตำแหน่งของค่าสังเกตในเวกเตอร์ข้อมูลนั้น หากเราต้องการเข้าถึงข้อมูลใน list สามารถทำได้ดังนี้ เช่นเราต้องการเข้าถึงเวกเตอร์ข้อมูล x ใน list
> data = list(x,y,z)
> data[[1]]
[1] 1 2
หรือต้องการเข้าถึงค่าสังเกตตำแหน่งที่ 1 ในเวกเตอร์ x
> data[[1]][1]
[1] 1
[1] 1 2 3
พิจารณาจากผลที่ได้จากการใช้ list(x,y,z) สัญลักษณ์ [[1]] บ่งชี้ถึงเวกเตอร์ข้อมูลที่ 1 ในขณะที่ [1] ในบรรทัดถัดมาบ่งชี้ถึงตำแหน่งของค่าสังเกตในเวกเตอร์ข้อมูลนั้น หากเราต้องการเข้าถึงข้อมูลใน list สามารถทำได้ดังนี้ เช่นเราต้องการเข้าถึงเวกเตอร์ข้อมูล x ใน list
> data = list(x,y,z)
> data[[1]]
[1] 1 2
หรือต้องการเข้าถึงค่าสังเกตตำแหน่งที่ 1 ในเวกเตอร์ x
> data[[1]][1]
[1] 1
การเพิ่มชื่อให้กับ data frame หรือ list
เราสามารถกำหนดชื่อให้กับแต่ละองค์ประกอบใน data fame และ list ได้โดยใช้ฟังก์ชัน names() เมื่อ
ใช้ฟังก์ชัน da-ta.frame(x,y) จะมีการกำหนดชื่อ x และ y เป็นชื่อของเวกเตอร์ข้อมูลโดยอัตโนมัติ แต่ถ้าใช้ list() จะไม่มีการกำหนดชื่อให้
> list(x.name=x,"y name"=y)
$x.name
[1] 1 2
$"y name"
[1] "a" "b"
เราสามารถใช้ฟังก์ชัน names() ในการกำหนดหรือเรียกชื่อของข้อมูลได้ ดังนี้
> eg = data.frame(x,y) # store the data frame
> names(eg) # the current names
[1] "x" "y"
> names(eg) = c("x.name","y.name") # change the names
เราสามารถกำหนดชื่อให้กับแต่ละองค์ประกอบใน data fame และ list ได้โดยใช้ฟังก์ชัน names() เมื่อ
ใช้ฟังก์ชัน da-ta.frame(x,y) จะมีการกำหนดชื่อ x และ y เป็นชื่อของเวกเตอร์ข้อมูลโดยอัตโนมัติ แต่ถ้าใช้ list() จะไม่มีการกำหนดชื่อให้
> list(x.name=x,"y name"=y)
$x.name
[1] 1 2
$"y name"
[1] "a" "b"
เราสามารถใช้ฟังก์ชัน names() ในการกำหนดหรือเรียกชื่อของข้อมูลได้ ดังนี้
> eg = data.frame(x,y) # store the data frame
> names(eg) # the current names
[1] "x" "y"
> names(eg) = c("x.name","y.name") # change the names
> names(eg)
[1] "x.name" "y.name"
สำหรับ data frame เราสามารถกำหนดและเรียกใช้ข้อมูลตามชื่อคอลัมน์และชื่อแถวได้ด้วยฟังก์ชัน colnames() และ rownames() ซึ่งทั้งสองแบบนี้สามารถกำหนดในคราวเดียวกันด้วยฟังก์ชัน dimnames()
[1] "x.name" "y.name"
สำหรับ data frame เราสามารถกำหนดและเรียกใช้ข้อมูลตามชื่อคอลัมน์และชื่อแถวได้ด้วยฟังก์ชัน colnames() และ rownames() ซึ่งทั้งสองแบบนี้สามารถกำหนดในคราวเดียวกันด้วยฟังก์ชัน dimnames()
ขนาดของ data frame หรือ list
Data frame นั้นประกอบด้วยตัวแปรจำนวนหนึ่ง และแต่ละตัวแปรนั้นจะมีขนาดเท่ากัน เราสามารถหาขนาดของ data frame ได้ด้วยฟังก์ชัน dim() เช่น
> library(UsingR)
> dim(ewr) # number of rows and columns
[1] 46 11 # number of cols is 2nd
> dim(ewr)[2]
[1] 11
จำนวนแถวและคอลัมน์นั้นสามารถหาได้โดยตรงด้วยฟังก์ชัน nrow() และ ncol()
4.2.2 การเข้าถึงค่าต่างๆใน Data Frame
ค่าต่างๆใน data frame นั้นสามารถเข้าถึงได้หลายวิธี เช่น เข้าถึงโดยการใช้ชื่อของตัวแปร นอกจากนั้นเรายังสามารถ เข้าถึงค่าสังเกตในแต่ละตัวแปรทีละค่าหรือทีละหลายๆค่าได้
การเข้าถึงตัวแปรต่างๆใน data frame โดยการใช้ชื่อ
โดยปกติเรามักเข้าถึงข้อมูลใน data frame โดยการใช้ฟังก์ชัน attach() data frame นั้น แล้วเข้าถึงตัวแปรด้วยชื่อของตัวแปรเหล่านั้น ซึ่งการทำแบบนี้อาจทำให้เกิดความสับสนในบางครั้ง เนื่องจากการใช้attach() โปรแกรม R จะ copyตัวแปรที่เราเรียกมา เมื่อมีการเปลี่ยนแปลงค่าใดๆในตัวแปรจะเป็ นการเปลี่ยนที่ตัว copy ไม่ใช่การเปลี่ยนที่ dataframe ดังนั้นค่าของตัวแปรใน data frame จะเป็ นค่าเดิม ส่งผลให้เวลาทำงานจะพบว่าตัวแปรชื่อเดียวกันแต่มีค่าของตัวแปรแตกต่างกัน
ตัวอย่างต่อไปนี้เป็ นการสร้าง data frame โดยใช้ data.frame() แล้ว attach ไว้ พิจารณาผลที่ได้เมื่อมีการเปลี่ยนข้อมูล
> x = data.frame(a=1:2,b=3:4) # make a data frame
> a # a is not there
Error: Object "a" not found
> attach(x) # now a and b are there
> a
[1] 1 2
> a[1] = 5 # assignment
> a
[1] 5 2
> x # not x though
a b
1 1 3
2 2 4
> detach(x) # remove x
> a # a is there and changed
[1] 5 2
> x # x is not changed
a b
1 1 3
2 2 4
การเข้าถึงข้อมูลใน data frames โดยการใช้ [ , ]
การเข้าถึงข้อมูลใน data frame สามารถทำได้โดยการอ้างถ์งชื่อคอลัมน์ (เลขคอลัมน์) และ/หรือ ชื่อแถว (เลขแถว)โดยมีรูปแบบดังนี้
dataframe’s name[row,column]
ในตัวอย่างต่อไปนี้เราได้สร้าง data frame แบบง่ายๆที่ประกอบด้วยตัวแปร 2 ตัว โดยที่แต่ละตัวมีขนาดเท่ากับสาม แล้วเพิ่มชื่อแถวให้กับ data frame นี้
> df = data.frame(x=1:3,y=4:6) # add in column names
> rownames(df) = c("row 1", "row 2", "row 3") # add row names
> df
x y
row 1 1 4
row 2 2 5
row 3 3 6
>df[3,2] # row=3,col=2
[1] 6
> df["row 3", "y"] # by name
[1] 6
> df[1:3,1] # rows 1, 2 and 3; column 1
[1] 1 2 3
> df[1:2,1:2] # rows 1 and 2, columns 1 and 2
x y
row 1 1 4
row 2 2 5
> df[,1] # all rows, column 1, returns vector
[1] 1 2 3
> df[1,] # row 1, all columns
x y
row 1 1 4
> df[c(T,F,T),] # rows 1 and 3 (T=TRUE)
x y
row 1 1 4
row 3 3 6
ตัวอย่างที่ 4.4
จากข้อมูลชุด babies (UsingR) เราต้องการศึกษาความสัมพันธ์ระหว่าง gestation, wt, age และ inc
ก่อนที่จะทำการวิเคราะห์ข้อมูลชุดนี้ได้ เราต้องทำการจัดการกับข้อมูลก่อน เนื่องจากตัวแปรบางตัวมีรหัสพิเศษสำหรับข้อมูลสูญหาย (NA) เมื่อพิจารณาเอกสารประกอบของข้อมูลชุดนี้ พบว่าตัวแปร gestation ใช้ 999 ตัวแปร ageใช้ 99 และตัวแปร inc เป็ นตัวแปรเชิงกลุ่มใช้ 98 เป็ น "not available"
> attach(babies)
> gestation[gestation == 999] = NA
> age[age == 99] = NA
> inc[inc == 98] = NA
> pairs(babies[, c("gestation", "wt", "age", "inc")])
Data frame นั้นประกอบด้วยตัวแปรจำนวนหนึ่ง และแต่ละตัวแปรนั้นจะมีขนาดเท่ากัน เราสามารถหาขนาดของ data frame ได้ด้วยฟังก์ชัน dim() เช่น
> library(UsingR)
> dim(ewr) # number of rows and columns
[1] 46 11 # number of cols is 2nd
> dim(ewr)[2]
[1] 11
จำนวนแถวและคอลัมน์นั้นสามารถหาได้โดยตรงด้วยฟังก์ชัน nrow() และ ncol()
4.2.2 การเข้าถึงค่าต่างๆใน Data Frame
ค่าต่างๆใน data frame นั้นสามารถเข้าถึงได้หลายวิธี เช่น เข้าถึงโดยการใช้ชื่อของตัวแปร นอกจากนั้นเรายังสามารถ เข้าถึงค่าสังเกตในแต่ละตัวแปรทีละค่าหรือทีละหลายๆค่าได้
การเข้าถึงตัวแปรต่างๆใน data frame โดยการใช้ชื่อ
โดยปกติเรามักเข้าถึงข้อมูลใน data frame โดยการใช้ฟังก์ชัน attach() data frame นั้น แล้วเข้าถึงตัวแปรด้วยชื่อของตัวแปรเหล่านั้น ซึ่งการทำแบบนี้อาจทำให้เกิดความสับสนในบางครั้ง เนื่องจากการใช้attach() โปรแกรม R จะ copyตัวแปรที่เราเรียกมา เมื่อมีการเปลี่ยนแปลงค่าใดๆในตัวแปรจะเป็ นการเปลี่ยนที่ตัว copy ไม่ใช่การเปลี่ยนที่ dataframe ดังนั้นค่าของตัวแปรใน data frame จะเป็ นค่าเดิม ส่งผลให้เวลาทำงานจะพบว่าตัวแปรชื่อเดียวกันแต่มีค่าของตัวแปรแตกต่างกัน
ตัวอย่างต่อไปนี้เป็ นการสร้าง data frame โดยใช้ data.frame() แล้ว attach ไว้ พิจารณาผลที่ได้เมื่อมีการเปลี่ยนข้อมูล
> x = data.frame(a=1:2,b=3:4) # make a data frame
> a # a is not there
Error: Object "a" not found
> attach(x) # now a and b are there
> a
[1] 1 2
> a[1] = 5 # assignment
> a
[1] 5 2
> x # not x though
a b
1 1 3
2 2 4
> detach(x) # remove x
> a # a is there and changed
[1] 5 2
> x # x is not changed
a b
1 1 3
2 2 4
การเข้าถึงข้อมูลใน data frames โดยการใช้ [ , ]
การเข้าถึงข้อมูลใน data frame สามารถทำได้โดยการอ้างถ์งชื่อคอลัมน์ (เลขคอลัมน์) และ/หรือ ชื่อแถว (เลขแถว)โดยมีรูปแบบดังนี้
dataframe’s name[row,column]
ในตัวอย่างต่อไปนี้เราได้สร้าง data frame แบบง่ายๆที่ประกอบด้วยตัวแปร 2 ตัว โดยที่แต่ละตัวมีขนาดเท่ากับสาม แล้วเพิ่มชื่อแถวให้กับ data frame นี้
> df = data.frame(x=1:3,y=4:6) # add in column names
> rownames(df) = c("row 1", "row 2", "row 3") # add row names
> df
x y
row 1 1 4
row 2 2 5
row 3 3 6
>df[3,2] # row=3,col=2
[1] 6
> df["row 3", "y"] # by name
[1] 6
> df[1:3,1] # rows 1, 2 and 3; column 1
[1] 1 2 3
> df[1:2,1:2] # rows 1 and 2, columns 1 and 2
x y
row 1 1 4
row 2 2 5
> df[,1] # all rows, column 1, returns vector
[1] 1 2 3
> df[1,] # row 1, all columns
x y
row 1 1 4
> df[c(T,F,T),] # rows 1 and 3 (T=TRUE)
x y
row 1 1 4
row 3 3 6
ตัวอย่างที่ 4.4
จากข้อมูลชุด babies (UsingR) เราต้องการศึกษาความสัมพันธ์ระหว่าง gestation, wt, age และ inc
ก่อนที่จะทำการวิเคราะห์ข้อมูลชุดนี้ได้ เราต้องทำการจัดการกับข้อมูลก่อน เนื่องจากตัวแปรบางตัวมีรหัสพิเศษสำหรับข้อมูลสูญหาย (NA) เมื่อพิจารณาเอกสารประกอบของข้อมูลชุดนี้ พบว่าตัวแปร gestation ใช้ 999 ตัวแปร ageใช้ 99 และตัวแปร inc เป็ นตัวแปรเชิงกลุ่มใช้ 98 เป็ น "not available"
> attach(babies)
> gestation[gestation == 999] = NA
> age[age == 99] = NA
> inc[inc == 98] = NA
> pairs(babies[, c("gestation", "wt", "age", "inc")])
ได้กราฟดังรูปที่ 4.5 ซึ่งไม่ใช่กราฟที่ถูกต้องเนื่องจากข้อมูลใน
data frame ไม่ได้มีการเปลี่ยนแปลง
รูปที่ 4.5: Scatterplot matrix of four
variables from babies: not correct
วิธีที่ดีกว่าในการเปลี่ยนค่าของข้อมูล
คือการหาตำแหน่งของข้อมูลที่เป็นค่าสูญหายของตัวแปรเหล่านี้ และดึงค่า เหล่านี้ออกไปเมื่
อมีการพลอตกราฟ
> rm()
> detach(babies)
> attach(babies)
> not.these = (gestation == 999) | (age == 99) | (inc == 98)
> detach(babies)
> attach(babies)
> not.these = (gestation == 999) | (age == 99) | (inc == 98)
> tmp =
babies[!not.these, c("gestation", "age", "wt",
"inc")]
> pairs(tmp)
> detach(babies)
ได้กราฟดังรูปที่ 4.6
ตัวอย่างที่ 4.5ตัวอย่างนี้จะแสดงการเข้าถึงข้อมูลโดยใช้ logical vectors: จากข้อมูลชุด ewr (UsingR) เราต้องการแบ่งข้อมูลตามตัวแปร inorout ซึ่งมีค่าเป็น in หรือ out ในชุดข้อมูลนี้ คอลัมน์ที่ 3 ถึง 10 เป็ นข้อมูลของแต่ละสายการบิน
เราสามารถสร้าง boxplot เพื่อเปรียบข้อมูลแบ่งตามตัวแปร inorout ได้ดังนี้
attach(ewr)
> par(mfrow=c(1,2), cex = 0.6)
> boxplot(ewr[inorout == "in", 3:10], main = "Taxi in")
> boxplot(ewr[inorout == "out", 3:10], main = "Taxi out")
ได้กราฟดังรูปที่ 4.7
attach(ewr)
> par(mfrow=c(1,2), cex = 0.6)
> boxplot(ewr[inorout == "in", 3:10], main = "Taxi in")
> boxplot(ewr[inorout == "out", 3:10], main = "Taxi out")
ได้กราฟดังรูปที่ 4.7
การใช้คำสั่ง subset( ) เป็ นอีกทางเลือกหนึ่งในการเข้าถึงข้อมูลใน
data frame เพียงบางส่วน แทนการใช้ [ , ] โดยมีรู ปแบบดังนี้
new.df = subset(old.df, subset = ..., select=...)
Argument subset = ในคำสั่งนี้ที่ใช้ในการกำหนดว่าจะเลือกทำงานกับแถวใดใน data frame บ้าง ส่วน select = ใช่ในการกำหนด column ที่จะทำงานด้วย โดยกำหนดในรูปของเวกเตอร์ของชื่อตัวแปรที่ต้องการ ต่อไปนี้เป็นตัวอย่างการใช้ subset
รูปที่ 4.6: Scatterplot matrix of four variables from babies
new.df = subset(old.df, subset = ..., select=...)
Argument subset = ในคำสั่งนี้ที่ใช้ในการกำหนดว่าจะเลือกทำงานกับแถวใดใน data frame บ้าง ส่วน select = ใช่ในการกำหนด column ที่จะทำงานด้วย โดยกำหนดในรูปของเวกเตอร์ของชื่อตัวแปรที่ต้องการ ต่อไปนี้เป็นตัวอย่างการใช้ subset
รูปที่ 4.6: Scatterplot matrix of four variables from babies
รูปที่ 4.7: Taxi in and out times by airline
> library(UsingR)
> data(ewr)
> ewr.in = subset(ewr, subset = inorout =="in", select = 3:10)
> ewr.out = subset(ewr, subset = inorout =="out", select = 3:10)
> par(mfrow=c(1,2))
ซึ่งจะให้ผลเช่นเดียวกับรูปที่ 4.7
การเรียงลำดับข้อมูลใน data frame ตามคอลัมน์ใดคอลัมน์หนึ่งสามารถทำได้โดยใช้คำสั่ง sort( ) ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 4.6
ข้อมูลชุด mtcars เราจะเรียงลำดับระยะทางเป็ นไมล์ต่อแกลลอน ซึ่งเป็ นตัวแปรชื่อ mpg ที่อยู่ใน data
frame ชื่อ mtcars ได้ดังนี้
> attach(mtcars)
> sort(mpg)
[1] 10.4 10.4 13.3 14.3 14.7 15.0 15.2 15.2 15.5
[10] 15.8 16.4 17.3 17.8 18.1 18.7 19.2 19.2 19.7
[19] 21.0 21.0 21.4 21.4 21.5 22.8 22.8 24.4 26.0
[28] 27.3 30.4 30.4 32.4 33.9
ตัวอย่างที่ 4.6
ข้อมูลชุด mtcars เราจะเรียงลำดับระยะทางเป็ นไมล์ต่อแกลลอน ซึ่งเป็ นตัวแปรชื่อ mpg ที่อยู่ใน data
frame ชื่อ mtcars ได้ดังนี้
> attach(mtcars)
> sort(mpg)
[1] 10.4 10.4 13.3 14.3 14.7 15.0 15.2 15.2 15.5
[10] 15.8 16.4 17.3 17.8 18.1 18.7 19.2 19.2 19.7
[19] 21.0 21.0 21.4 21.4 21.5 22.8 22.8 24.4 26.0
[28] 27.3 30.4 30.4 32.4 33.9
หรือเราเรียงลำดับจากมากไปหาน้อยได้ดังนี้
> sort(mpg, decreasing=TRUE)
[1] 33.9 32.4 30.4 30.4 27.3 26.0 24.4 22.8 22.8
[10] 21.5 21.4 21.4 21.0 21.0 19.7 19.2 19.2 18.7
[19] 18.1 17.8 17.3 16.4 15.8 15.5 15.2 15.2 15.0
[28] 14.7 14.3 13.3 10.4 10.4
ในบางครั้งเราอาจจะต้องการเรียงลำดับข้อมูลใน data frame ตามคอลัมน์ใดคอลัมน์หนึ่งใน data frame นั้น ซึ่งการเรียงลำดับข้อมูลในลักษณะนี้ไม่สามารถใช้คำสั่ง sort( ) ได้ เราต้องใช้คำสั่ง order( ) เข้ามาช่วย ซึ่งคำสั่งนี้จะให้ค่ากลับมาเป็ นเวกเตอร์ของลำดับของตัวแปรนั้น เช่น order(x) จะได้เวกเตอร์ของลำดับของเวคเตอร์ x ที่มีค่าจากน้อยไปหามาก ดังนั้นการเรียงลำดับข้อมูลที่มีหลายตัวแปรพร้อมกัน จึงทำได้ดังนี้
> sort(mpg, decreasing=TRUE)
[1] 33.9 32.4 30.4 30.4 27.3 26.0 24.4 22.8 22.8
[10] 21.5 21.4 21.4 21.0 21.0 19.7 19.2 19.2 18.7
[19] 18.1 17.8 17.3 16.4 15.8 15.5 15.2 15.2 15.0
[28] 14.7 14.3 13.3 10.4 10.4
ในบางครั้งเราอาจจะต้องการเรียงลำดับข้อมูลใน data frame ตามคอลัมน์ใดคอลัมน์หนึ่งใน data frame นั้น ซึ่งการเรียงลำดับข้อมูลในลักษณะนี้ไม่สามารถใช้คำสั่ง sort( ) ได้ เราต้องใช้คำสั่ง order( ) เข้ามาช่วย ซึ่งคำสั่งนี้จะให้ค่ากลับมาเป็ นเวกเตอร์ของลำดับของตัวแปรนั้น เช่น order(x) จะได้เวกเตอร์ของลำดับของเวคเตอร์ x ที่มีค่าจากน้อยไปหามาก ดังนั้นการเรียงลำดับข้อมูลที่มีหลายตัวแปรพร้อมกัน จึงทำได้ดังนี้
> mtcars[order(mpg),] # sort mtcars by mpg
mpg cyl disp hp drat wt qsec vs am gear carb
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
...
> mtcars[order(mpg,decreasing=TRUE),] # best mpg first
mpg cyl disp hp drat wt qsec vs am gear carb
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
> rownames(mtcars[order(mpg, decreasing = TRUE), ]) # only names
[1] "Toyota Corolla" "Fiat 128" "Honda Civic"
[4] "Lotus Europa" "Fiat X1-9" "Porsche 914-2"
[7] "Merc 240D" "Datsun 710" "Merc 230"
[10] "Toyota Corona" "Hornet 4 Drive" "Volvo 142E"
[13] "Mazda RX4" "Mazda RX4 Wag" "Ferrari Dino"
[16] "Merc 280" "Pontiac Firebird" "Hornet Sportabout"
[19] "Valiant" "Merc 280C" "Merc 450SL"
[22] "Merc 450SE" "Ford Pantera L" "Dodge Challenger"
[25] "Merc 450SLC" "AMC Javelin" "Maserati Bora"
[28] "Chrysler Imperial""Duster 360" "Camaro Z28"
[31] "Cadillac Fleetwood" "Lincoln Continental"
> mtcars[order(cyl,hp), ] # sort by cylinders then horsepower
mpg cyl disp hp drat wt qsec vs am gear carb
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
...
> mtcars[order(mpg,decreasing=TRUE),] # best mpg first
mpg cyl disp hp drat wt qsec vs am gear carb
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
> rownames(mtcars[order(mpg, decreasing = TRUE), ]) # only names
[1] "Toyota Corolla" "Fiat 128" "Honda Civic"
[4] "Lotus Europa" "Fiat X1-9" "Porsche 914-2"
[7] "Merc 240D" "Datsun 710" "Merc 230"
[10] "Toyota Corona" "Hornet 4 Drive" "Volvo 142E"
[13] "Mazda RX4" "Mazda RX4 Wag" "Ferrari Dino"
[16] "Merc 280" "Pontiac Firebird" "Hornet Sportabout"
[19] "Valiant" "Merc 280C" "Merc 450SL"
[22] "Merc 450SE" "Ford Pantera L" "Dodge Challenger"
[25] "Merc 450SLC" "AMC Javelin" "Maserati Bora"
[28] "Chrysler Imperial""Duster 360" "Camaro Z28"
[31] "Cadillac Fleetwood" "Lincoln Continental"
> mtcars[order(cyl,hp), ] # sort by cylinders then horsepower
การเข้าถึงข้อมูลภายใน list การเข้าถึงข้อมูลที่จัดเก็บอยู่ในรูปของ list ทำได้หลายวิธีดังนี้
1.ใช้ [[ ]] ในการเข้าถึงสมาชิกแต่ละตัวใน list ดังนี้ lst[[position]] สำหรับตำแหน่งที่ระบุนั้นอาจเป็น
หมายเลข หรือชื่อก็ได้ เช่น
> lst = list(a=1:2,b=letters[1:3],c=FALSE)
> lst[[1]]
[1] 1 2
> lst[["a"]]
[1] 1 2
1.ใช้ [[ ]] ในการเข้าถึงสมาชิกแต่ละตัวใน list ดังนี้ lst[[position]] สำหรับตำแหน่งที่ระบุนั้นอาจเป็น
หมายเลข หรือชื่อก็ได้ เช่น
> lst = list(a=1:2,b=letters[1:3],c=FALSE)
> lst[[1]]
[1] 1 2
> lst[["a"]]
[1] 1 2
2.ใช้$ เข้าถึงข้อมูลใน list จะสะดวกกว่าการใช้ lst[["varname"]]
> lst = list(one.to.two = 1:2, "a-e" = letters[1:5])
> lst$one.to.two # access with $
[1] 1 2
> lst$o # unique shortening
[1] 1 2
> lst$a-e # needs quotes to work
Error: Object "e" not found
> lst$"a-e"
[1] "a" "b" "c" "d" "e"
3.ใช้สัญลักษณ์ของเวกเตอร์ [] กับ list เหมือนกับที่ใช้กับเวกเตอร์
> lst = list(a=1:2,b=letters[1:2],c=FALSE)
> lst[1] # return a list with just the first component
$a
[1] 1 2
> lst[[1]] # first component has no name
[1] 1 2
> lst = list(one.to.two = 1:2, "a-e" = letters[1:5])
> lst$one.to.two # access with $
[1] 1 2
> lst$o # unique shortening
[1] 1 2
> lst$a-e # needs quotes to work
Error: Object "e" not found
> lst$"a-e"
[1] "a" "b" "c" "d" "e"
3.ใช้สัญลักษณ์ของเวกเตอร์ [] กับ list เหมือนกับที่ใช้กับเวกเตอร์
> lst = list(a=1:2,b=letters[1:2],c=FALSE)
> lst[1] # return a list with just the first component
$a
[1] 1 2
> lst[[1]] # first component has no name
[1] 1 2
4.2.3 การกำหนดค่าใน Data Frame หรือ List
ในการกำหนดค่า หรือเปลี่ยนค่าข้อมูลใน data frame นั้นต้องทำโดยตรงกับ data frame นั้น ไม่สามารถใช้กับการattach data frame ได้ (เนื่องจาก attach จะ copy เวกเตอร์ข้อมูลมา ดังนั้นการเปลี่ยนค่าข้อมูลจะเปลี่ยนเฉพาะในตัวcopy แต่ไม่มีการเปลี่ยนแปลงที่ตัว data frame) เราสามารกำหนดหรือเปลี่ยนค่าข้อมูลใน data frame หรือ list ได้ในทำนองเดียวกับการสร้างเวกเตอร์ข้อมู ลนั่นเอง
df[rows,cols] = values,
lst$name = value, or
lst$name[i] = value
ในการกำหนดค่า หรือเปลี่ยนค่าข้อมูลใน data frame นั้นต้องทำโดยตรงกับ data frame นั้น ไม่สามารถใช้กับการattach data frame ได้ (เนื่องจาก attach จะ copy เวกเตอร์ข้อมูลมา ดังนั้นการเปลี่ยนค่าข้อมูลจะเปลี่ยนเฉพาะในตัวcopy แต่ไม่มีการเปลี่ยนแปลงที่ตัว data frame) เราสามารกำหนดหรือเปลี่ยนค่าข้อมูลใน data frame หรือ list ได้ในทำนองเดียวกับการสร้างเวกเตอร์ข้อมู ลนั่นเอง
df[rows,cols] = values,
lst$name = value, or
lst$name[i] = value
> df =
data.frame(a=1:2,b=3:4) # with names
> df[1,1] = 5 # first row, first column
> df[,2]=9:10 # all rows, second column
> df[1:2,3:4] = cbind(11:12, 13:14) # rows and columns at once
> df # new columns added
a b V3 V4
1 5 9 11 13
2 2 10 12 14
> df[1:2, 10:11] = cbind(11:12,13:14) # would create a hole
Error in "[<-.data.frame"(‘*tmp*‘, 1:2, 10:11, value = c(11, 12, 13, 14 :
new columns would leave holes after existing columns
> df[,2:3] = 0 # recycling occurs
> df
a b V3 V4
1 5 0 0 13
2 2 0 0 1 4
เราสามารถใช้$ กับ list ในการอ้างถึงเวกเตอร์ข้อมูลทั้งเวกเตอร์หรือสมาชิกในบางตำแหน่งก็ได้
> lst = list(a = 1:2, b=1:4,c = c("A", "B", "C"))
> lst$a
[1] 1 2
> lst$b[3] = 16
> lst$c[4]
[1] NA
> lst$c[4]="D"
> lst
> df[1,1] = 5 # first row, first column
> df[,2]=9:10 # all rows, second column
> df[1:2,3:4] = cbind(11:12, 13:14) # rows and columns at once
> df # new columns added
a b V3 V4
1 5 9 11 13
2 2 10 12 14
> df[1:2, 10:11] = cbind(11:12,13:14) # would create a hole
Error in "[<-.data.frame"(‘*tmp*‘, 1:2, 10:11, value = c(11, 12, 13, 14 :
new columns would leave holes after existing columns
> df[,2:3] = 0 # recycling occurs
> df
a b V3 V4
1 5 0 0 13
2 2 0 0 1 4
เราสามารถใช้$ กับ list ในการอ้างถึงเวกเตอร์ข้อมูลทั้งเวกเตอร์หรือสมาชิกในบางตำแหน่งก็ได้
> lst = list(a = 1:2, b=1:4,c = c("A", "B", "C"))
> lst$a
[1] 1 2
> lst$b[3] = 16
> lst$c[4]
[1] NA
> lst$c[4]="D"
> lst
$a
[1] 1 2
$b
[1] 1 2 16 4
$c
[1] "A" "B" "C" "D"
[1] 1 2
$b
[1] 1 2 16 4
$c
[1] "A" "B" "C" "D"
เราสามารถใช้ฟังก์ชัน c() ในการรวม list เข้าด้วยกันโดยใช้
top-level components หรือใช้กับ data frame ที่มีจำนวนแถวเท่ากันก็ได้ แต่ผลที่ได้จะเป็ น list ไม่ใช่ data frame ถ้าต้องการให้ข้อมูลเปลี่ยนเป็
น data frame ทำได้โดยใช้ฟังก์ชัน data.frame()
4.2.4 การใช้ฟังก์ชันต่างๆกับ data frame หรือ list
เราสามารถใช้คำสั่ง apply( ) ในการใช้ฟังก์ชันกับแถวหรือคอลัมน์ของเมตริกซ์หรือ data frame ก็ได้ เนื่องจาก dataframe ก็เสมือนเป็ นเมตริกซ์นั่นเอง ถึงแม้ใน R จะมีฟังก์ชันสำเร็จรูปที่เราสามารถเรียกใช้ได้โดยตรง แต่บางครั้งเราจำเป็ นต้องใช้ฟังก์ชัน apply( ) ช่วย เช่น หาก data frame หนึ่งประกอบด้วยตัวเองเท่านั้น เมื่อเราใช้ฟังก์ชัน mean( )จะได้ผลลัพธ์เป็ นค่าเฉลี่ยของแต่ละตัวแปร ในขณะที่ถ้าใช้ median( ) จะได้ผลลัพธ์เป็ นค่ามัธยฐานของข้อมูลทั้ง dataframe เราจะแสดงให้เห็นดังตัวอย่างต่อไปนี้
> df = ewr[, 3:10] # make a data frame of the times
> mean(df) # mean is as desired
AA CO DL HP NW TW UA US
17.83478 20.01957 16.63043 19.60435 15.79783 16.28043 17.69130 15.49348
> median(df) # median is not as desired
Error in median.default(df) : need numeric data
> apply(df,2,median) # median of columns
AA CO DL HP NW TW UA US
16.05 18.15 15.50 18.95 14.55 15.65 16.45 14.45
เราสามารถใช้คำสั่ง apply( ) ในการใช้ฟังก์ชันกับแถวหรือคอลัมน์ของเมตริกซ์หรือ data frame ก็ได้ เนื่องจาก dataframe ก็เสมือนเป็ นเมตริกซ์นั่นเอง ถึงแม้ใน R จะมีฟังก์ชันสำเร็จรูปที่เราสามารถเรียกใช้ได้โดยตรง แต่บางครั้งเราจำเป็ นต้องใช้ฟังก์ชัน apply( ) ช่วย เช่น หาก data frame หนึ่งประกอบด้วยตัวเองเท่านั้น เมื่อเราใช้ฟังก์ชัน mean( )จะได้ผลลัพธ์เป็ นค่าเฉลี่ยของแต่ละตัวแปร ในขณะที่ถ้าใช้ median( ) จะได้ผลลัพธ์เป็ นค่ามัธยฐานของข้อมูลทั้ง dataframe เราจะแสดงให้เห็นดังตัวอย่างต่อไปนี้
> df = ewr[, 3:10] # make a data frame of the times
> mean(df) # mean is as desired
AA CO DL HP NW TW UA US
17.83478 20.01957 16.63043 19.60435 15.79783 16.28043 17.69130 15.49348
> median(df) # median is not as desired
Error in median.default(df) : need numeric data
> apply(df,2,median) # median of columns
AA CO DL HP NW TW UA US
16.05 18.15 15.50 18.95 14.55 15.65 16.45 14.45
เราสามารถใช้ฟังก์ชันกับ list ได้เช่นเดียวกับการใช้กับเมตริกซ์ โดยการใช้ lapply( ) หรือฟ้งก์ชันที่ใช้งานง่ายกว่าคือ sapply( ) โดยที่ทั้งสองคำสั่งนี้จะใช้ฟังก์ชันที่เราเลือกกับองค์ประกอบระดับสูงสุดของ
list หรือกับทั้งเวกเตอร์คำสั่ง lapply( ) จะให้ผลลัพธ์เป็ น list ในขณะที่ คำสั่ง sapply( ) จะให้ผลลัพธ์เป็ นเวกเตอร์หรือเมตริกซ์แล้วแต่ ละความเหมาะสม
ตัวอย่างต่อไปนี้แสดงวิธีการหาค่ามัธยฐานของแต่ละตัวแปรของตัวอย่างข้างต้น และเนื่องจาก data frame คือ list จึงได้เป็น
> sapply(df,median) # use sapply to find the median for each variable
ตัวอย่างต่อไปนี้แสดงวิธีการหาค่ามัธยฐานของแต่ละตัวแปรของตัวอย่างข้างต้น และเนื่องจาก data frame คือ list จึงได้เป็น
> sapply(df,median) # use sapply to find the median for each variable
AA CO DL HP NW TW UA
US16.05 18.15
15.50 18.95 14.55 15.65 16.45 14.45
> lapply(df,median) # use lapply to find the median for each variable, the result
returned as a list
$AA
[1] 16.05
$CO
[1] 18.15
$DL
[1] 15.5
$HP
[1] 18.95
$NW
[1] 14.55
$TW
[1] 15.65
$UA
[1] 16.45
$US
[1] 14.45
4.3 การใช Model formula กับข้อมูลหลายตัวแปร
สัญลักษณ์ของ model formula คือ (∼) ที่ R ใช้ในการแสดงความสัมพันธ์ระหว่างตัวแปรในรูปของตัวแบบ ซึ่งเป็ นสัญลักษณ์ที่ มีความยืดหยุ่นนมาก และใช้ได้ในหลายวัตถุ ประสงค์ ตัวอยางต่ อไปนี้เป็ นการใช้ model formula ในการสร้างboxplot ของตัวแปร weight แยกตามกลุ่ม
> data(PlantGrowth)
> attach(PlantGrowth)
> boxplot(weight ~ group)
ได้กราฟดังรูปที่ 4.8
ในกรณีที่มีสองตัวแปรนั้นการใช้ model formula นั้นค่อนข้างง่าย โดยจะกำหนดให้ตัวแปรตามอยู่ทางด้านซ้ายของ(∼) และให้ตัวแปรอิสระหรือ factor อยู่ทางด้านขวาของ (∼) ดังนี้
response∼ predictor
ในกรณีที่ข้อมูลของเรามากกว่าสองตัวแปร การใช้ model formula จะค่อนข้างยุ่งยากมากขึ้น ต่อไปนี้
เป็ นการใช้ model formula ในรูปแบบต่างๆกันหากเรามีตัวแปรอยู่
รูปที่ 4.8: Boxplot of weight for groups
ความหมายที่แท้จริงของคำว่า model by นั้นขึ้นอยู่กับการใช้งานฟังก์ชันนี้ ในกรณีของ boxplot นั้นฟังก์ชันนี้จะมีความแตกต่างจากเมื่อใช้กับฟังก์ชัน lm นอกจากนั้นจะเห็นได้ว่าเครื่องหมายทางคณิตศาสตร์ยังคงสามารถใช้ได้ในฟังก์ชันนี้ แต่ต้องใช้ภายในฟังก์ชัน I( ) เท่านั้น
4.3.1 การสร้าง boxplots จาก model formula
เราสามารถใช้ model formula ในการสร้าง boxplot สำหรับตัวหนึ่งโดยแยกตามระดับหรือกลุ่มของอีกตัวหนึ่งได้ เช่นจากตัวอย่างที่ผ่านสำหรับข้อมูลชุด babies (UsingR) เราจะใช้ model formula ในการสร้าง boxplot สำหรับตัวแปรgestation แยกตามระดับรายได้ต่อปี ของครอบครัว, inc ได้ดังตัวอย่างต่อไปนี้ ซึ่งในตัวอย่างนี้เราได้ใช้คำสั่ง boxplot3 ครั้ง กราฟที่ได้จากแต่ละคำสั่งแสดงดังรูปที่ 4.9 สำหรับคำสั่งที่สามได้ใช้ argument varwidth = TRUE ซึ่งเป็ นการกำหนดให้ความกว้างของตัวกลองแสดงขนาดของตัวอย่าง นั่นคือถ้ากลุ่มใดมีขนาดตัวอย่างมาก กลองก็จะมีขนาดกว้างตามไปด้วย
> boxplot(gestation ~ inc, data = babies)
> boxplot(gestation ~ inc, subset = gestation != 999 & inc != 98, data = babies)
> boxplot(gestation ~ inc, subset = gestation != 999 & inc != 98, data = babies,
+ varwidth = TRUE, xlab = "income level", ylab = "gestation (days)")
รูปที่ 4.9: Boxplot of gestation times for income levels
> lapply(df,median) # use lapply to find the median for each variable, the result
returned as a list
$AA
[1] 16.05
$CO
[1] 18.15
$DL
[1] 15.5
$HP
[1] 18.95
$NW
[1] 14.55
$TW
[1] 15.65
$UA
[1] 16.45
$US
[1] 14.45
4.3 การใช Model formula กับข้อมูลหลายตัวแปร
สัญลักษณ์ของ model formula คือ (∼) ที่ R ใช้ในการแสดงความสัมพันธ์ระหว่างตัวแปรในรูปของตัวแบบ ซึ่งเป็ นสัญลักษณ์ที่ มีความยืดหยุ่นนมาก และใช้ได้ในหลายวัตถุ ประสงค์ ตัวอยางต่ อไปนี้เป็ นการใช้ model formula ในการสร้างboxplot ของตัวแปร weight แยกตามกลุ่ม
> data(PlantGrowth)
> attach(PlantGrowth)
> boxplot(weight ~ group)
ได้กราฟดังรูปที่ 4.8
ในกรณีที่มีสองตัวแปรนั้นการใช้ model formula นั้นค่อนข้างง่าย โดยจะกำหนดให้ตัวแปรตามอยู่ทางด้านซ้ายของ(∼) และให้ตัวแปรอิสระหรือ factor อยู่ทางด้านขวาของ (∼) ดังนี้
response∼ predictor
ในกรณีที่ข้อมูลของเรามากกว่าสองตัวแปร การใช้ model formula จะค่อนข้างยุ่งยากมากขึ้น ต่อไปนี้
เป็ นการใช้ model formula ในรูปแบบต่างๆกันหากเรามีตัวแปรอยู่
รูปที่ 4.8: Boxplot of weight for groups
ความหมายที่แท้จริงของคำว่า model by นั้นขึ้นอยู่กับการใช้งานฟังก์ชันนี้ ในกรณีของ boxplot นั้นฟังก์ชันนี้จะมีความแตกต่างจากเมื่อใช้กับฟังก์ชัน lm นอกจากนั้นจะเห็นได้ว่าเครื่องหมายทางคณิตศาสตร์ยังคงสามารถใช้ได้ในฟังก์ชันนี้ แต่ต้องใช้ภายในฟังก์ชัน I( ) เท่านั้น
4.3.1 การสร้าง boxplots จาก model formula
เราสามารถใช้ model formula ในการสร้าง boxplot สำหรับตัวหนึ่งโดยแยกตามระดับหรือกลุ่มของอีกตัวหนึ่งได้ เช่นจากตัวอย่างที่ผ่านสำหรับข้อมูลชุด babies (UsingR) เราจะใช้ model formula ในการสร้าง boxplot สำหรับตัวแปรgestation แยกตามระดับรายได้ต่อปี ของครอบครัว, inc ได้ดังตัวอย่างต่อไปนี้ ซึ่งในตัวอย่างนี้เราได้ใช้คำสั่ง boxplot3 ครั้ง กราฟที่ได้จากแต่ละคำสั่งแสดงดังรูปที่ 4.9 สำหรับคำสั่งที่สามได้ใช้ argument varwidth = TRUE ซึ่งเป็ นการกำหนดให้ความกว้างของตัวกลองแสดงขนาดของตัวอย่าง นั่นคือถ้ากลุ่มใดมีขนาดตัวอย่างมาก กลองก็จะมีขนาดกว้างตามไปด้วย
> boxplot(gestation ~ inc, data = babies)
> boxplot(gestation ~ inc, subset = gestation != 999 & inc != 98, data = babies)
> boxplot(gestation ~ inc, subset = gestation != 999 & inc != 98, data = babies,
+ varwidth = TRUE, xlab = "income level", ylab = "gestation (days)")
รูปที่ 4.9: Boxplot of gestation times for income levels
4.3.2 การใช้ฟังก์ชัน plot( ) กับ model formula
เนื่องจากเราสามารถใช้ฟังก์ชัน plot( ) ในการสร้างกราฟได้หลายรูปแบบ (ขึ้นอยู่กับ agument ที่กำหนด) เราสามารถใช้ฟังก์ชัน plot( ) ร่วมกับ model formula ได้ เช่น ถ้า x และ y เป็ นเวกเตอร์ข้อมูลที่เป็ นตัวเลข และเป็ นคู่กันแล้วmodel formula y∼ x ได้จากตัวแบบyi= β0+ β1xi+ εi นั่นเอง ซึ่งกราฟที่ใช้ในการพิจารณาตัวแบบชนิดนี้คือscatterplot ซึ่ง model formula นี้อยู่ในรูปแบบของ numeric∼ numeric เนื่องจากตัวแปร x และ y เป็นตัวแปรเชิงปริมาณทั้งคู่
ในกรณีที่ model formula เป็นแบบ numeric∼ factor นั้นตัวแบบจะอยู่ในรูปของ yij= µi+ εij ซึ่งเป็นลักษณะของตัวแบบของค่าสังเกตที่ได้จากการวางแผนการทดลอง สำหรับตัวแบบลักษณะนี้กราฟที่เหมาะสมในการพิจารณาลักษณะของข้อมูลคือ boxplot ซึ่งในกรณีที่ y เป็ นตัวแปรเชิงปริมาณ และ f เป็ น factor ที่บ่งชี้ว่า y อยู่ในกลุ่มใดนั้นคำสั่ง plot(y∼ f ) จะเป็ นการสร้าง boxplot ของ y แยกตามกลุ่มของ f เช่น
> plot(gestation ~ factor(inc), data=babies, varwidth = TRUE, subset = gestation != 999
+ & inc !=98, xlab="income level", ylab = "gestation (days)")
ซึ่งจะได้กราฟรูปเดียวกับรูปที่ 4.9 รูปที่ 3 โดยที่ฟังก์ชัน factor( ) เป็นการทำให้ตัว inc เปลี่ยนจากเวกเตอร์ตัวเลข เป็น factor นอกจากที่เราสามารถใช้ model formula ร่วมกับฟังก์ชัน plot( ) แล้วเรายังสามารถใช้ร่วมกับฟังก์ชัน pairs( ) ได้อีกด้วย เช่นเราสามารถสร้างกราฟดังรูปที่ 4.6 ได้ดังนี้
> pairs(~ gestation + age + wt + inc, data=babies, subset = gestation != 999 & age != 99
+ & inc !=98)
เนื่องจากเราสามารถใช้ฟังก์ชัน plot( ) ในการสร้างกราฟได้หลายรูปแบบ (ขึ้นอยู่กับ agument ที่กำหนด) เราสามารถใช้ฟังก์ชัน plot( ) ร่วมกับ model formula ได้ เช่น ถ้า x และ y เป็ นเวกเตอร์ข้อมูลที่เป็ นตัวเลข และเป็ นคู่กันแล้วmodel formula y∼ x ได้จากตัวแบบyi= β0+ β1xi+ εi นั่นเอง ซึ่งกราฟที่ใช้ในการพิจารณาตัวแบบชนิดนี้คือscatterplot ซึ่ง model formula นี้อยู่ในรูปแบบของ numeric∼ numeric เนื่องจากตัวแปร x และ y เป็นตัวแปรเชิงปริมาณทั้งคู่
ในกรณีที่ model formula เป็นแบบ numeric∼ factor นั้นตัวแบบจะอยู่ในรูปของ yij= µi+ εij ซึ่งเป็นลักษณะของตัวแบบของค่าสังเกตที่ได้จากการวางแผนการทดลอง สำหรับตัวแบบลักษณะนี้กราฟที่เหมาะสมในการพิจารณาลักษณะของข้อมูลคือ boxplot ซึ่งในกรณีที่ y เป็ นตัวแปรเชิงปริมาณ และ f เป็ น factor ที่บ่งชี้ว่า y อยู่ในกลุ่มใดนั้นคำสั่ง plot(y∼ f ) จะเป็ นการสร้าง boxplot ของ y แยกตามกลุ่มของ f เช่น
> plot(gestation ~ factor(inc), data=babies, varwidth = TRUE, subset = gestation != 999
+ & inc !=98, xlab="income level", ylab = "gestation (days)")
ซึ่งจะได้กราฟรูปเดียวกับรูปที่ 4.9 รูปที่ 3 โดยที่ฟังก์ชัน factor( ) เป็นการทำให้ตัว inc เปลี่ยนจากเวกเตอร์ตัวเลข เป็น factor นอกจากที่เราสามารถใช้ model formula ร่วมกับฟังก์ชัน plot( ) แล้วเรายังสามารถใช้ร่วมกับฟังก์ชัน pairs( ) ได้อีกด้วย เช่นเราสามารถสร้างกราฟดังรูปที่ 4.6 ได้ดังนี้
> pairs(~ gestation + age + wt + inc, data=babies, subset = gestation != 999 & age != 99
+ & inc !=98)
4.3.3 การสร้าง Contingency Tables ด้วยฟังก์ชัน xtabs( )
ที่ผ่านมาเราได้เห็นการสร้าง three-way contingency table โดยใช้คำสั่ง table( ) เมื่อข้อมูลที่มีเป็ นข้อมูลดิบ ถ้าหากข้อมูลที่มีอยู่ เป็ นข้อมูลที่ มีการแจงนับแล้ว และเราต้องการป้ อนข้อมู ลนี้ลงในตาราง 3 ทาง สามารถทำได้โดยใช้ฟังก์ชันxtabs( ) ซึ่งฟังก์ชันนี้สามารถทำงานร่วมกับ model formula และเป็ นทางเลือกหนึ่งของการใช้ table()
ฟังกชัน as.data.frame() จะให้ผลที่ตรงกันข้ามกับที่ฟังก์ชัน xtabs() และ xtabs() โดยจะสร้าง data frame ที่ประกอบด้วยการรวมกันของระดับของตัวแปรและจำนวนนับที่ เป็นไปได้ทั้งหมดเมื่ อมีการเรียกตารางนี้
ตัวอย่างที่ 4.7
ในตารางที่ 4.2 เป็ นตาราง 3 ทางที่แสดงเปอร์เซ็นต์ของการใช้ seat-belt ใน 2 ปี จำแนกตามชนิดของ
กฏหมายที่บังคับใช้ และชนิดของรถยนต์
ตารางที่ 4.2: Seat-belt data cy type of law and vehicle
ที่ผ่านมาเราได้เห็นการสร้าง three-way contingency table โดยใช้คำสั่ง table( ) เมื่อข้อมูลที่มีเป็ นข้อมูลดิบ ถ้าหากข้อมูลที่มีอยู่ เป็ นข้อมูลที่ มีการแจงนับแล้ว และเราต้องการป้ อนข้อมู ลนี้ลงในตาราง 3 ทาง สามารถทำได้โดยใช้ฟังก์ชันxtabs( ) ซึ่งฟังก์ชันนี้สามารถทำงานร่วมกับ model formula และเป็ นทางเลือกหนึ่งของการใช้ table()
ฟังกชัน as.data.frame() จะให้ผลที่ตรงกันข้ามกับที่ฟังก์ชัน xtabs() และ xtabs() โดยจะสร้าง data frame ที่ประกอบด้วยการรวมกันของระดับของตัวแปรและจำนวนนับที่ เป็นไปได้ทั้งหมดเมื่ อมีการเรียกตารางนี้
ตัวอย่างที่ 4.7
ในตารางที่ 4.2 เป็ นตาราง 3 ทางที่แสดงเปอร์เซ็นต์ของการใช้ seat-belt ใน 2 ปี จำแนกตามชนิดของ
กฏหมายที่บังคับใช้ และชนิดของรถยนต์
ตารางที่ 4.2: Seat-belt data cy type of law and vehicle
เราจะสร้างตาราง
4.2 ใหม่โดยใช้ R โดยในขั้นแรกเราจะเปลี่ยนตารางข้อมูลนี้ให้เป็
น data frame โดยการสร้างตัวแปรที่เหมาะสม แล้วใส่เปอร์เซ็นต์ลงในคอลัมน์ต่อคอลัมน์ จากนั้นสร้างตัวแปรสำหรับ car, year, enforcement ที่มีค่าสอดคล้องกับเปอร์เซ็นต์ โดยใช้ฟังก์ชัน rep( ) ช่วย
> percents = c(71,70,79,82,71,83,71,50,70,71,55,73)
> car = rep(c("passenger", "pickup", "van/SUV"), 4)
> year = rep(rep(2001:2002, c(3,3)), 2)
> enforcement = rep(c("primary", "secondary"), c(6,6))
> seatbelts = data.frame(percents, car, year, enforcement)
> seatbelts
percents car year enforcement
1 71 passenger 2001 primary
2 70 pickup 2001 primary
3 79 van/SUV 2001 primary
4 82 passenger 2002 primary
5 71 pickup 2002 primary
6 83 van/SUV 2002 primary
7 71 passenger 2001 secondary
8 50 pickup 2001 secondary
9 70 van/SUV 2001 secondary
10 71 passenger 2002 secondary
11 55 pickup 2002 secondary
12 73 van/SUV 2002 secondary
ผลที่ได้คือ data frame ที่ประกอบด้วย 4 ตัวแปร จากนั้นจะใช้ฟังก์ชัน xtabs() สร้างตารางสามทางโดยใช้สมการความสัมพันธ์เข้ามาช่วย ดังนี้
> tab = xtabs(percents ~ car + year + enforcement, data = seatbelts)
> tab
, , enforcement = primary
year
car 2001 2002
passenger 71 82
pickup 70 71
van/SUV 79 83
> percents = c(71,70,79,82,71,83,71,50,70,71,55,73)
> car = rep(c("passenger", "pickup", "van/SUV"), 4)
> year = rep(rep(2001:2002, c(3,3)), 2)
> enforcement = rep(c("primary", "secondary"), c(6,6))
> seatbelts = data.frame(percents, car, year, enforcement)
> seatbelts
percents car year enforcement
1 71 passenger 2001 primary
2 70 pickup 2001 primary
3 79 van/SUV 2001 primary
4 82 passenger 2002 primary
5 71 pickup 2002 primary
6 83 van/SUV 2002 primary
7 71 passenger 2001 secondary
8 50 pickup 2001 secondary
9 70 van/SUV 2001 secondary
10 71 passenger 2002 secondary
11 55 pickup 2002 secondary
12 73 van/SUV 2002 secondary
ผลที่ได้คือ data frame ที่ประกอบด้วย 4 ตัวแปร จากนั้นจะใช้ฟังก์ชัน xtabs() สร้างตารางสามทางโดยใช้สมการความสัมพันธ์เข้ามาช่วย ดังนี้
> tab = xtabs(percents ~ car + year + enforcement, data = seatbelts)
> tab
, , enforcement = primary
year
car 2001 2002
passenger 71 82
pickup 70 71
van/SUV 79 83
, , enforcement
= secondary
year
car 2001 2002
passenger 71 71
pickup 50 55
van/SUV 70 73
สุดท้ายจะใช้ฟังก์ชัน ftable() ในการปรับตารางให้อยู่ในตารางเดียวกันทั้งหมด
> ftable(tab, col.vars= c("enforcement", "year"))
enforcement primary secondary
year 2001 2002 2001 2002
car
passenger 71 82 71 71
pickup 70 71 50 55
van/SUV 79 83 70 73
year
car 2001 2002
passenger 71 71
pickup 50 55
van/SUV 70 73
สุดท้ายจะใช้ฟังก์ชัน ftable() ในการปรับตารางให้อยู่ในตารางเดียวกันทั้งหมด
> ftable(tab, col.vars= c("enforcement", "year"))
enforcement primary secondary
year 2001 2002 2001 2002
car
passenger 71 82 71 71
pickup 70 71 50 55
van/SUV 79 83 70 73
4.3.4 การใช้ฟังก์ชัน split( ) และ stack
ในบางครั้ง model formula ไม่สามารถใช้ได้กับฟังก์ชันบางฟังก์ชัน เราสามารถใช้ฟังก์ชัน split( ) ในการแบ่งตัวแปรหนึ่งตามระดับของ factor ได้ เช่น ถ้า y คือตัวแปรที่มีค่าเป็ นตัวเลข และ f เป็ น factor แล้วเราสามารถใช้ split(x,f)ซึ่งผลลัพธ์ที่ได้จะเป็ น list ขององค์ประกอบระดับสูงสุดที่มีค่าของ y ที่สอดคล้องกับระดับของ f เช่น คำสั่ง box-plot(split(x,f)) จะสร้างกราฟรูปเดียวกับที่ได้จากคำสั่ง boxplot(x∼ y) การใช้ฟังก์ชันใดฟังก์ชันหนึ่งกับแต่ละส่วนของ list ที่ได้จากการใช้ split( ) สามารถทำได้โดยใช้อีกฟังก์ชันหนึ่งคือ tapply( ) ซึ่งมีรูปแบบคือ tapply(x, f, function) ซึ่งฟังก์ชันสามารถเป็ นได้ทั้งชื่ อของฟังก์ชัน เช่ น mean หรือการกำหนดโดยตัวเราเองก็ได้
ฟังก์ชันที่ตรงข้ามกับ split( ) คือฟังก์ชัน stack( ) ซึ่งเป็นฟังก์ชันที่ใช้เพื่อรวบรวมตัวแปรต่างๆไปเก็บไว้ในรูปของdata frame หรือ list และแบ่งเป็นสองตัวแปร โดยที่ตัวแปรหนึ่งประกอบด้วยค่าของตัวแปรนั้น และอีกตัวแปรหนึ่งเป็ นตัวชี้ให้เห็นว่าข้อมูลนี้มาจากตัวแปรเดิมตัวแปรใด ส่วนฟังกชัน unstack( ) จะตรงข้ามกับฟังก์ชัน stack( ) และจะคล้ายกับฟังก์ชัน split( ) เว้นแต่ว่าจะพยายามให้ผลลัพธ์เป็ น data frame ถ้าเป็ นไปได้
ตัวอย่างที่ 4.8
ข้อมูลชุด cancer(UsingR ประกอบด้วย survival time สำหรับมะเร็งแต่ละชนิด ข้อมูลเก็บอยู่ในรูป
ของ list เนื่องจากข้อมูลของแต่ละตัวแปรมีจำนวนไม่เท่ากัน เราสามารถสร้างข้อมูลที่สามารถทำงานร่วมกับ model formula ได้ โดยการใช้ stack( ) ดังนี้
> library(UsingR)
> cancer
$stomach
[1] 124 42 25 45 412 51 1112 46 103 876 146 340 396
$bronchus
[1] 81 461 20 450 246 166 63 64 155 859 151 166 37 223 138 72 245
$colon
[1] 248 377 189 1843 180 537 519 455 406 365 942 776 372 163 101 20 283
$ovary
[1] 1234 89 201 356 2970 456
$breast
[1] 1235 24 1581 1166 40 727 3808 791 1804 3460 719
> stack(cancer)
values ind
1 124 stomach
2 42 stomach
3 25 stomach
4 45 stomach
...
63 3460 breast
64 719 breast
ชื่อตัวแปรในผลลัพธ์ของ stack( ) จะเป็ น values ที่เก็บข้อมูล และ ind เพื่อชี้ว่าข้อมูลนี้มาจากแปรใด ในการใช้ stack( ) นั้นเราต้องจำไว้เสมอว่าตัวแปรทุกตัวใน data frame หรือ list ต้องมีชื่อเสมอ ind จึงจะชี้ถึงที่มาของข้อมูลได้ว่ ามาจากตัวแปรเดิมตัวแปรใด
ในบางครั้ง model formula ไม่สามารถใช้ได้กับฟังก์ชันบางฟังก์ชัน เราสามารถใช้ฟังก์ชัน split( ) ในการแบ่งตัวแปรหนึ่งตามระดับของ factor ได้ เช่น ถ้า y คือตัวแปรที่มีค่าเป็ นตัวเลข และ f เป็ น factor แล้วเราสามารถใช้ split(x,f)ซึ่งผลลัพธ์ที่ได้จะเป็ น list ขององค์ประกอบระดับสูงสุดที่มีค่าของ y ที่สอดคล้องกับระดับของ f เช่น คำสั่ง box-plot(split(x,f)) จะสร้างกราฟรูปเดียวกับที่ได้จากคำสั่ง boxplot(x∼ y) การใช้ฟังก์ชันใดฟังก์ชันหนึ่งกับแต่ละส่วนของ list ที่ได้จากการใช้ split( ) สามารถทำได้โดยใช้อีกฟังก์ชันหนึ่งคือ tapply( ) ซึ่งมีรูปแบบคือ tapply(x, f, function) ซึ่งฟังก์ชันสามารถเป็ นได้ทั้งชื่ อของฟังก์ชัน เช่ น mean หรือการกำหนดโดยตัวเราเองก็ได้
ฟังก์ชันที่ตรงข้ามกับ split( ) คือฟังก์ชัน stack( ) ซึ่งเป็นฟังก์ชันที่ใช้เพื่อรวบรวมตัวแปรต่างๆไปเก็บไว้ในรูปของdata frame หรือ list และแบ่งเป็นสองตัวแปร โดยที่ตัวแปรหนึ่งประกอบด้วยค่าของตัวแปรนั้น และอีกตัวแปรหนึ่งเป็ นตัวชี้ให้เห็นว่าข้อมูลนี้มาจากตัวแปรเดิมตัวแปรใด ส่วนฟังกชัน unstack( ) จะตรงข้ามกับฟังก์ชัน stack( ) และจะคล้ายกับฟังก์ชัน split( ) เว้นแต่ว่าจะพยายามให้ผลลัพธ์เป็ น data frame ถ้าเป็ นไปได้
ตัวอย่างที่ 4.8
ข้อมูลชุด cancer(UsingR ประกอบด้วย survival time สำหรับมะเร็งแต่ละชนิด ข้อมูลเก็บอยู่ในรูป
ของ list เนื่องจากข้อมูลของแต่ละตัวแปรมีจำนวนไม่เท่ากัน เราสามารถสร้างข้อมูลที่สามารถทำงานร่วมกับ model formula ได้ โดยการใช้ stack( ) ดังนี้
> library(UsingR)
> cancer
$stomach
[1] 124 42 25 45 412 51 1112 46 103 876 146 340 396
$bronchus
[1] 81 461 20 450 246 166 63 64 155 859 151 166 37 223 138 72 245
$colon
[1] 248 377 189 1843 180 537 519 455 406 365 942 776 372 163 101 20 283
$ovary
[1] 1234 89 201 356 2970 456
$breast
[1] 1235 24 1581 1166 40 727 3808 791 1804 3460 719
> stack(cancer)
values ind
1 124 stomach
2 42 stomach
3 25 stomach
4 45 stomach
...
63 3460 breast
64 719 breast
ชื่อตัวแปรในผลลัพธ์ของ stack( ) จะเป็ น values ที่เก็บข้อมูล และ ind เพื่อชี้ว่าข้อมูลนี้มาจากแปรใด ในการใช้ stack( ) นั้นเราต้องจำไว้เสมอว่าตัวแปรทุกตัวใน data frame หรือ list ต้องมีชื่อเสมอ ind จึงจะชี้ถึงที่มาของข้อมูลได้ว่ ามาจากตัวแปรเดิมตัวแปรใด
4.4 Lattice
Graphics
สำหรับข้อมูลหลายตัวแปรนั้น เรามีวิธีการสร้างกราฟที่แสดงความสัมพันธ์ระหว่างตัวแปร 2 ตัว โดยมีเงื่อนไขตามตัวแปรตัวที่สามได้อีกรูปแบบหนึ่ง เรียกว่า Lattice Graphics ซึ่งอยู่ใน package ชื่อ lattice
หลักการพื้นฐานของกราฟแบบนี้คือ กราฟจะประกอบด้วยกราฟย่อยๆหลายรูป แต่ละรูปจะสอดคล้องกับค่า
บางค่า ของตัวแปรที่เป็ นเงื่อนไข การเรียกใช้ฟังก์ชันการสร้างกราฟ lattice ทำได้โดยการใช้ model formula ดังนี้
response∼ predictor | condition
สำหรับตัวแปร response จะมีหรือไม่มีก็ได้ เช่น ถ้าเราสร้างกราฟตัวแปรเดียว (ฮิสโตแกรม) ก็ไม่ต้อง
กำหนดตัวแปรนี้ แต่ถ้าเราสร้าง scatterplot สำหรับตัวแปร 2 ตัว ก็จำเป็ นต้องมีตัวแปร response สำหรับตัวแปร condition อาจเป็ นปัจจัยหรือเป็ นค่ าตัวเลขก็ได้ ถ้าเป็ นปัจจัยกราฟย่ อยแต่ ละรูปจะสอดคล้องกับแต่ ละระดับของปัจจัยนี้ แต่ถ้าเป็ นค่าตัวเลขโปรแกรมจะแบ่งค่าตัวเลขเหล่านี้ออกเป็ นช่วงๆ และสร้างกราฟย่อยที่สอดคล้องกับช่วงเหล่านี้ แต่ละกราฟย่อยในกราฟ lattice จะมีสเกลเดียวกันทั้งหมดทั้งตามแกนx และแกนy ทำให้ง่ายต่อการเปรียบเทียบกราฟย่อยเหล่านี้
การใช้ฟังก์ชันนี้จะเริ่มด้วยการเรียก lattice package และเปลี่ยนสีพื้นของกราฟเป็ นสีขาว เพื่อให้เห็นกราฟได้ชัดเจนมากขึ้น
> library(lattice)
> trellis.device(bg = "white")
การเปลี่ยนสีพื้นของกราฟ lattice สามารถทำได้อีกแบบหนึ่งคือใช้ options()
> options(littice.theme = "col.whitebg")
ต่อไปนี้เป็ นตัวอย่ างการสร้างกราฟแบบต่ างๆโดยใช้แพคเกจ lattice Histogramsฮิสโตแกรมเป็นกราฟสำหรับข้อมูลตัวแปรเดียว ตัวอย่างต่อไปนี้แสดงคำสั่งสำหรับการสร้างฮิสโตแกรม ของน้ำหนักแรกเกิด (wt) สำหรับระดับต่างๆของปัจจัย smoke
> library(UsingR)
> histogram( ~ wt | factor(smoke), data = babies,
+ subset = wt != 999, type = "density")
ได้กราฟดังรูปที่ 4.10 โดยที่ argument type = "density" ทำให้พื้นที่ของฮิสโตแกรมรวมกันเป็ นหนึ่ง ซึ่งให้ผลเหมือน กับ argument prob=TRUE ในฟังก์ชัน hist()
รูปที่ 4.10: Histogram of birth weight by smoking status
สำหรับข้อมูลหลายตัวแปรนั้น เรามีวิธีการสร้างกราฟที่แสดงความสัมพันธ์ระหว่างตัวแปร 2 ตัว โดยมีเงื่อนไขตามตัวแปรตัวที่สามได้อีกรูปแบบหนึ่ง เรียกว่า Lattice Graphics ซึ่งอยู่ใน package ชื่อ lattice
หลักการพื้นฐานของกราฟแบบนี้คือ กราฟจะประกอบด้วยกราฟย่อยๆหลายรูป แต่ละรูปจะสอดคล้องกับค่า
บางค่า ของตัวแปรที่เป็ นเงื่อนไข การเรียกใช้ฟังก์ชันการสร้างกราฟ lattice ทำได้โดยการใช้ model formula ดังนี้
response∼ predictor | condition
สำหรับตัวแปร response จะมีหรือไม่มีก็ได้ เช่น ถ้าเราสร้างกราฟตัวแปรเดียว (ฮิสโตแกรม) ก็ไม่ต้อง
กำหนดตัวแปรนี้ แต่ถ้าเราสร้าง scatterplot สำหรับตัวแปร 2 ตัว ก็จำเป็ นต้องมีตัวแปร response สำหรับตัวแปร condition อาจเป็ นปัจจัยหรือเป็ นค่ าตัวเลขก็ได้ ถ้าเป็ นปัจจัยกราฟย่ อยแต่ ละรูปจะสอดคล้องกับแต่ ละระดับของปัจจัยนี้ แต่ถ้าเป็ นค่าตัวเลขโปรแกรมจะแบ่งค่าตัวเลขเหล่านี้ออกเป็ นช่วงๆ และสร้างกราฟย่อยที่สอดคล้องกับช่วงเหล่านี้ แต่ละกราฟย่อยในกราฟ lattice จะมีสเกลเดียวกันทั้งหมดทั้งตามแกนx และแกนy ทำให้ง่ายต่อการเปรียบเทียบกราฟย่อยเหล่านี้
การใช้ฟังก์ชันนี้จะเริ่มด้วยการเรียก lattice package และเปลี่ยนสีพื้นของกราฟเป็ นสีขาว เพื่อให้เห็นกราฟได้ชัดเจนมากขึ้น
> library(lattice)
> trellis.device(bg = "white")
การเปลี่ยนสีพื้นของกราฟ lattice สามารถทำได้อีกแบบหนึ่งคือใช้ options()
> options(littice.theme = "col.whitebg")
ต่อไปนี้เป็ นตัวอย่ างการสร้างกราฟแบบต่ างๆโดยใช้แพคเกจ lattice Histogramsฮิสโตแกรมเป็นกราฟสำหรับข้อมูลตัวแปรเดียว ตัวอย่างต่อไปนี้แสดงคำสั่งสำหรับการสร้างฮิสโตแกรม ของน้ำหนักแรกเกิด (wt) สำหรับระดับต่างๆของปัจจัย smoke
> library(UsingR)
> histogram( ~ wt | factor(smoke), data = babies,
+ subset = wt != 999, type = "density")
ได้กราฟดังรูปที่ 4.10 โดยที่ argument type = "density" ทำให้พื้นที่ของฮิสโตแกรมรวมกันเป็ นหนึ่ง ซึ่งให้ผลเหมือน กับ argument prob=TRUE ในฟังก์ชัน hist()
รูปที่ 4.10: Histogram of birth weight by smoking status
Densityplots กราฟการแจกแจงความหนาแน่ นนั้นเป็ นทางเลือกหนึ่
งที่ สามารถใช้แทนฮิสโตแกรมได้ เราสามารถสร้างกราฟการแจกแจงความหนาแน่นได้โดยใช้ฟังก์ชัน densityplot() ดังนี้
> densityplot( ~ wt | factor(smoke), data = babies)
ได้กราฟดังรูปที่ 4.11
รูปที่ 4.11: Densityplot of birth weight by smoking status
> densityplot( ~ wt | factor(smoke), data = babies)
ได้กราฟดังรูปที่ 4.11
รูปที่ 4.11: Densityplot of birth weight by smoking status
BoxplotsBoxplot นั้นสามารถใช้ได้กับข้อมูลตัวแปรเดียวหรือหลายตัวแปร เช่ นเราต้องการศึกษาความสัมพันธ์ระหว่
าง ระยะเวลาของการตั้งครรภ์ และรายได้ จำแนกตามปัจจัย smoke สามารถสร้าง boxplot ได้ดังนี้
> bwplot(gestation ~ factor(inc) | factor(smoke),
+ data=babies, subset = gestation != 999)
ได้ดังรูปที่ 4.12
รูปที่ 4.12: Boxplots of gestation time versus income level by smoking status
Scatterplots
> panel.regression = function(x,y) {
+ panel.xyplot(x,y)
+ panel.abline(lm(y ~ x))
+ }
> xyplot(wt ~ gestation | factor(smoke), data=babies,
+ subset = (wt != 999 & gestation != 999),
+ panel = panel.regression)
ได้กราฟดังรูปที่ 4.13 ฟังก์ชัน panel.regression(x,y) สร้างโดยผู้ใช้เองเพื่อเพิ่มเส้นถดถอยเข้าไปใน
scatterplot
> bwplot(gestation ~ factor(inc) | factor(smoke),
+ data=babies, subset = gestation != 999)
ได้ดังรูปที่ 4.12
รูปที่ 4.12: Boxplots of gestation time versus income level by smoking status
Scatterplots
> panel.regression = function(x,y) {
+ panel.xyplot(x,y)
+ panel.abline(lm(y ~ x))
+ }
> xyplot(wt ~ gestation | factor(smoke), data=babies,
+ subset = (wt != 999 & gestation != 999),
+ panel = panel.regression)
ได้กราฟดังรูปที่ 4.13 ฟังก์ชัน panel.regression(x,y) สร้างโดยผู้ใช้เองเพื่อเพิ่มเส้นถดถอยเข้าไปใน
scatterplot
รูปที่ 4.13: Scatterplot of gestation time versus weight for levels of smoke
ไม่มีความคิดเห็น:
แสดงความคิดเห็น