Fw: [程式] predict() in R 的疑難 , S3 level

看板R_Language作者 (Logit(odds))時間10年前 (2013/11/30 22:45), 編輯推噓0(005)
留言5則, 1人參與, 最新討論串1/1
研究 S3 與 predict() 的關聯 ----------------------------- 我以前的觀念 認為 predict() 的使用 , 是湊齊兩種條件 1. model <- lm(y~x) : 給予 linear model 2. Xpoint <- as.data.fram(x) : 給予 x 向量 在這樣的情況下 model 提供了回歸模型的趨勢線參數 y=ax+b Xpoint 提供了 x 值 , 套入趨勢線的 y=ax+b 得到 predicted y , 異於 real data y ----------------------------- 但我現在在研究一個 R package 作者的程序如下 source(../script/sourcetracker.R) 這個 sourcetracker.R 裡面包有一個 main function , sourcetracker() 還有大約 10 來個小 functions ----------------------------- 作者先用 sourcetracker() , 產生一個 model 變數 model 變數的內容很單純 , 都是 matrix 與 factor 而已 (我有把它拆開來跑過了 , 確定是單純變數) model <- list(NULL) model[[2]] <- 原始矩陣 (training set) [90樣本 & 100features] model[[3]] <- group factors [30 vs 30 vs 30 (total 90 樣本)] model[[1]] <- 根據 model[[3]] 的 factor , 將原始矩陣分成三分取 colSums 然後再 rbind() , 變成 [3混合樣本 & 100 features] 最後作者加了一行 class(model) <- "sourcetracker" ----------------------------------------------------------- 接下來作者進行 predict() predict( model , testSET , alpha1=0.001 , alpha2=0.001 ) 其中 model[[2]] 是 training set , 用來建造 model [資料矩陣維度 : 90 x 100] 而 testSET 是 testing set , 是需要被預測的資料 [資料矩陣維度 :10 x 100] *** 如果把 source(../script/sourcetracker.R) 收進來的小 fuinction 砍掉 , predict() 會跳出錯誤 ----------------------------------------------------------- 關鍵在這行 class(model) <- "sourcetracker" 當宣告了特定 class 後 再套用 predict() , predict() 就能進行計算 (不加就不能算) 但 model 這個變數根本不是 線型模型 所以 predict() 吃入 model 變數後 還需要做一大堆事情才能得到結果 (Gibb`s sampling,cross-validation,貝式 etc.) 但我不明白的是 , predict() 是怎麼知道接下來要做哪些事情? 因為我看其他的 internal function , 並沒有特別宣稱自己是屬於 "sourcetracker" 那 predict() 要怎麼辨認這些 function , 並按照正確的順序使用?? 誠心求教 -- 我用名為真心的卡牌說服你 這是我最後一張牌 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.215.136 ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:13) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:13) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:14) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:15) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:16) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:16) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:17) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:17) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:19) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:20) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:21) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:30) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:32) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:35) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:35) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:37) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:37) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:38) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:38) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:39) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:43) ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:43) ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: gsuper (114.32.215.136), 時間: 11/30/2013 22:45:16 ※ 編輯: gsuper 來自: 114.32.215.136 (11/30 22:45)

11/30 23:00, , 1F
predict.sourcetracker()
11/30 23:00, 1F

11/30 23:02, , 2F
S3並無需特別宣稱(理論上需要),class(model)就已將其
11/30 23:02, 2F

11/30 23:03, , 3F
改定為該類別. predict 是個S3函數. 故自行定義 predict
11/30 23:03, 3F

11/30 23:04, , 4F
該類別即可.
11/30 23:04, 4F

11/30 23:07, , 5F
methods("predict")可以知道哪些S3類別可用
11/30 23:07, 5F
原來如此 source(../script/sourcetracker.R) 裡面有 predict.sourcetracker() plot.sourcetracker.fit() plot.sourcetracker.pie() plot.sourcetracker.bar() plot.sourcetracker.dist() 也就是說 , predict() 或 plot() 的 input 若先天上帶有 class 就會去找這些 function 來用 謝謝C大 ! ※ 編輯: gsuper 來自: 114.32.215.136 (12/01 14:24) 更正一下 sourcetracker() 跑出來的結果是變數 "model" class(model) 等於 "sourcetracker" model 套用 predict() 後 , 自動轉向 predict.sourcetracker() 也就是說原本的 predict 被暫時覆蓋掉 predict.sourcetracker() 輸出的結果是變數 results , class(results) 等於 "sourcetracker.fit" results 套用 plot() 後 , 自動轉向 plot.sourcetracker.fit() 邏輯到這邊就很清楚了 ※ 編輯: gsuper 來自: 114.32.215.136 (12/01 19:19)
文章代碼(AID): #1IcVd-sh (R_Language)