2013-06-14 15 views
5

Una misura mostra un segnale formato come una radice quadrata con offset e un fattore. Come posso trovare i coefficienti e tracciare i dati grezzi e la curva adattata in un grafico?Come adattare i dati con funzione non lineare e tracciare i dati e adattarli con ggplot()

require(ggplot2) 
require(nlmrt) # may be this will help later..? 

# generate simulated measurement data 

time <- seq(-10,20,0.2) 

signal <- sqrt(time + 2) # generate sqrt signal; includes some NA 
signal[is.na(signal)] <- 0 # set all NA to zero 
signal <- signal + rnorm(length(time)) * 0.1 # add noise 

df <- data.frame(x=time, y=signal) 

# find coefficiants for y ~ b * sqrt(x - a) 
# no idea how... 

# plot raw data and fitted curve in one ggplot diagram 

ggplot()+ 
    geom_point(data=df, aes(x=x, y=y)) 

enter image description here

+1

Solo un suggerimento, probabilmente vuole adattare 'y ~ b * sqrt (x - a)', al contrario di 'a + b * sqrt (c * x)'. –

+1

Se non si può specificare il punto di taglio * a priori * (cioè se si tratta di un parametro adattato), probabilmente lo si dovrà inserire separatamente (non si adatterebbe in un modello di modello lineare, e ci sono in particolare aspetti delicati per adattarsi ai tagli poiché la bontà dell'adattamento è piatta negli intervalli tra i punti dati). Se è possibile specificare il cutoff, penso che sia possibile costruire una variabile dummy e farlo ... –

+0

Come primo passo, posso definire manualmente una costante per il taglio. Più tardi mi piacerebbe trovare questo automatico. Ma questo potrebbe essere argomento di un'altra domanda allora. –

risposta

5

condizione di sapere dove il punto di divisione è e che il valore prima del punto di divisione è pari a zero:

sfun <- function(x,brk,a=1) { 
    ifelse(x<brk,0,suppressWarnings(a*sqrt(x-brk))) 
} 

(suppressWarnings() è lì perché ifelse valuta sia la se e la else casi per tutti i valori di x e non desideriamo avvisi relativi all'assunzione di squar e radice di numeri negativi)

di prova (non mostrata):

curve(sfun(x,1,1),from=0,to=10) ## test (not shown) 

simulare alcuni dati:

x <- seq(0,10,length=101) 
set.seed(1) 
y <- rnorm(length(x),sfun(x,1,1),sd=0.25) 
DF <- data.frame(x,y) 

Poiché tutti dobbiamo capire è come viene scalato la funzione di radice quadrata, possiamo fare questo con una regressione attraverso l'origine (prendere il -1 se si desidera consentire il valore al di sotto del punto di divisione per essere diverso da zero):

library("ggplot2") 
theme_set(theme_bw()) 
ggplot(DF,aes(x,y))+geom_point()+ 
    geom_smooth(method="lm", 
       formula=y~sfun(x,brk=1)-1) 
ggsave("truncsqrt.png") 

enter image description here

+0

oops, non ho nemmeno notato che avresti fornito il tuo codice di simulazione. Chiunque lo desideri può sentirsi libero di modificare nell'esempio dell'OP. –

+0

Perfetto! Come viene definita la larghezza della banda grigia? E posso anche ottenere i coefficienti come numeri? –

+1

la banda grigia rappresenta l'intervallo di confidenza del 95%. Se vuoi i coefficienti, fai 'lm (y ~ sfun (x, brk = 1) -1, data = DF)' –

Problemi correlati