2016-05-11 8 views
2

私は非常に小さなデータセットを特徴付けるためにRで利用可能なさまざまなスプライン関数を試してきました。はるかに大きなデータセットでは、期待どおりの任意の数のカーブが動作すると思いますが、この場合のデータは限られています。以下のコードは、私が働いているデータの種類の例を示しています。これまでのところ小さなデータセット用のスプライン関数R

library(ggplot2); library(stats) 

dat <- data.frame(x = c(0.333, 0.5, 1, 2, 3, 4, 5), 
        y = c(5.875e-03, 1.225e-02, 3.902e-02, 8.942e-03, 
         4.277e-03, 1.938e-03, 1.131e-03)) 


mod <- splinefun(dat$x, dat$y, method = "monoH.FC") 
mod <- data.frame(x = seq(0.333, 5, by = 0.1), y = mod(seq(0.333, 5, by = 0.1))) 

ggplot() + geom_point(data = dat, aes(x = x, y = y)) + 
geom_line(data = mod, aes(x = x, y = y)) 

Curve example

を、モノトーンエルミートスプラインは最高にフィットするものであるが、それはまだいくつかの問題を抱えています。

直観的に、私はここでどのような曲線が見えるべきかをあなたに教えてくれます。それはx = 1に最大値を持つ必要があり、そのディップはx = 2.5にあるべきではありません。再現するのが難しいような曲線は見えません。左のスキューと予測可能なテールが非対称です。

一般的なデータセットに、より適切にフィットするスプライン関数を生成するための「より良い」方法がありますか?小さなデータセットに曲線を当てはめるスプラインよりも良いツールがありますか?

dat2 = data.frame(x = union(dat$x,dat$x - c(0,diff(dat$x)/2)), 
        y = interp1(dat$x,dat$y,xi = union(dat$x,dat$x - c(0,diff(dat$x)/2)))) 

interp1することがあります何を後にしていることに-間、私はあなたが本当のポイントとして中間点を補間することによってそれを強制することができると思い線形ためにフィット近づけるようにすることですよう

+0

'rms'パッケージをチェックしましたか?フィッティングカーブには使いやすい関数が満載です。 –

答えて

0

ですねここでは、不要な、union(dat$y,dat$y - c(0,diff(dat$y)/2))は同じことを行うが、作品上記のコード必要があります)

EDIT:注意を、diffが動作するためには、あなたのデータが正しく、これは新しいデータを作成し、最初の

を注文する必要があります。フレームウィットhは以前のものの間を指していますが、これをスプラインするとより直線的なフィッティングに重み付けされます

EDIT2:このようにスムージングスプラインを使用して、主なポイントの重み:

mod <- splinefun(dat$x, dat$y,method = 'monoH.FC') 
mod2 <- data.frame(x = seq(0.333, 5, by = 0.1), y = mod(seq(0.333, 5, by = 0.1))) 


# A set of weights, where each point in-between is weighted half as much 
dat2$w <- rep(c(0.5,1),ceiling(length(dat2$x)/2))[-1] 

# Smoothing Spline 
modelspline <- smooth.spline(dat2$x, dat2$y,dat2$w) 

# Plot points 
xplot <- seq(min(dat2$x),max(dat2$x),by = 0.1) 

# And Plot comparison 
ggplot() + 
    geom_point(data = dat, aes(x = x, y = y)) + 
    geom_line(data = mod2, aes(x = x, y = y)) + 
    geom_line(data = data.frame(predict(modelspline,xplot)), 
     aes(x = x, y = y),color = 'red') 
関連する問題