2015-03-20 1 views
0

J'ai ajusté une courbe gaussienne aux données ci-dessous, et je voudrais calculer l'aire sous la courbe entre certaines valeurs de x (par exemple, de x = 6 à x = 18) . Le code ci-dessous produit l'erreur suivante: "Erreur dans f (x, c (m, s, a, b)): argument non utilisé (c (m, s, a, b))". En outre, j'ai quelques valeurs négatives et j'ai besoin de soustraire la zone négative du positif parce que je suis intéressé par la valeur 'nette'.intégrer la zone partielle sous la courbe dans 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, je sais comment Bü Il a changé la mise en forme de ma question pour montrer que ... – Rebecca

Répondre

0

En supposant que vos données sont dans les variables TimeOfDay et y, cela devrait fonctionner (je suppose courbe de loess fonctionnera pour vos besoins. Vous pouvez (nt) besoin de changer le modèle que vous équipons en fonction de vos données. selon le modèle, votre integrand va changer et il en sera le résultat !!)

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

J'ai suivi votre code mais en utilisant un ajustement gaussien au lieu de loess (code mis à jour ci-dessus), mais je Je reçois des erreurs lorsque j'essaie d'intégrer (erreur copier/coller dans la question mise à jour ci-dessus). – Rebecca

+0

Je viens de voir ça. Glad @BondedDust a aidé et cela fonctionne. – 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

fonctionne parfaitement - merci! – Rebecca