【发布时间】:2012-06-29 08:56:35
【问题描述】:
我正在尝试将数据的 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)
“Gest”是“spatstat”库中的一个函数。它是 G 函数或最近邻函数,它显示了独立轴上粒子之间的距离,以及在从属轴上找到最近邻粒子的概率。因此,它从 y=0 开始,在 y=1 处达到饱和点。
如果您绘制 simdat.Gest,您会注意到曲线是“s”形的,这意味着它从 y = 0 开始并在 y = 1 结束。出于这个原因,我反转了向量 Gvalues,它是因变量。因此,信息处于适合上述模型的正确方向。
您可能还注意到我已经自动设置了 A = 1。这是因为 G(r) 总是在 1 处饱和,所以我没有费心将它保留在公式中。
我的问题是我不断收到错误。对于上面的示例,我收到此错误:
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 选择合适的起始值。
我希望有人可以帮助我找出第一个错误的来源。另外,选择起始值以避免第二个错误的最有效方法是什么?
谢谢!
【问题讨论】:
-
当您输入
simdat.Gest <- Gest(simdat)时,您是在告诉我们您有一个名为Gest的函数。但是你没有给我们。我认为使用rnorm创建测试数据集并不难,尽管理想情况下我们会得到前二十行,但我们确实需要知道Gest在做什么。 -
您在该公式中使用的名称 ('Gvalues') 与 data.frame ('G') 中使用的名称不同
-
那是我的错误,我现在已经编辑了帖子。 “Gest”是“spatstat”库中的一个函数。 Gest 是最近邻函数,它显示独立轴上粒子之间的距离,以及在从属轴上找到最近邻粒子的概率。因此,它从 y=0 开始,在 y=1 处达到饱和点。
-
另外,我尝试过使用 nls.lm,它也让我很伤心。
标签: r model plot nls model-fitting