Как исправить ошибку «особая матрица градиента при начальных оценках параметров» с помощью nls () для уравнения Ричардса - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь приспособить модель Ричардса в R для этих данных ниже, но не могу заставить ее работать.

time Volume
     3     12
     6     25
     9     38
    12     53
    15     73
    21    108
    27    136
    33    160
    39    180
    48    202
    60    222
    72    241
    96    255
Richards <- nls(
    Volume ~ (Vi*Vf)/((Vi^n) + ((Vf^n-(Vi^n))*exp(-u*time)))^(1/n), 
    data=dat1, 
    start=c(Vi=3, Vf=255, u=6, n=-0.5))

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 13 февраля 2020

Лучше использовать dput для предоставления данных, поскольку он быстрее попадает в R и сохраняет типы данных, такие как целое число и коэффициент:

dat1 <- structure(list(time = c(3L, 6L, 9L, 12L, 15L, 21L, 27L, 33L, 
    39L, 48L, 60L, 72L, 96L), Volume = c(12L, 25L, 38L, 53L, 73L, 
    108L, 136L, 160L, 180L, 202L, 222L, 241L, 255L)), class = "data.frame",
    row.names = c(NA, -13L))

Вот данные и кривая пытаясь соответствовать вашим начальным значениям:

plot(Volume~time, dat1)
Vi <- 3; Vf <- 255; u <- 6; n <- -0.5
Vol.pred <- (Vi*Vf)/((Vi^n) + ((Vf^n-(Vi^n))*exp(-u*dat1$time)))^(1/n)
lines(dat1$time, Vol.pred, col="red")

Вы можете увидеть, что предсказанная линия находится совсем рядом с данными. Как указал @Maurits Evers, неясно, подходит ли кривая Ричарда, но вы можете попробовать изменить начальные значения, чтобы приблизить что-то, например, изменив u на .05:

lines(dat1$time, Vol.pred, col="blue")

, что дает нам начальные значения, которые будут работать:

Richards <- nls(
   Volume ~ (Vi*Vf)/((Vi^n) + ((Vf^n-(Vi^n))*exp(-u*time)))^(1/n), 
   data=dat1, 
   start=c(Vi=3, Vf=255, u=.05, n=-0.5))
lines(dat1$time, predict(Richards), col="darkgreen")

NLS fit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...