Функция R nls2 - ошибка в результате [[which.min (ss)]]: попытка выбрать менее одного элемента в get1index - PullRequest
1 голос
/ 06 марта 2020

Я 2 дня борюсь за множественную регрессию. Вот что у меня есть в данный момент:

y<- c(-0.3902,  0.5277,  0.4357, -0.1888, -6.7422,  0.3797, -0.5141,      NA, -1.2423,  5.6756, -0.5352,
-0.2379,      NA,  0.4270,      NA,      NA,      NA,      NA,      NA,      NA, -1.1185,  0.0594,
 0.8280,      NA,  1.8387, -3.1469,-1.6212, -0.8400,      NA ,     NA,      NA, -0.7291,  2.0888)
x<- c( 0.07712829, 0.07038519, 0.08875312, 0.08235028, 0.10874493, 0.09713412, 0.11821937, 0.12796526,
0.12159038, 0.08520884, 0.07046089, 0.07417249, 0.07507544, 0.11416440, 0.09955467, 0.06688244,
0.06871298, 0.06187514, 0.12293434, 0.07864503, 0.12417404, 0.08600490, 0.10745128, 0.12277381,
0.12952106, 0.09144677, 0.09034708, 0.08039892, 0.07856194, 0.07864304, 0.10883127, 0.10690687,
0.11617899)

f1<- y ~ ((a*b)/(a+b)+x)

st1 <- expand.grid(a = seq(0, 1000, len = 10),
                   b = seq(0, 800, len = 10))

o<-nls2(f1,
        start = st1,
        algorithm = "brute-force")

И результат

Ошибка в numericDeriv (форма [[3L]], имена (ind), env): отсутствует значение или бесконечность, полученные при оценке модели Ошибка в результате [[which.min (ss)]]: попытка выбрать менее одного элемента в get1index

Я пытался с

st2<- data.frame(a = c(0,1000), b = c(0, 800))
o<-nls2(f1,
        start = st2,
        algorithm = "brute-force")```

получение

Ошибка в результате [[which.min (ss)]]: попытка выделить менее одного элемента в get1index

У меня нет Идея, что значение может быть, что также затрудняет дать начальное значение. Я должен применить уравнение к нескольким наборам данных (здесь я просто приведу, например, меньший).

Какие-нибудь советы о том, как это сделать? Возможно, использовать другой пакет для множественной регрессии вместо nls2?

Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 06 марта 2020

Модель не идентифицируется. Внешние скобки не имеют значения, поэтому мы можем записать вашу модель эквивалентно в виде:

y ~ (a*b)/(a+b) + x

, а первый член является просто некоторой константой, поэтому не может быть функцией двух параметров.

Также обратите внимание, что правая часть - NaN, если a = b = 0.

Возможно, вы намеревались f2, как показано ниже. Также изменили 0 на 1 в нижних пределах, чтобы избежать ситуации с NaN.

st2 <- data.frame(a = c(1, 1000), b = c(1, 800))
f2 <- y ~ (a*b) / (a+b+x)
nls2(f2, start = st2, algorithm = "brute-force")

Добавлено

Из комментариев y ~ (a*b)/(a+b) + x фактически было вашим намерением, поэтому в этом случае мы можем сделать это Идентифицируемый и поэтому изменяемый для моделирования с использованием:

 f3 <- y ~ A + x
 nls(f3, start = list(A = 1))

Эта модель настолько проста, что мы можем поочередно вычислить оптимальное значение A непосредственно как mean(y - x, na.rm = TRUE). Теперь выберите a (или b) произвольно и решите A = a * b / (a + b) для b (или a), отметив, что, если мы берем взаимные обратные связи с обеих сторон, мы имеем 1/A = 1/a + 1/b, то есть A - половина гармоник c среднее значение a и b.

Если вы хотите использовать nls (хотя это легко сделать без него), чтобы вам не приходилось искать для a или b, тогда попробуйте это:

o <- order(x)
dd <- na.omit(data.frame(x, y)[o, ])
b <- 800
f1 <- y ~ (a*b)/(a+b) + x
fm <- nls(f1, dd, start = list(a = 1))
plot(y ~ x, dd)
lines(fitted(fm) ~ x, dd, col = "red")
...