วันอาทิตย์ที่ 20 ธันวาคม พ.ศ. 2558

แพกเกจ FADA สำหรับเลือกตัวแปรและทำ LDA

       ในกรณีข้อมูลที่มีตัวแปรจำนวนมากอย่างในกรณีของข้อมูล 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])



ไม่มีความคิดเห็น:

แสดงความคิดเห็น