1.問題起源
predict的參數(shù)type默認(rèn)值就是“l(fā)p”,代表線性模型,理論上和大量文章里描述的公式應(yīng)該是結(jié)果相同的。比如這個(gè):
但是我突然發(fā)現(xiàn)他倆對(duì)不上號(hào)(⊙﹏⊙)
2.探索原因
沒去搜索,直接發(fā)了個(gè)朋友圈,五分鐘后收到了這個(gè)鏈接:https://mp.weixin.qq.com/s/Fg-Nefyz8BIzN17oJ23wxQ
哈哈!我神奇的幾千人朋友圈,真的是藏龍臥虎,這也是我解決困惑的基本操作,近水樓臺(tái)先得月。而且在這個(gè)鏈接里找到了我的名字~美滋滋。
簡單來說,就是加權(quán)乘積比predict的預(yù)測結(jié)果多加了一個(gè)常數(shù)。
3.比較二者的結(jié)果
上文種已經(jīng)對(duì)公式做了很好的推導(dǎo),我用R語言完成一下咯:
rm(list = ls())
library(survival)
load("surv_model.Rdata")
names(model$coefficients)
## [1] "HFE" "SHISA5" "BRCA1" "EPM2A" "ERLIN1" "GPX7" "SLN"
## [8] "DNAJB11" "MMP2" "NOL3" "CP" "ATP2A2" "GLA" "MAPK3"
## [15] "SREBF2" "CASP2" "SNCA" "DDIT3" "BAG1" "ANXA5"
model$coefficients
## HFE SHISA5 BRCA1 EPM2A ERLIN1 GPX7 SLN
## 0.3024894 0.6928951 0.7909278 -0.5709679 -0.7810678 0.4341572 -0.1456389
## DNAJB11 MMP2 NOL3 CP ATP2A2 GLA MAPK3
## -0.8620475 0.1276739 0.3153988 0.1535990 0.6495272 0.3665937 0.8236297
## SREBF2 CASP2 SNCA DDIT3 BAG1 ANXA5
## -0.4178062 0.3980908 0.1977293 0.1403852 -0.2884173 0.1684487
a = predict(model,surv1)
b = apply(surv1[,names(model$coefficients)], 1,function(k){
sum(model$coefficients * k)
})
dat = data.frame(a,b,k = a-b)
head(dat)
## a b k
## TCGA-06-0878-01A 2.232431 12.03249 -9.800062
## TCGA-26-5135-01A 2.736399 12.53646 -9.800062
## TCGA-06-5859-01A 1.992062 11.79212 -9.800062
## TCGA-06-2563-01A 1.153412 10.95347 -9.800062
## TCGA-41-2571-01A 2.982385 12.78245 -9.800062
## TCGA-28-5207-01A 1.966414 11.76648 -9.800062
plot(a,b)
a是predict計(jì)算的結(jié)果,b是加權(quán)乘積計(jì)算的結(jié)果。如果是lasso模型,這兩個(gè)數(shù)值是一致的。但cox模型,確實(shí)不一致。
4.不擅長公式推導(dǎo),勉強(qiáng)試試
需要認(rèn)識(shí)一下R語言里的函數(shù)exp和log
exp(1)
## [1] 2.718282
exp(10)
## [1] 22026.47
log(exp(1))
## [1] 1
log(exp(10))
## [1] 10
exp是自然常數(shù)e的指數(shù)運(yùn)算,exp(n)就是e的n次方,log則是數(shù)學(xué)公式里的ln,取自然對(duì)數(shù)的意思,二者剛好可逆
所以公式可以寫作
h(t,x) = h0(t)*exp(b)
log(h(t,x))-log(h0(t)) = b
所以predict計(jì)算出的預(yù)測值a就是公式里的log(h(t,x)),而上面的a-b的差-9.800062這個(gè)數(shù)字,就是公式里的常數(shù)log(h0(t))咯。