2015-03-20 2 views
0

Я подобрал гауссовую кривую к приведенным ниже данным, и я хотел бы рассчитать площадь под кривой между некоторыми значениями x (например, от x = 6 до x = 18) , В приведенном ниже коде появляется следующая ошибка: «Ошибка в f (x, c (m, s, a, b)): неиспользуемый аргумент (c (m, s, a, b))». Кроме того, у меня есть несколько отрицательных значений и нужно вычесть отрицательную область из положительного, потому что меня интересует значение «нетто».интегрировать частичную область под кривой в R

x <- c(12.88, 12.9, 8.35, 10.52, 10.45, 8.44, 9.01, 9.96, 9.82, 9.83, 10.65, 10.69, 15.3, 15.33, 12.41, 12.43, 8.36, 8.43, 9.29, 9.25, 14.78, 14.87, 16.17, 16.23, 3.59, 4.37, 3.88, 19.88, 20.71, 20.33, 21.25, 22.09) 
y<-c(10.8, 9.62, 11.76, 5.12, 9.63, 4.80, 11.09, 7.42, 7.79, 9.76, 9.71, 8.13, 14.4, 14.85, 12.84, 11.59, 7.0, 6.49, 5.94, 4.93, 6.43, 7.8, 3.81, 2.6, -0.93, 5.3, 1.08, 0.39, -0.59, 2.77, 3.5, -2.08) 
df<-data.frame(x, y) 

#Define a Gaussian function (Y=Amplitude*exp(-0.5*((X-Mean)/SD)^2) + Baseline) 
f<-function(x, theta) { 
    m<-theta[1]; s<-theta[2]; a<-theta[3]; b<-theta[4]; 
    a*exp(-0.5*((x-m)/s)^2) + b 
} 

fit<-nls(y~f(x,c(m,s,a,b)), data.frame(x,y), start=list(m=12, s=5, a=12, b=-2)) 
xs<-seq(0,24,l=1000) 
f<-function(x) predict(fit,newdata=data.frame(x=xs)) 
integrate(f,6,18) 
+0

@BondedDust, я знаю, как бу ild и «брать babysteps» в R .... Я изменил форматирование моего вопроса, чтобы продемонстрировать это .... – Rebecca

ответ

0

Если предположить, что данные в переменных TimeOfDay и y, это должно работать (я предполагаю, что кривая лесс будет работать для ваших нужд. Вы можете (будет) необходимо изменить модель вы фитинга на основе ваших данных. в зависимости от модели, ваш подынтегральная изменится и так будет ваш результат !!)

df <- data.frame(TimeOfDay,y) 
df <- df[order(df$TimeOfDay),] 
l <- loess(y ~ TimeOfDay, df, control=loess.control(surface="direct")) 
f <- function(x) predict(l,newdata = x) 

integrate(f,2,3) #you can specify between what times you want to integrate here 

plot(df) 
lines(l) 

the plot resulting from your data

+1

Я следил за вашим кодом, но использовал gaussian fit вместо leess (обновленный код выше), но я Я получаю ошибки, когда пытаюсь интегрироваться (ошибка копируется/вставлена ​​в обновленный вопрос выше). – Rebecca

+0

Просто увидел это. Glad @BondedDust помог, и он работает. – ConfusedMan

0
> fit 
Nonlinear regression model 
    model: y ~ f(x, c(m, s, a, b)) 
    data: data.frame(x, y) 
    m  s  a  b 
12.423 4.922 11.949 -1.696 
residual sum-of-squares: 244.6 

Number of iterations to convergence: 11 
Achieved convergence tolerance: 7.947e-06 
#--------------------------------- 
integrate(function(x){ 
     11.949*exp(-0.5*((x-12.423)/4.922)^2) -1.696} 
     ,6,18) 
# 93.96736 with absolute error < 1e-12 
+0

отлично работает - спасибо! – Rebecca

Смежные вопросы