2017-01-07 18 views
1

に肘/膝を見つける:は、私はこれらのデータを持っている曲線

ように見える
x <- c(6.626,6.6234,6.6206,6.6008,6.5568,6.4953,6.4441,6.2186,6.0942,5.8833,5.702,5.4361,5.0501,4.744,4.1598,3.9318,3.4479,3.3462,3.108,2.8468,2.3365,2.1574,1.899,1.5644,1.3072,1.1579,0.95783,0.82376,0.67734,0.34578,0.27116,0.058285) 

y <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) 

plot(x,y) 

enter image description here

そして、私は肘を取得する方法を見つけたいです/ニーポイントで約x=6.5

私はフィッティングがloessカーブした後、第2導関数が働くかもしれないが、服用:それは仕事をやるよう

enter image description here

plot(x,predict(loess(y ~ x)),type="l") 
は見えません。

+1

可能[R:ggplot2を使用したLOESS曲線のスロープの変化](http://stackoverflow.com/questions/8245792/r-marking-slope-changes-in-loess-curve-using-ggplot2) – Uwe

答えて

5

私は、関数y=f(x)の派生物に大きな跳躍がある点を見つけたいと思います。あなたは(巨大なジャンプのために)しきい値に応じて1つのまたは多くのそのような点が存在することができ見ることができるようにあなたは、次のことを試すことができ、我々は選択します。

get.elbow.points.indices <- function(x, y, threshold) { 
    d1 <- diff(y)/diff(x) # first derivative 
    d2 <- diff(d1)/diff(x[-1]) # second derivative 
    indices <- which(abs(d2) > threshold) 
    return(indices) 
} 

# first approximate the function, since we have only a few points 
ap <- approx(x, y, n=1000, yleft=min(y), yright=max(y)) 
x <- ap$x 
y <- ap$y 

indices <- get.elbow.points.indices(x, y, 1e4) # threshold for huge jump = 1e4 
x[indices] 
#[1] 6.612851 # there is one such point 
plot(x, y, pch=19) 
points(x[indices], y[indices], pch=19, col='red') 

enter image description here

indices <- get.elbow.points.indices(x, y, 1e3) # threshold for huge jump = 1e3 
x[indices] 
#[1] 0.3409794 6.4353456 6.5931286 6.6128514 # there are 4 such points 
plot(x, y, pch=19) 
points(x[indices], y[indices], pch=19, col='red') 

enter image description here

関連する問題