R非线性最小二乘(nls)模型拟合
我试图将数据的G函数中的信息拟合到以下数学模式:y=A/((1+(B^2)*(x^2))^((C+1)/2))。此图的形状可以在此处看到: 下面是我一直在做的一个基本例子:R非线性最小二乘(nls)模型拟合,r,model,plot,nls,model-fitting,R,Model,Plot,Nls,Model Fitting,我试图将数据的G函数中的信息拟合到以下数学模式:y=A/((1+(B^2)*(x^2))^((C+1)/2))。此图的形状可以在此处看到: 下面是我一直在做的一个基本例子: data(simdat) library(spatstat) simdat.Gest <- Gest(simdat) #Gest is a function within spatstat (explained below) Gvalues <- simdat.Gest$rs Rvalues <-
data(simdat)
library(spatstat)
simdat.Gest <- Gest(simdat) #Gest is a function within spatstat (explained below)
Gvalues <- simdat.Gest$rs
Rvalues <- simdat.Gest$r
GvsR_dataframe <- data.frame(R = Rvalues, G = rev(Gvalues))
themodel <- nls(rev(Gvalues) ~ (1 / (1 + (B^2)*(R^2))^((C+1)/2)), data = GvsR_dataframe, start = list(B=0.1, C=0.1), trace = FALSE)
我也遇到了这个错误:
Error in nls(rev(Gvalues) ~ (1/(1 + (B^2) * (R^2))^((C + 1)/2)), data = GvsR_dataframe, :
singular gradient
Error in nls(Gvalues1 ~ (1/(1 + (B^2) * (x^2))^((C + 1)/2)), data = G_r_dataframe, :
step factor 0.000488281 reduced below 'minFactor' of 0.000976562
我不知道第一个错误是从哪里来的。然而,我认为第二种情况发生是因为我没有为B和C选择合适的起始值
我希望有人能帮我找出第一个错误的来源。另外,选择起始值以避免第二个错误的最有效方法是什么
谢谢 如前所述,您的问题很可能是起始值。您可以使用两种策略:
nls2
library(spatstat)
data(simdat)
simdat.Gest <- Gest(simdat)
Gvalues <- simdat.Gest$rs
Rvalues <- simdat.Gest$r
plot(Gvalues~Rvalues)
#let's try the normal CDF
fit <- nls(Gvalues~pnorm(Rvalues,mean,sd),start=list(mean=0.4,sd=0.2))
summary(fit)
lines(Rvalues,predict(fit))
#Looks not bad. There might be a better model, but not the one provided in the question.
库(spatstat)
数据(simdat)
simdat.Gest当您键入simdat.Gest时,您在该公式中使用的名称('Gvalues')与在data.frame('G')中使用的名称('Gvalues')不同。这是我的错误,我现在编辑了文章。“Gest”是在“spatstat”库中找到的函数。Gest是最近邻函数,它显示独立轴上粒子之间的距离,以及在从属轴上找到最近邻粒子的概率。因此,它从y=0开始,在y=1达到饱和点。此外,我尝试使用nls.lm,它也让我感到悲伤。这非常有用,谢谢!我可能会探索其他模型,并尝试优化我之前使用的模型,但这提供了一个很好的起点。罗兰,用CDF对我的信息进行建模已被证明是非常简单的,但没有像我希望的那样提供那么多有用的信息。我最初问题中的函数,如果我能够用数据对其建模,将提供更有用的信息。你知道我可以用什么策略来找出我上面提到的错误的来源吗?试图拟合一个不能很好地描述数据“形状”的模型通常会带来优化问题。这基本上就是错误消息告诉您的。非线性回归模型的选择应该(我几乎可以说必须)基于物理或数学考虑。您选择模型的理由是什么?我怀疑您正在尝试解决一些未知的其他问题,使用其他工具可以更好地解决这些问题。