如何解决R nls奇异梯度找到一个sigmoid函数
我正在尝试找到一个适合我的数据的最佳 sigmoid 函数(在本文末尾)。但是有一个错误:Error in nls(cumulativo ~ f(eixox,phi1,phi2,phi3),start = st,data = data,:singular gradient
有什么建议吗?
library("ggplot2")
data<-structure(list(cumulativo = c(2,3,17,191,819,1699,2679,3907,5535,7254,9226,11543,13809,15542,16852,17709,18246,18661,18976,19256,19412,19539,19639),eixox = 1994:2016),class = "data.frame",row.names = c(NA,-23L))
plot(cumulativo~eixox,data=data)
st <- list(phi1=20000,phi2=-5,phi3=.0005)
f <- function(x,phi3) {phi1/(1 + exp(-phi3 * x - phi2))}
curvaS<-nls(cumulativo~f(eixox,start=st,data=data,trace=TRUE)
解决方法
您的函数定义有误。应该是
f <- function(x,phi1,phi2,phi3) {phi1/(1 + exp(-phi3 * (x - phi2)))}
其中 phi1
是上限,phi2
是 sigmoid 曲线的中点,phi3
是比率。请注意额外的括号,以便从 phi2
中减去 x
,然后乘以 -phi3
。现在选择合理的起始值并运行 nls
:
st <- list(phi1=20000,phi2=2005,phi3=.5)
curvaS <- nls(cumulativo~f(eixox,phi3),start=st,data=data,trace=TRUE)
# 20466691 : 20000.0 2005.0 0.5
# 1334673 : 19669.7851882 2004.2327533 0.4406048
# 902806.6 : 19566.0810794 2004.1449741 0.4639131
# 901808.4 : 19578.7102128 2004.1498061 0.4637724
# 901808.4 : 19578.7652076 2004.1498401 0.4637683
curvaS
# Nonlinear regression model
# model: cumulativo ~ f(eixox,phi3)
# data: data
# phi1 phi2 phi3
# 19578.7652 2004.1498 0.4638
# residual sum-of-squares: 901808
#
# Number of iterations to convergence: 4
# Achieved convergence tolerance: 0.000003139
最后,情节:
plot(cumulativo~eixox,data=data)
pred <- predict(curvaS)
lines(data$eixox,pred)
,
我使用 SSlogis,它工作正常!
w<-read.csv(file="dvd.csv",sep=",")
cumulativo<-w$Cumulativo
eixox<-w$Ano
data<-data.frame(cumulativo,eixox)
plot(cumulativo~eixox,data=data)
fit <- nls(cumulativo ~ SSlogis(eixox,Asym,xmid,scal),data=data)
summary(fit)
curve(predict(fit,newdata = data.frame(eixox=x)),add=TRUE)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。