2012-12-02 138 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