我正在尝试在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)
答案 0 :(得分: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")
答案 1 :(得分: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的合体;和紫色是合适的。
答案 2 :(得分: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)