nls: цикл и разрыв в определенном количестве итераций - PullRequest
0 голосов
/ 22 апреля 2019

У меня как две последовательные операции над make:

1) Отрегулированы две модели nls в подмножестве;и 2) Зацикливание моделей только на количестве итераций = 1.

Для первого шага я делаю:

#Packages
library(minpack.lm)

# Data set - Diameter in function of Feature and Age
Feature<-sort(rep(c("A","B"),22))
Age<-c(60,72,88,96,27,
36,48,60,72,88,96,27,36,48,60,72,
88,96,27,36,48,60,27,27,36,48,60,
72,88,96,27,36,48,60,72,88,96,27,
36,48,60,72,88,96)
Diameter<-c(13.9,16.2,
19.1,19.3,4.7,6.7,9.6,11.2,13.1,15.3,
15.4,5.4,7,9.9,11.7,13.4,16.1,16.2,
5.9,8.3,12.3,14.5,2.3,5.2,6.2,8.6,9.3,
11.3,15.1,15.5,5,7,7.9,8.4,10.5,14,14,
4.1,4.9,6,6.7,7.7,8,8.2)
d<-dados <- data.frame(Feature,Age,Diameter)
str(d)

#Create a nls model (Levenberg-Marquardt  algoritm) for each Feature (A abd B)
e1<- Diameter ~ a1 * Age^a2 
Fecture_vec<-unique(d$Feature)
mod_ND <- list() #List for save each model
for(i in 1:length(Fecture_vec)){
     d2 <- subset(d, d$Feature == Fecture_vec[i])
     mod_ND[[i]] <-  nlsLM(e1, data = d2,
     start = list(a1 = 0.1, a2 = 10),
     control = nls.control(maxiter = 1000))
print(summary(mod_ND[[i]]))
}
#

Здесь пока все хорошо, но если я попытаюсь сделатьцикл с 999 симуляцией и перезапуск начальных значений с coef(mod_ND[[i]])[1] и coef(mod_ND[[i]])[2] и остановка, когда число итераций равно 1:

e1<- Diameter ~ a1 * Age^a2 
Fecture_vec<-unique(d$Feature)
mod_ND <- list() #List for save each model
for(i in 1:length(Fecture_vec)){
     d2 <- subset(d, d$Feature == Fecture_vec[i])
     mod_ND[[i]] <-  nlsLM(e1, data = d2,
     start = list(a1 = 0.1, a2 = 10),
     control = nls.control(maxiter = 1000))
Xs<-data.frame()
for(z in 1:999){
     d2 <- subset(d, d$Feature == Fecture_vec[i])
     mod_ND[[z]] <-  nlsLM(e1, data = d2,
     start = list(a1 = coef(mod_ND[[i]])[1], a2 = mod_ND[[i]])[2]),
     control = nls.control(maxiter = 1000))
   if (mod_ND[[z,c(finIter")]] <= 1){ break } ## Stop when iteractions =1
print(summary(mod_ND[[z]]))
}
}
#

Не работает !!Пожалуйста, есть идеи?

1 Ответ

0 голосов
/ 26 апреля 2019
#Packages
library(minpack.lm)
library(dplyr)

m<-function(d, a=0.01,b=10){

   mod<- nlsLM(Diameter ~ a1 * Age^a2,start = list(a1 = a, a2 = b),control = nls.control(maxiter = 1000), data = d)
   par1<- summary(mod)$coefficients[[1]]
    par2 <- summary(mod)$coefficients[[2]]
   print(summary(mod))

   if(mod$convInfo[["finIter"]]>1){    
       m(d,par1,par2)      
  }else{
       print(" --------Feature B-----------")
   }         
    }
list_models <- dlply(d,.(Feature),m)   
list_models
...