Ограничение вывода коэффициента с использованием модели соответствия или функции nls - PullRequest
0 голосов
/ 05 июня 2019

У меня есть данные о фотосинтетической активности микроводорослей при повышенном освещении.PAR: это различные значения освещенности, (x, независимая переменная) ETR: это фотосинтетическая активность (y, зависимая переменная).

PAR ETR
1   0.409090909
46  18.81818182
126 51.54545455
234 93.6
404 173.1428571
656 246
816 272

Мне удалось построить точку для образца и получить кривую.Но я хочу подогнать эти точки к конкретной нелинейной модели, используя следующую формулу: ETR = PAR / ((a PAR ^ 2) + (b PAR) + c) Я использовал функцию Nls как частьпакета мозаики, который использует функцию nls, как показано в коде:

TABLE=read.table("sample 2.txt", header = TRUE)
TABLE
plotPoints(ETR~PAR, data= TABLE)
f<-fitModel(ETR ~ PAR/((a*PAR^2)+(b*PAR)+c),data = TABLE, start = list(a=0, b=0.004, c=1))
coef(f)
plotFun(f, add=TRUE)

Мои результаты:

> TABLE=read.table("sample 2.txt", header = TRUE)
> TABLE
  PAR         ETR
1   1   0.4090909
2  46  18.8181818
3 126  51.5454546
4 234  93.6000000
5 404 173.1428571
6 656 246.0000000
7 816 272.0000000
> plotPoints(ETR~PAR, data= TABLE)
> f<-fitModel(ETR ~ PAR/((a*PAR^2)+(b*PAR)+c),data = TABLE, start = list(a=0, b=0.0035, c=1))
> coef(f)
            a             b             c 
 2.921397e-06 -2.027561e-03  2.718527e+00 
> plotFun(f, add=TRUE)

Проблема в том, что я не хочу иметь отрицательные значения для коэффи, б и в.Это потому, что мне понадобятся эти коэффициенты, чтобы получить биологические факторы ETRmax = 1 / b + 2ac, Ek = c / b + 2ac, alfa = 1 / c, которые не могут быть отрицательными.Мне также нужно использовать метод наименьших квадратов Гаусса-Ньютона, а не другие алгоритмы, в которых я могу указать нижнюю и верхнюю границы.Я пытался использовать алгоритм порта, чтобы задать нижние границы 0, но проблема в том, что b было 0, и я не хочу, чтобы b было 0, я хочу, чтобы все мои переменные были больше 0. Я пробовал много вещейно я не могу решить эту проблему.Я надеюсь, что вы можете помочь мне с этим, спасибо.

1 Ответ

0 голосов
/ 05 июня 2019

Укажите нижние границы с помощью lower = c(0, 0, 0), alg = "port":

fitModel(ETR ~ PAR/((a*PAR^2)+(b*PAR)+c), data = TABLE, 
  start = list(a = 0, b = 0.0035, c = 1), lower = c(0, 0, 0), alg = "port")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...