2014-07-14 94 views
1

我想在樣條曲線上斜率最大且最小的點處獲得x和y值。我看到了如何在this post上做到這一點,但無法將其複製到我的數據集中。他們可以利用diff()但我的數據集有特定的x和y向量。我的數據通常是這樣的:從樣條計算斜率值

x<-c(0, 0.13, 0.22, 0.34, 0.44, 0.53, 0.62, 0.72, 0.83, 0.91) y<-c(120, 121, 122, 122, 122, 122, 122, 121, 119, 103) z <-data.frame(x, y) z plot(z) xspline(z$x,z$y, shape=0.5)

但我當然不能用這樣的:

w <-xspline(z$x,z$y, shape=0.5) plot(diff(w))

如果我可以,我會做到這一點:

param1 <- which(abs(diff(w))==max(abs(diff(w)))) param2 <-z[which(abs(diff(w))==max(abs(diff(w)))) ] param1 <- which(abs(diff(w))==min(abs(diff(w)))) param2 <-z[which(abs(diff(w))==min(abs(diff(w)))) ]

我會感激不同的方式來獲得這樣的斜坡陰謀,或從另一個方面來獲得這些參數。也許我在'splines'之路上走得太遠了。

+0

也許'numDeriv(splinefun())'? –

+0

嗯,''numDeriv'不給我結果。儘管splinefun聽起來像商業。我會繼續。 – ptenax

+0

謝謝@Carl Witthoft我設法在下面發表一個答案。 – ptenax

回答

1

只需使用

w <-data.frame(xspline(z$x,z$y, shape=0.5, draw=F)) 

,這將使w與用來繪製樣條線的xy值data.frame。然後,你可以採取的差異最大/最小的y估計最大和最小斜率點

plot(z) 
with(w, lines(x,y)) 
with(w[which.max(diff(w$y)),], points(x,y,col="red")) 
with(w[which.min(diff(w$y)),], points(x,y,col="blue")) 

enter image description here

+0

感謝@MrFlick,我設法使用它來獲得我所需的結果。其實這是你第二次幫助我,所以'再次感謝'。我還設法跟進卡爾威特軟的回答,我會在下面發表另一個答案。 – ptenax

1

從@Carl Witthoft給出的線索,繼我安裝的軟件包numDeriv所以我可以使用grad(),並繼續在我離開之前:

`plot(splinefun(z, method="monoH.F")) #just to check the shape of the spline 
w <-splinefun(z, method="monoH.F") 
z$slopes <-grad(w, z$x, method="simple") 
z 
plot(z$slopes~z$x) #just out of interest 
max.slope <- subset(z, slopes==max(z$slopes)) 
max.slope.y <-max.slope$y[1] 
max.slope.x <-max.slope$x[1]` 

也許不是那麼優雅,但沒有獲得成功。我注意到splinefun()xspline()之間的樣條形狀略有不同,這與我的應用程序可能相關,也可能不相關。