2014-09-11 81 views
3

我的數據集:R:故障嵌合用NLS 4-參數曲線L型

mydata<-structure(list(t = c(0.208333333, 0.208333333, 0.208333333, 0.208333333, 
1, 1, 1, 1, 2, 2, 2, 2, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 
16, 16, 0.208333333, 0.208333333, 0.208333333, 0.208333333, 1, 
1, 1, 1, 2, 2, 2, 2), parent = c(1.2, 1.4, 0.53, 1.2, 1, 0.72, 
0.93, 1.1, 0.88, 0.38, 0.45, 0.27, 0.057, 0.031, 0.025, 0.051, 
0.027, 0.015, 0.034, 0.019, 0.017, 0.025, 0.024, 0.023, 0.29, 
0.22, 0.34, 0.19, 0.12, 0.092, 0.41, 0.28, 0.064, 0.05, 0.058, 
0.043)), .Names = c("t", "Ct"), row.names = c(325L, 326L, 
327L, 328L, 341L, 342L, 343L, 344L, 357L, 358L, 359L, 360L, 373L, 
374L, 375L, 376L, 389L, 390L, 391L, 392L, 401L, 402L, 403L, 404L, 
805L, 806L, 807L, 808L, 821L, 822L, 823L, 824L, 837L, 838L, 839L, 
840L), class = "data.frame") 

功能被裝配是一個L型曲線;也就是說,它的彎曲點TB之後變平關:

hockeystick<-function (t, C0, k1, k2, tb) 
{ 
    Ct = ifelse(t <= tb, C0 -k1 * t, C0 -k1*tb -k2*t) 
} 

裝修中使用NLS:

start.hockey<-c(C0=3,k1=1,k2=0.1,tb=3) 
nls(log(Ct)~hockeystick(t,C0,k1,k2,tb),start=start.hockey,data=mydata) 

不管我用什麼樣的起始值,我總是得到這樣的錯誤:

Error in nlsModel(formula, mf, start, wts) : 
    singular gradient matrix at initial parameter estimates 

我嘗試了port和標準nls方法。我嘗試了線性化(在這裏顯示)和模型的正常狀態,但都不起作用。

編輯:根據卡爾的建議,我嘗試將模型擬合到數據集,我首先對每個t值的Ct值進行平均,然後仍然得到錯誤。

編輯:有點改變模型,所以k2值是積極的,而不是消極的。負值在動力學上沒有意義。

+0

嘗試繪製'L型(MYDATA $噸,C0,K1,K2,TB)''VS MYDATA $ t'。這不是曲棍球棒。此外,你重複的't'值幾乎可以保證迴歸失敗。 – 2014-09-11 13:38:57

+0

因此,一般來說,我最好將回歸擬合爲每個t值的平均值? hockeystick是線性化的形式,所以y軸是對數單位。 – Pinemangoes 2014-09-11 13:58:08

+0

tb是曲棍球模型的'彎曲點',即曲線改變其「下降速度」的點。 – Pinemangoes 2014-09-11 14:06:36

回答

2

我還沒有完全解決nls()問題,但我有幾點建議。

首先,我建議稍微修改您的曲棍球棒的功能,使其連續在斷點處:

hockeystick<-function (t, C0, k1, k2, tb) 
{ 
    Ct <- ifelse(t <= tb, C0 -k1 * t, C0 -k1*t -k2*(t-tb)) 
} 

目測:

par(las=1,bty="l") ## cosmetic 
plot(log(Ct)~t,data=mydata) 
curve(hockeystick(x,C0=0,k1=0.8,k2=-0.7, tb=3),add=TRUE) 

enter image description here

我做k2這裏爲負,所以第二階段的遞減斜率爲減去 th在第一階段。

start.hockey <- c(C0=0,k1=0.8,k2=-0.7, tb=3) 
nls(log(Ct)~hockeystick(t,C0,k1,k2,tb), 
         start=start.hockey,data=mydata) 

模型使用斷點往往在參數不可微,但 我不太看到,這裏是一個問題......

這並不工作:

library(bbmle) 
m1 <- mle2(log(Ct)~dnorm(hockeystick(t,C0,k1,k2,tb), 
        sd=exp(logsd)), 
      start=c(as.list(start.hockey),list(logsd=0)), 
      data=mydata) 

參數是合理的(並且與起始值不同):

coef(summary(m1)) 
##   Estimate Std. Error z value  Pr(z) 
## C0 -0.4170749 0.2892128 -1.442104 1.492731e-01 
## k1  0.6720120 0.2236111 3.005271 2.653439e-03 
## k2 -0.5285974 0.2400605 -2.201934 2.766994e-02 
## tb  2.0007688 0.1714292 11.671108 1.790751e-31 
## logsd -0.2218745 0.1178580 -1.882558 5.976033e-02 

劇情預測:

pframe <- data.frame(t=seq(0,15,length=51)) 
pframe$pred <- predict(m1,newdata=pframe) 
with(pframe,lines(t,pred,col=2)) 

enter image description here

+0

感謝您的全面回答。是的,你從'tb'修改爲't-tb'是一個很大的改進。 今晚晚些時候我回到家後,我會檢查你的答案的其餘部分。 – Pinemangoes 2014-09-11 14:28:04

+0

你能解釋一下爲什麼你用'hockeystick()'包裝'dnorm'函數來估計?另外,對於這個特定的化合物,我可能需要在't'的2-10範圍內得到數據...... – Pinemangoes 2014-09-11 18:30:01

+0

另外,在擬合過程中似乎'tb'參數完全沒有改變。無論我在hockey.start中使用的值是否保存在最終的參數集中。雖然我通常可以根據數據做出有根據的猜測,但我無法在紙上寫出這樣的結論。 – Pinemangoes 2014-09-11 18:37:17