2013-06-14 10 views
5

Pomiar pokazuje sygnał utworzony jako pierwiastek kwadratowy z przesunięciem i współczynnikiem. Jak znaleźć współczynniki i wykreślić surowe dane i dopasowaną krzywą na jednym wykresie?Jak dopasować dane za pomocą funkcji nieliniowej i danych wykresu i dopasować za pomocą 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

Tylko podpowiedź, prawdopodobnie chcesz dopasować 'y ~ b * sqrt (x - a)', w przeciwieństwie do 'a + b * sqrt (c * x)'. –

+1

Jeśli nie możesz określić punktu odcięcia * a priori * (tzn. Czy jest to parametr dopasowany), prawdopodobnie będziesz musiał dopasować to osobno (nie pasowałoby to do modelu liniowego, a szczególnie trudne aspekty dopasowania odcięć, ponieważ dobroć dopasowania jest płaska w odstępach między punktami danych). Jeśli możesz określić wartość graniczną, to myślę, że możesz skonstruować zmienną ślepą i zrobić to ... –

+0

Jako pierwszy krok mogę ręcznie zdefiniować stałą dla odcięcia. Później chciałbym znaleźć to automatyczne. Ale to może być temat innego pytania. –

Odpowiedz

5

Pod warunkiem, że wie, gdzie wartości progowej jest i że wartość wcześniej wartości progowej wynosi zero:

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

(suppressWarnings() jest tam, ponieważ ifelse ocenia zarówno jeśli a else skrzynek dla wszystkich wartości x, a nie chcemy ostrzeżeń o przyjęciu kwadratu korzeń e liczb ujemnych)

Test (nie pokazano):

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

symulować pewne dane:

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) 

Ponieważ wszystko, czego potrzebujemy, aby dowiedzieć się, w jaki sposób funkcja pierwiastek kwadratowy jest skalowany, możemy to zrobić z regresją przez pochodzenie (jeśli chcesz, aby wartość poniżej punktu odcięcia była niezerowa):

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

Ups, nie zauważyłem nawet, że podałeś swój własny kod symulacyjny. Każdy, kto chce, może swobodnie edytować w przykładzie OP. –

+0

Idealnie! Jak zdefiniowano szerokość szarego pasma? Czy mogę nawet uzyskać współczynniki jako liczby? –

+1

szare pasmo to przedział ufności 95%. Jeśli chcesz mieć współczynniki, po prostu wykonaj 'lm (y ~ sfun (x, brk = 1) -1, data = DF)' –