ในกรณีข้อมูลที่มีตัวแปรจำนวนมากอย่างในกรณีของข้อมูล NIR spectrum นั้น มักมีความสนใจในการเลือกเฉพาะตัวแปรที่มีความสำคัญในการสร้างโมเดลในการทำนาย ซึ่งวิธีการเลือกตัวแปรนั้นมีหลายวิธี แพกเกจ FADA เป็นอีกแพกเกจที่ออกแบบมาเพื่อใช้สำหรับการเลือกตัวแปรและวิเคราะห์ discriminant analysis โดยเฉพาะ โดยขั้นตอนของการวิเคราะห์มีอยู่ 3 ขั้นตอนคือ
1. decorrelation ข้อมูลใน training set ด้วยฟังก์ชั่น decorrelate.train
2. decorrelation ข้อมูล test set ด้วยฟังก์ชั่น decorrelate.test
3. สร้าง supervised classification model ด้วยฟังก์ชั่น FADA
บน R console
> install.packages("FADA")
> library(FADA)
สร้างข้อมูล training set โดยจะต้องมีรูปแบบของข้อมูลเป็น list ที่มี 2 ตัวแปรคือ x เป็น matrix ที่ประกอบด้วยด้วยข้อมูลตัวแปร (ในกรณีนี้คือค่า absorbance ที่แต่ละความยาวคลื่น ของแต่ละตัวอย่าง) และ y เป็นตัวแปรที่ใช้ระบุกลุ่มของตัวอย่าง (ต้องเป็นตัวเลขเท่านั้น)
> source("C:\\Users\\Windows\\Documents\\csv2matrix.R")
> coffee<-csv2matrix()
> groups<-rep(c(1,2,3),each=50)
> even<-seq(2,300,2)
> odd<-seq(1,300,2)
ชุด traning set
> coffee.list.train <-list(x=coffee[odd,],y=groups)
> str(coffee.list.train)
List of 2
$ x: num [1:150, 1:558] 0.609 0.638 0.619 0.614 0.631 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:558] "12481.8432" "12466.41447" "12450.98574" "12435.55701" ...
$ y: num [1:150] 1 1 1 1 1 1 1 1 1 1 ...
ชุด test set
> coffee.list.test <-list(x=coffee[even,],y=groups)
> str(coffee.list.test)
List of 2
$ x: num [1:150, 1:558] 0.618 0.625 0.64 0.65 0.623 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:558] "12481.8432" "12466.41447" "12450.98574" "12435.55701" ...
$ y: num [1:150] 1 1 1 1 1 1 1 1 1 1 ...
decorrelation ข้อมูลใน training set ด้วยฟังก์ชั่น decorrelate.train
> fa <- decorrelate.train(coffee.list.train)
[1] "Number of factors: 10 factors"
[1] "Objective criterion: "
[1] 270.0801
[1] 140.3937
[1] 31.69263
[1] 1.058545
[1] 0.02515622
[1] 0.001721782
[1] 1.541182e-05
decorrelation ข้อมูล test set ด้วยฟังก์ชั่น decorrelate.test
> fa2 <- decorrelate.test(fa,coffee.list.test)
สร้าง supervised classification model ด้วยฟังก์ชั่น FADA
> class <- FADA(fa2,method="sda",sda.method="lfdr")
ตัวแปรที่ใช้ทั้งหมด 22 ตัว (ลำดับของตัวแปร)
> class$selected
[1] 528 348 347 536 527 349 543 470 542 471 469 532 529 472 468 537 54 544 541 192 351 350
ซึ่งตรงกับค่าเลขคลื่นดังต่อไปนี้
[1] 4350.902 7128.074 7143.502 4227.472 4366.331 7112.645 4119.471
[8] 5245.768 4134.900 5230.340 5261.197 4289.187 4335.473 5214.911
[15] 5276.626 4212.043 11664.120 4104.042 4150.329 9534.956 7081.787
[22] 7097.216
ผลการจัดกลุ่มในตัวอย่าง test set จะเห็นว่าถูกต้อง 100%
> class$proba.test
1 2 3
[1,] 1 0 0
[2,] 1 0 0
[3,] 1 0 0
[4,] 1 0 0
[5,] 1 0 0
[6,] 1 0 0
[7,] 1 0 0
[8,] 1 0 0
[9,] 1 0 0
[10,] 1 0 0
[11,] 1 0 0
[12,] 1 0 0
[13,] 1 0 0
[14,] 1 0 0
[15,] 1 0 0
[16,] 1 0 0
[17,] 1 0 0
[18,] 1 0 0
[19,] 1 0 0
[20,] 1 0 0
[21,] 1 0 0
[22,] 1 0 0
[23,] 1 0 0
[24,] 1 0 0
[25,] 1 0 0
[26,] 1 0 0
[27,] 1 0 0
[28,] 1 0 0
[29,] 1 0 0
[30,] 1 0 0
[31,] 1 0 0
[32,] 1 0 0
[33,] 1 0 0
[34,] 1 0 0
[35,] 1 0 0
[36,] 1 0 0
[37,] 1 0 0
[38,] 1 0 0
[39,] 1 0 0
[40,] 1 0 0
[41,] 1 0 0
[42,] 1 0 0
[43,] 1 0 0
[44,] 1 0 0
[45,] 1 0 0
[46,] 1 0 0
[47,] 1 0 0
[48,] 1 0 0
[49,] 1 0 0
[50,] 1 0 0
[51,] 0 1 0
[52,] 0 1 0
[53,] 0 1 0
[54,] 0 1 0
[55,] 0 1 0
[56,] 0 1 0
[57,] 0 1 0
[58,] 0 1 0
[59,] 0 1 0
[60,] 0 1 0
[61,] 0 1 0
[62,] 0 1 0
[63,] 0 1 0
[64,] 0 1 0
[65,] 0 1 0
[66,] 0 1 0
[67,] 0 1 0
[68,] 0 1 0
[69,] 0 1 0
[70,] 0 1 0
[71,] 0 1 0
[72,] 0 1 0
[73,] 0 1 0
[74,] 0 1 0
[75,] 0 1 0
[76,] 0 1 0
[77,] 0 1 0
[78,] 0 1 0
[79,] 0 1 0
[80,] 0 1 0
[81,] 0 1 0
[82,] 0 1 0
[83,] 0 1 0
[84,] 0 1 0
[85,] 0 1 0
[86,] 0 1 0
[87,] 0 1 0
[88,] 0 1 0
[89,] 0 1 0
[90,] 0 1 0
[91,] 0 1 0
[92,] 0 1 0
[93,] 0 1 0
[94,] 0 1 0
[95,] 0 1 0
[96,] 0 1 0
[97,] 0 1 0
[98,] 0 1 0
[99,] 0 1 0
[100,] 0 1 0
[101,] 0 0 1
[102,] 0 0 1
[103,] 0 0 1
[104,] 0 0 1
[105,] 0 0 1
[106,] 0 0 1
[107,] 0 0 1
[108,] 0 0 1
[109,] 0 0 1
[110,] 0 0 1
[111,] 0 0 1
[112,] 0 0 1
[113,] 0 0 1
[114,] 0 0 1
[115,] 0 0 1
[116,] 0 0 1
[117,] 0 0 1
[118,] 0 0 1
[119,] 0 0 1
[120,] 0 0 1
[121,] 0 0 1
[122,] 0 0 1
[123,] 0 0 1
[124,] 0 0 1
[125,] 0 0 1
[126,] 0 0 1
[127,] 0 0 1
[128,] 0 0 1
[129,] 0 0 1
[130,] 0 0 1
[131,] 0 0 1
[132,] 0 0 1
[133,] 0 0 1
[134,] 0 0 1
[135,] 0 0 1
[136,] 0 0 1
[137,] 0 0 1
[138,] 0 0 1
[139,] 0 0 1
[140,] 0 0 1
[141,] 0 0 1
[142,] 0 0 1
[143,] 0 0 1
[144,] 0 0 1
[145,] 0 0 1
[146,] 0 0 1
[147,] 0 0 1
[148,] 0 0 1
[149,] 0 0 1
[150,] 0 0 1
ถ้าเราใช้ตัวแปรเหล่านี้ไปใช้วิเคราะห์ lda ใน MASS เหมือนก่อนหน้านี้
> grouping<-rep(c("black","unpeel","good"),each=100)
> coffee.df<-as.data.frame(coffee)
> coffee.trn <-coffee.df[odd,class$selected]
> str(coffee.trn)
'data.frame': 150 obs. of 22 variables:
.
.
.
> coffee.test <-coffee.df[even,class$selected]> coffee.lda <- lda(coffee.trn,grouping =grouping[odd],prior = rep(1,3)/3)
> plot(coffee.lda)
> coffee.predict <-predict(coffee.lda,new=coffee.test)
> table(grouping[even],coffee.predict$class)
black good unpeel
black 50 0 0
good 0 50 0
unpeel 0 0 50
จะเห็นว่าโมเดลที่ใช้ตัวแปรเพียง 22 ตัวที่เลือกมาสามารถใช้วิเคราะห์แยกกลุ่มตัวอย่างได้ถูกต้อง 100 % เช่นกัน
ถ้าสร้างตัวแปร wavenum ซึ่งมีข้อมูล wavenumber ที่ใช้
> wave<-read.csv(file.choose(),header=FALSE)
> wavenum<-wave$V1
> plot(wavenum,coffee[1,],type="l")
> plot(wavenum[class$selected],coffee[1,class$selected])
ไม่มีความคิดเห็น:
แสดงความคิดเห็น