R非线性最小二乘(nls)模型拟合

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

我试图将数据的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 <- 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
  • 尝试对起始值进行合理的猜测。 根据您的值,可以对模型进行线性化
  • G=(1/(1+(B^2)*(R^2))^((C+1)/2))

    ln(G)=-(C+1)/2*ln(B^2*R^2+1)

    如果B^2*R^2较大,则约为ln(G)=-(C+1)*(ln(B)+ln(R)),这是线性的

    如果B^2*R^2接近于1,则约为ln(G)=-(C+1)/2*ln(2),这是常数

    (请检查错误,由于足球比赛,昨晚已经很晚了。)

    在提供其他信息后编辑: 数据似乎遵循累积分布函数。如果它像鸭子一样呱呱叫,很可能是鸭子。事实上,Gest表明CDF是估计的

    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对我的信息进行建模已被证明是非常简单的,但没有像我希望的那样提供那么多有用的信息。我最初问题中的函数,如果我能够用数据对其建模,将提供更有用的信息。你知道我可以用什么策略来找出我上面提到的错误的来源吗?试图拟合一个不能很好地描述数据“形状”的模型通常会带来优化问题。这基本上就是错误消息告诉您的。非线性回归模型的选择应该(我几乎可以说必须)基于物理或数学考虑。您选择模型的理由是什么?我怀疑您正在尝试解决一些未知的其他问题,使用其他工具可以更好地解决这些问题。