2

関数をRに適合させようとしているので、nls()を使用します。近似関数がゼロを下回るのを防ぐ方法はありますか?

簡単な回避策は、近似後にターゲット関数のパラメーターを上げることb0ですが、正のビーイングの制約を伴う実際の近似がより良い結果につながることを期待しているため、これは実際には私が望むものではありません。

y=c(m1,m2,m3,m4,m5,m6,m7,m8,m9,m10)
d=data.frame(seq(1, 10, 1),y=y)
fitFun <- function(x, add, b0, b1) {b0 + (x+add)^b1}
m=nls(y~fitFun(x,add,intercept,power),d,start=list(intercept=1,power=3.5,add=2),trace=T)
4

3 に答える 3

2

モデルを変更する必要があります。そのためには、関数値がゼロを下回った場合に何が起こるかを定義する必要があります。これらの値を0に設定する例を次に示します。

x <- 1:200/100
set.seed(42)
y <- -10+(x+1)^3.5+rnorm(length(x),sd=3)
df <- data.frame(x,y)

plot(y~x,data=df)

fitFun <- function(x, add, b0, b1) {
    res <- b0 + (x+add)^b1
    res[res<0] <- 0
    res
}
fit <- nls(y~fitFun(x,add,intercept,power),
           data=df,start=list(intercept=1,power=3.5,add=2))
summary(fit)
lines(predict(fit)~df$x,col="red")

適合結果

于 2012-12-02T13:17:13.933 に答える
1

これをお探しですか?予測がパラメーターの反転が難しい関数である場合、予測を非負にするためにパラメーターを制約することは難しい場合がありますが、この場合、必要なのはb0>=0... @Rolandの例を使用して、

fit2 <- nls(y~b0+(x+add)^b1,
            algorithm="port",
            lower=c(b0=0,b1=-Inf,add=-Inf),
            data=df,start=list(b0=1,b1=3.5,add=2))
lines(predict(fit2)~df$x,col="purple")

次の青は、元の制約のないフィットです。赤は@Rolandの適合です。紫は上のフィット感です。

ここに画像の説明を入力してください

于 2012-12-02T21:40:08.033 に答える
0

答えてくれてありがとう。問題について十分な情報を提供しなかったのかもしれませんが、写真を投稿することはまだ許可されておらず、すべてを説明することで短編小説につながるでしょう。

@Rolandは完全に正しかったのですが、ターゲット関数の動作を気にするのはオプティマイザーのタスクではありませんが、前述したように、モデルは修正されていると思います。

関数の加法部分を正の値に制限するという@BenBolkerの提案は、不満足な結果につながりました。

私が言及しなかったのは、m1からm10は、私が記録したデータ収集の平均値であるということでした。記録された系列の分散をフィッティングプロセス中の重みとして使用することで、問題を解決しました。

y=c(m1,m2,m3,m4,m5,m6,m7,m8,m9,m10)
d=data.frame(seq(1, 10, 1),y=y)
vars = c(var(lt1$V1),var(lt2$V1),var(lt3$V1),var(lt4$V1),var(lt5$V1),var(lt6$V1),var(lt7$V1),var(lt8$V1),var(lt9$V1),var(lt10$V1))
weights = rep(max(vars),10)/vars
fitFun <- function(x, add, b0, b1) {b0 + (x+add)^b1}
m=nls(y~fitFun(x,add,intercept,power),d,weights=weights,start=list(intercept=1,power=3.5,add=2),trace=T)
于 2012-12-03T14:56:16.360 に答える