Я пытаюсь использовать nlsLM для соответствия экспериментальным данным. Но в этом примере я использую аналитические данные из другой программы, чтобы знать правильные значения. Я пытаюсь использовать nls2, чтобы дать мне отправные точки, которые я могу использовать при использовании nlsLM. Мне удалось сделать это с менее сложной функцией, но она не работает с более сложной функцией. Я получаю значения для nls2, но когда я использую nlsLM, я получаю сообщение об ошибке: «оценка функции fn возвращает бессмысленное значение». , что я не могу понять, потому что я использую значения coef из nls2 или фактические значения параметров, которые я ищу.
Ниже я создал образцы данных для времени и x, так что, надеюсь, они будут воспроизводимы для кого-то другого. У меня есть результаты из другой программы, поэтому приведенные ниже вычисления для Y_ex были использованы для проверки правильности настройки функции и соответствия этим результатам. Они используются в регрессионном анализе для этого примера. (Я новичок в r, извините за мой неэффективный код!).
library(nls2)
library(minpack.lm)
## Generate sample data for time and x
time_ex <- seq(from = 0, to = 50, by = 0.02)
strain_ex1 <- time_ex[1:326]*0.0011
strain_ex2 <- time_ex[327:2501]*0+0.0011*6.5
strain_ex <- c(strain_ex1,strain_ex2)
plot(time_ex,strain_ex)
x <- strain_ex
t <- time_ex
## Generate results with known parameters (eventually use to check results from nls)
Y_ex = c()
K <- 770 #coef(fit1)[1] # ** Paramter 1 for NLS **
TAU <- 4.5 # coef(fit1)[2] # ** Paramter 2 for NLS **
dt <- 0.02
for(i in seq(from=1, to=2501, by=1)){
if (i == 1) {
yO_ex = 0
dx_ex = 0
} else {
yO_ex = yT_ex
dx_ex = x[i] - x[i-1]
}
yT_ex = exp(-0.02/TAU)*yO_ex + (K/2) * (1 + exp(-0.02/TAU))*dx_ex
Y_ex = c(Y_ex,yT_ex)
}
plot(x,Y_ex)
plot(time_ex,Y_ex)
df <- data.frame(t = t, x = x , y = Y_ex)
Я подбираю параметры k и tau, используя nls. Поскольку мне известны фактические значения для этого примера, я попытался использовать близкие значения в качестве начальных значений. Я попытался использовать их в качестве начальных значений для nlsLM и получил ту же ошибку.
### Define Function for Nonlinear Regression Analysis
Func1 <- function(t, x, k, tau){
for(i in seq(from=1, to=2501, by=1)){
if (i == 1) {
yO = 0
dx = 0
dt = 0
} else {
yO = yT
dx = x[i] - x[i-1]
dt = t[i] - t[i-1]
}
yT <- exp(-dt/tau)*yO + (k/2) * (1 + exp(-dt/tau))*dx
}
return(yT)
}
### Nonlinear Regression Analysis 1
# Start parameters
grd <- data.frame(k=c(0,770),
tau=c(0,4.4)
)
## perform nls
set.seed(123)
fit1 <- nls2(
y ~ Func1(t, x, k, tau),
data = df,
start = grd,
algorithm ="random"
)
coef(fit1)
## nlsLM with coeff from nls2
fit2 <- nlsLM(
y ~ Func1(t, x, k, tau),
data = df,
start = coef(fit1)
)
Вот где я получаю свою ошибку: «Ошибка в nls.lm (par = start, fn = FCT, ja c = ja c, control = control, lower = lower,: оценка функции fn возвращает нечувствительное значение! "
Эта ошибка сбила меня с толку, так как я использую параметры из nls2 в качестве выходных. Если я использую фактические известные значения в качестве начальных значений (полностью пропуская nls2), я получаю ту же ошибку.
Есть ли причина, по которой nls2 дает ответ, а nlsLM дает Ошибка? Я попытался переопределить функцию после запуска nls2 на случай, если он ее не понял, и это тоже не помогло.
Пожалуйста, дайте мне знать, если вам нужно что-то уточнить. Любая помощь приветствуется!
Обновление:
После добавления return в функцию я получаю следующую ошибку после запуска nlsLM * Ошибка в qr (.swts * attr (rhs, "gradient ")): dims [product 2] не совпадают h длина объекта [2501] Дополнительно: Предупреждение: В .swts * attr (rhs, "gradient"): более длинная длина объекта не кратна более короткой длине объекта *
Я все еще получаю результаты для бно.