[R-br] Loop para ajuste de nls reciclando os start values
Fernando Souza
nandodesouza em gmail.com
Qui Abr 25 19:11:26 -03 2019
Agora sim
Eis a minha solução, veja se lhe atende. A saída ta meio tosca (precisa melhorar) mas os resultados acredito que seja o que deseja.
library(minpack.lm)
library(plyr)
##Banco de dados
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)
modelo<-function(dados, a=0.01,b=10){
mod<- nlsLM(Diameter ~ a1 * Age^a2,start = list(a1 = a, a2 = b),control = nls.control(maxiter = 1000), data = dados)
par1<- summary(mod)$coefficients[[1]]
par2 <- summary(mod)$coefficients[[2]]
print(summary(mod))
if(mod$convInfo[["finIter"]]>1){
modelo(dados,par1,par2)
}else{
print(" --------Feature B-----------")
}
}
list_modelos <- dlply(d,.(Feature),modelo)
list_modelos
On Apr 25 2019, at 4:54 pm, ASANTOS <alexandre.santos em cas.ifmt.edu.br> wrote:
>
> Obrigado novamente Fernando,
> Mas se eu rodo um modelo para o subgrupo Feature ==A e um modelo para o subgrupo Featura==B e obtenho os parametros do modelo a1 e a2, e b1 e b2 respectivamente. Eu vou utilizar esses parâmetros para ajustar esses modelo novamente sobre os mesmos dados 999? Faz sentido isso? Acredito que você queira utilizar esses parâmetros como valores iniciais para outro conjunto de dados. Acredito que afunção nlsLM conte o número de interação para obter o melhor ajuste e limita um valor máximo para nao ficar rodando indefinidamente. Esta contagem é crescente não? Desculpe a pergunta mas estou tentando enteder a questão para propor um solução
> Resposta:
> São valores iniciais para o mesmo conjunto de dados o que eu quero, porque a função nls() faz se ajustada uma única vez:
> 1) Uso um intervalo de valores iniciais para chegar perto dos coeficientes ideais (no exemplo abaixo sem considerar o subset):
> mod1<-nlsLM(e1, data = d,
> start = list(a1 = 0.1, a2 = 10),
> control = nls.control(maxiter = 1000))
>
>
> Nonlinear regression model
> model: Diameter ~ a1 * Age^a2
> data: d
> a1 a2
> 5.845e-08 4.283e+00
> residual sum-of-squares: 1913
>
> Number of iterations till stop: 100
> Achieved convergence tolerance: 1.49e-08
> Reason stopped: Number of calls to `fcn' has reached or exceeded `maxfev' == 300
> 2) Depois utilizo os coeficientes do ajuste anterior novamente:
>
> mod2<-nlsLM(e1, data = d,
> start = list(a1 = 5.845e-08, a2 = 4.283e+000),
> control = nls.control(maxiter = 1000))
>
>
>
>
> Nonlinear regression model
> model: Diameter ~ a1 * Age^a2
> data: d
> a1 a2
> 0.3357 0.8376
> residual sum-of-squares: 271
>
> Number of iterations to convergence: 54
> Achieved convergence tolerance: 1.49e-08
>
> 3) Novamente:
> mod3<-nlsLM(e1, data = d,
> start = list(a1 = 0.3357, a2 =0.8376),
> control = nls.control(maxiter = 1000))
>
>
> Nonlinear regression model
> model: Diameter ~ a1 * Age^a2
> data: d
> a1 a2
> 0.3357 0.8376
> residual sum-of-squares: 271
>
> Number of iterations to convergence: 2
> Achieved convergence tolerance: 1.49e-08
>
> 4) Deu no exemplo acima 2 iteraçõe. Quero repetir até 1 iteração para ter uma ideia da estabilidade dos coeficientes!!!
>
>
>
>
>
>
>
>
>
>
>
>
> --
> ======================================================================
> Alexandre dos Santos
> Proteção Florestal
> IFMT - Instituto Federal de Educação, Ciência e Tecnologia de Mato Grosso
> Campus Cáceres
> Caixa Postal 244
> Avenida dos Ramires, s/n
> Bairro: Distrito Industrial
> Cáceres - MT CEP: 78.200-000
> Fone: (+55) 65 99686-6970 (VIVO) (+55) 65 3221-2674 (FIXO)
> e-mails:alexandresantosbr em yahoo.com.br (mailto:e-mails:alexandresantosbr em yahoo.com.br)
> alexandre.santos em cas.ifmt.edu.br (mailto:alexandre.santos em cas.ifmt.edu.br)
> Lattes: http://lattes.cnpq.br/1360403201088680
> OrcID: orcid.org/0000-0001-8232-6722 - ResearcherID: A-5790-2016
> Researchgate: www.researchgate.net/profile/Alexandre_Santos10 (http://www.researchgate.net/profile/Alexandre_Santos10)
> LinkedIn: br.linkedin.com/in/alexandre-dos-santos-87961635
> Mendeley:www.mendeley.com/profiles/alexandre-dos-santos6/
> ======================================================================
> Em 25/04/2019 13:22, Fernando Souza escreveu:
>
> >
> > Veja se entendi bem.
> > Mas se eu rodo um modelo para o subgrupo Feature ==A e um modelo para o subgrupo Featura==B e obtenho os parametros do modelo a1 e a2, e b1 e b2 respectivamente. Eu vou utilizar esses parâmetros para ajustar esses modelo novamente sobre os mesmos dados 999? Faz sentido isso? Acredito que você queira utilizar esses parâmetros como valores iniciais para outro conjunto de dados.
> > Os parametros a1 e a2 do modelo Feature==A e b1 e b2 do modelo Feature ==B são os melhores parametros do ajuste do modelos , ficar reajustando o modelo com esses parâmetros como valores iniciais, para o mesmo banco de dados, não alterarar o modelo em nada.
> >
> > "Sim isso não consegui colocar como condição, mas eu queria para quando a iteração para os dois modelos fosse igual a 1, ou n modelos se houverem."
> > Acredito que afunção nlsLM conte o número de interação para obter o melhor ajuste e limita um valor máximo para nao ficar rodando indefinidamente. Esta contagem é crescente não?
> > Desculpe a pergunta mas estou tentando enteder a questão para propor um solução
> >
> > On Apr 25 2019, at 12:46 pm, ASANTOS <alexandre.santos em cas.ifmt.edu.br> (mailto:alexandre.santos em cas.ifmt.edu.br) wrote:
> > >
> > > Obrigado pelo feedback Fernando,
> > > 1 - O loop de 999 vezes é para ajustar 999 modelos diferentes? Que parâmetro você altera em cada loop.
> > > O loop em 999 é para a cada vez que é realizado um ajuste, extrair os novos coeficientes coef(mod_ND[[i]])[1] e coef(mod_ND[[i]])[2] e os coloca no novo ajuste e repete isso n vezes até que a iteração de algum ajuste seja =1. Então necessariamente não precisa rodar 999 vezes, coloquei um número alto, mas imagino que a iteração igual a 1 venha a surgir antes.
> > > 2- "porém a cada vez que realiza o loop eu gostaria de reciclar os start values através da modificação em coef(mod_ND[[i]])[1] e coef(mod_ND[[i]])[2]." . O que você quer dizer com "Reciclar" --> modificar para qual valores?
> > > Reciclar é a cada novo ajuste utilizar como start values os coef(mod_ND[[i]])[1] e coef(mod_ND[[i]])[2] do ajuste anterior, a menos que a iteração seja igual a 1.
> > > 4- Explique melhor as interações: A condição para o loop parar é quando a iteração for igual a 1 para os dois modelos ( if (mod_ND[[z,c(finIter")]] <= ){ break } ## ).
> > > Sim isso não consegui colocar como condição, mas eu queria para quando a iteração para os dois modelos fosse igual a 1, ou n modelos se houverem.
> > > Baseada na sua resposta, que também eu não consegui ainda fazer funcionar, seria:
> > > # #Realizando os ajustes
> > > for(z in 1:999){
> > >
> > >
> > > modelo<-function(dados){
> > >
> > > mod_ND[[z]] < -summary(nlsLM(Diameter ~ a1 * Age^a2,start = list(a1 = 0.1, a2 = 10), control = nls.control(maxiter = 1000), data = dados))
> > >
> > > if (mod_ND[[z,c("finIter")]] <= 1){ break }
> > >
> > > }
> > >
> > > }
> > > list_modelos <- dlply(d,.(Feature),modelo)
> > >
> > > list_modelos
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > --
> > > ======================================================================
> > > Alexandre dos Santos
> > > Proteção Florestal
> > > IFMT - Instituto Federal de Educação, Ciência e Tecnologia de Mato Grosso
> > > Campus Cáceres
> > > Caixa Postal 244
> > > Avenida dos Ramires, s/n
> > > Bairro: Distrito Industrial
> > > Cáceres - MT CEP: 78.200-000
> > > Fone: (+55) 65 99686-6970 (VIVO) (+55) 65 3221-2674 (FIXO)
> > > e-mails:alexandresantosbr em yahoo.com.br (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/0?redirect=mailto%3Ae-mails%3Aalexandresantosbr%40yahoo.com.br&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > alexandre.santos em cas.ifmt.edu.br (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/1?redirect=mailto%3Aalexandre.santos%40cas.ifmt.edu.br&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > Lattes: http://lattes.cnpq.br/1360403201088680 (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/2?redirect=http%3A%2F%2Flattes.cnpq.br%2F1360403201088680&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > OrcID: orcid.org/0000-0001-8232-6722 - ResearcherID: A-5790-2016
> > > Researchgate: www.researchgate.net/profile/Alexandre_Santos10 (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/3?redirect=http%3A%2F%2Fwww.researchgate.net%2Fprofile%2FAlexandre_Santos10&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > LinkedIn: br.linkedin.com/in/alexandre-dos-santos-87961635
> > > Mendeley:www.mendeley.com/profiles/alexandre-dos-santos6/
> > > ======================================================================
> > > Em 25/04/2019 11:13, Fernando Souza escreveu:
> > >
> > > >
> > > > Alexandre , Algumas de suas explicações não estão muito claras para mim.
> > > > 1 - O loop de 999 vezes é para ajustar 999 modelos diferentes? Que parametro você altera em cada loop.
> > > > 2- "porém a cada vez que realiza o loop eu gostaria de reciclar os start values através da modificação em coef(mod_ND[[i]])[1] e coef(mod_ND[[i]])[2]." . O que você quer dizer com "Reciclar" --> modificar para qual valores?
> > > > 4- Explique melhor as interações: A condição para o loop parar é quando a iteração for igual a 1 para os dois modelos ( if (mod_ND[[z,c(finIter")]] <= ){ break } ## ).
> > > >
> > > > Acredito que a solução final para seu problema passe pela seguinte abordagem. No entanto preciso de mais esclarecimentos para melhorar.
> > > > library(minpack.lm)
> > > > library(plyr)
> > > >
> > > > ##Banco de dados
> > > > 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)
> > > >
> > > > # #Realizando os ajustes
> > > > modelo<-function(dados){
> > > >
> > > > }
> > > > list_modelos <- dlply(d,.(Feature),modelo)
> > > > list_modelos
> > > > On Apr 25 2019, at 10:53 am, ASANTOS por (R-br) <r-br em listas.c3sl.ufpr.br> (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/4?redirect=mailto%3Ar-br%40listas.c3sl.ufpr.br&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D) wrote:
> > > > > Prezados Membros,
> > > > >
> > > > > Gostaria de fazer um loop (999 vezes) para ajustar dois modelos nls
> > > > > (Diameter ~ a1 * Age^a2) à partir de um subset em função da minha
> > > > > variável Feature, porém a cada vez que realiza o loop eu gostaria de
> > > > > reciclar os start values através da modificação em coef(mod_ND[[i]])[1]
> > > > > e coef(mod_ND[[i]])[2]. A condição para o loop parar é quando a
> > > > > iteração for igual a 1 para os dois modelos ( if
> > > > > (mod_ND[[z,c(finIter")]] <= 1){ break } ## ). Bom, mas infelizmente não
> > > > > esta funcionando não, alguma ideia? Segue CRM:
> > > > >
> > > > > #Pacote
> > > > > library(minpack.lm)
> > > > >
> > > > > # Meu banco de dados onde tenho o Diameter das plantas em função de
> > > > > Feature e 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)
> > > > >
> > > > > #Realizando os ajustes
> > > > > e1<- Diameter ~ a1 * Age^a2
> > > > > Fecture_vec<-unique(d$Feature)
> > > > > mod_ND <- list() #List para salvar cada modelo
> > > > > 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 } ## Só para quando
> > > > > iteração = 1
> > > > > print(summary(mod_ND[[z]]))
> > > > > }
> > > > > }
> > > > > #
> > > > >
> > > > > Obrigado
> > > > >
> > > > >
> > > > > --
> > > > > ======================================================================
> > > > > Alexandre dos Santos
> > > > > Proteção Florestal
> > > > > IFMT - Instituto Federal de Educação, Ciência e Tecnologia de Mato Grosso
> > > > > Campus Cáceres
> > > > > Caixa Postal 244
> > > > > Avenida dos Ramires, s/n
> > > > > Bairro: Distrito Industrial
> > > > > Cáceres - MT CEP: 78.200-000
> > > > > Fone: (+55) 65 99686-6970 (VIVO) (+55) 65 3221-2674 (FIXO)
> > > > > e-mails:alexandresantosbr em yahoo.com.br (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/5?redirect=mailto%3Ae-mails%3Aalexandresantosbr%40yahoo.com.br&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > > > alexandre.santos em cas.ifmt.edu.br (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/6?redirect=mailto%3Aalexandre.santos%40cas.ifmt.edu.br&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > > > Lattes: http://lattes.cnpq.br/1360403201088680 (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/7?redirect=http%3A%2F%2Flattes.cnpq.br%2F1360403201088680&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > > > OrcID: orcid.org/0000-0001-8232-6722 - ResearcherID: A-5790-2016
> > > > > Researchgate: www.researchgate.net/profile/Alexandre_Santos10 (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/8?redirect=http%3A%2F%2Fwww.researchgate.net%2Fprofile%2FAlexandre_Santos10&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > > > LinkedIn: br.linkedin.com/in/alexandre-dos-santos-87961635
> > > > > Mendeley:www.mendeley.com/profiles/alexandre-dos-santos6/
> > > > > ======================================================================
> > > > >
> > > > > _______________________________________________
> > > > > R-br mailing list
> > > > > R-br em listas.c3sl.ufpr.br (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/9?redirect=mailto%3AR-br%40listas.c3sl.ufpr.br&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > > > https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/10?redirect=https%3A%2F%2Flistas.inf.ufpr.br%2Fcgi-bin%2Fmailman%2Flistinfo%2Fr-br&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)
> > > > > Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia (https://link.getmailspring.com/link/522C999C-97DC-4281-AAE7-236E9F648D2E@getmailspring.com/11?redirect=http%3A%2F%2Fwww.leg.ufpr.br%2Fr-br-guia&recipient=YWxleGFuZHJlLnNhbnRvc0BjYXMuaWZtdC5lZHUuYnI%3D)) e fornea cdigo mnimo reproduzvel.
> > > > >
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20190425/319c3b0a/attachment-0001.html>
Mais detalhes sobre a lista de discussão R-br