Fw: [程式] predict() in R 的疑難 , S3 level
研究 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
11/30 23:00, 1F
→
11/30 23:02, , 2F
11/30 23:02, 2F
→
11/30 23:03, , 3F
11/30 23:03, 3F
→
11/30 23:04, , 4F
11/30 23:04, 4F
→
11/30 23:07, , 5F
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)
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章