Я пытаюсь подогнать информацию из функции 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. По этой причине я уважал векторные G-значения, которые являются зависимыми переменные. Таким образом, информация находится в правильной ориентации, чтобы соответствовать указанной выше модели.
Вы также можете заметить, что я автоматически установил 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
. - person IRTFM   schedule 28.06.2012