2012-12-02 96 views
2

我試圖在R中安裝一個函數,因此我使用nls()。 有沒有辦法來防止擬合函數下降到零以下?防止nls-fit低於零

一個簡單的解決辦法是在適合後在目標函數中增加參數b0,但這實際上並不是我想要的,因爲我期望真正符合beeing positive的約束以導致更好的結果。

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) 

回答

0

非常感謝您的答案。也許我沒有提供足夠的有關我的問題的信息,但我還沒有被允許發佈圖片,並且描述所有內容都會導致一個簡短的故事。

@Roland是完全正確的,它不是關注目標函數行爲的優化器任務,但正如我所提到的,我假設模型需要修復。

@Ben Bolker建議將函數的附加部分限制爲正值,這導致了一個不確定的結果。

我沒有提到的是,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) 
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") 

fit result

+0

感謝答案,我會想,我怎麼可能會改變我的模型,但實際上我看到的模型固定的,寧可告訴大家,functionvalues應保持在零以上例如優化作爲優化過程中的附加條件 – B1ANCHi

+0

@BANANCHi我覺得你很困惑。如果您對模型的結果施加限制,則可以有效地更改模型。你可以通過實際改變模型或採取便宜的方式來實現,我已經在這裏展示了。優化器只關心如果你想約束模型參數。 – Roland

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") 

在下面的藍色是最初的無約束配合;紅色是@羅蘭德的配合;上面是紫色。

enter image description here

+0

@BANANCHi但是,如果數據明顯違反了它的約束,那麼您應該重新考慮您的模型,就像本例中的情況一樣。 – Roland