Regressão segmentada!

Bom dia senhores!! Estou encontrando um problema no ajuste de uma regressão segmentada, e não estou encontrando onde está este problema. Já fiz vários ajustes deste tipo, mais com este modelo particularmente tem alguma coisa errada que não sei onde é. No estudo dos pontos de chutes, o erro é claro, mais não estou sabendo como contornar. Deveria haver três segmentos, mais pelo estudo com janelas interativas, parece haver 5 segmentos. Se alguém puder ajudar, agradeço desde já. Segue um CMR. x <- c(0,0,0,10,10,10,20,20,20,35,35,35) y <- c(7.77, 7.81, 7.81, 7.60, 7.67, 7.65, 7.60, NA, 7.66, 7.60, 7.42, 7.50) segment_lpl <- function(x,b0,b1,b2,K,X0,X1){ (b0+b1*x)*(x<=X0)+ (K)*(X0<x & x<X1)+ (b0+b1*X0-b2*(X1-x))*(x>=X1) } teste <- nls(y ~ segment_lpl(x,b0,b1,b2,K,X0,X1), start=list(b0=7.8,b1=-0.02,b2=-0.01,K=7.5,X0=10,X1=20)) library(gWidgetsRGtk2) limits <- list(b0=c(7,8), b1=c(-0.05,0), b2=c(-0.04,0), K=c(7,8), X0=c(8,10), X1=c(18,25)) start <- list() # lista com os valores para chute #----------------------------------------------------------------------------- #função que será atualizada a cada movimento do deslizador #parâmetros dentro de svalue() são controlados, nomes igual aos da lista plot.chute <- function(...){ #faz o gráfico de dispersão plot(y ~ x) #sobrepõe a curva com os valores dos deslizadores curve(segment_lpl(x, svalue(b0), svalue(b1), svalue(b2), svalue(K),svalue(X0), svalue(X1)), add=TRUE, col=2) #reescreve o start com os valores dos delizadores, para usar na nls() start <- list(b0=svalue(b0), b1=svalue(b1), b2=svalue(b2), K=svalue(K), X0=svalue(X0), X1=svalue(X1)) } #----------------------------------------------------------------------------- #criação da janela com deslizadores #na primeira chamada escolher uma das opções (sempre escolho a 1) #Select a GUI toolkit #essa função pode estar num arquivo fn.R e carregada com source("fn.R") w <- gwindow("Caixa com deslizadores para controlar parâmetros") tbl <- glayout(cont=w) for(i in 1:length(limits)){ tbl[i,1] <- paste("Controle", names(limits)[i]) tbl[i,2, expand=TRUE] <- (assign(names(limits)[i], gslider(from=limits[[i]][1], to=limits[[i]][2], by=diff(limits[[i]])/20, value=mean(limits[[i]]), container=tbl, handler=plot.chute))) } # #----------------------------------------------------------------------------- #agora com a caixa criada, basta chamar a função e mover os deslizadores plot.chute() (S,P,f) Allaman \begin{signature} <<>>= Prof. Dr. Ivan Bezerra Allaman Universidade Estadual de Santa Cruz Departamento de Ciências Exatas e Tecnológicas Ilhéus/BA - Brasil Fone: +55 73 3680-5076 E-mail: ivanalaman@yahoo.com.br/ivanalaman@gmail.com @ \end{signature}
participantes (1)
-
Ivan Bezerra Allaman