Me encontré con un problema interesante pero bastante molesto.R: Integrar: Número máximo de subdivisiones alcanzadas, error de redondeo
Estoy tratando de integrar una función que se ha calculado a partir de un conjunto de datos. Los datos se pueden encontrar aquí: Link to sample.txt.
Empiezo por ajustar una línea a mis datos. esto se puede hacer de forma lineal con approxfun
o no lineal con splinefun
. En mi ejemplo a continuación, uso este último. Ahora, cuando intento de integrar la función ajustada corro en el error
maximum number of subdivisions reached
pero cuando puedo aumentar la subdivisión consigo
roundoff error
De los valores en mi código de muestra, puede ver eso para esta información específica establecer el umbral es 754-> 755.
Mi colega no tiene problemas para integrar este conjunto de datos en Matlab. ¿Hay alguna manera de manipular mis datos para integrarlos? ¿Hay otro método para la integración numérica en R?
data<-read.table('sample.txt',sep=',')
colnames(data)<-c('wave','trans')
plot(data$wave,data$trans,type='l')
trans<- -1 * log(data$trans)
plot(data$wave,trans,type='l')
fx.spline<-splinefun(data$wave,trans)
#Try either
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave))
#Above: Number of subdivision reached
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave),subdivisions=754)
#Above: Number of subdivision reached
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave),subdivisions=755)
#Above: Roundoff error
Considere publicar la función ajustada. No parece que obtenga estimaciones de parámetros, aunque tal vez no sea así como funciona splinefun, o estoy haciendo algo mal. –
Tus datos se ven espectacularmente "planos", así que tal vez llamar a "integrar" y establecer el límite de conversión a algo así como 1e-9 a través de los argumentos 'rel.tol' y' abs.tol' te darán una respuesta que es bastante precisa. –
@MarkMiller Hay un buen tutorial aquí: http://casoilresource.lawr.ucdavis.edu/drupal/node/896. Para graficar la función puede escribir 'plot (data $ wave, fx.spline (data $ wave), type = 'l')' –