Eric
2012-Jan-17 21:12 UTC
[R-es] Problema para integrar una funcion ajustada a un conjunto de datos con la instruccion sm.density(x)
Estimada comunidad, nuevamente con algo que no se como hacer en R, pero aprendiendo .... El problema es el siguiente: 1. tengo un conjunto de 10 mil datos (n) cuyo valor va entre 0 y 10.000 a los que aplico una funcion sm.density() para obtener una especie de histograma pero con una curva que parece continua. 2. Una vez que obtengo esa curva necesito calcular el area bajo la curva en ciertos intervalos, esto equivale a aplicar una integral en esos intervalos. He intentado hacerlo de la siguiente forma: integrand <- function(x){sm.density(x)} lim02ene.via <- integrand(compara.tiempos2[,1]) int.lim02ene.via <- integrate(lim02ene.via, -Inf, Inf) pero obtengo el siguiente error: Error in get(as.character(FUN), mode = "function", envir = envir) : object ''lim02ene.via'' of mode ''function'' was not found buscando encontre que la funcion a integrar debe ser "vectorizable" y que para eso se puede aplicar la funcion "vectorize", pero sigo obteniendo el mismo error, el problema parece ser que el resultado de aplicar la funcion sm.density no es una funcion si no un conjunto de muchos puntos (x.y) ... entonces. como puedo hacer para calcular un area bajo la curva obtenida con sm.density() ??? Muchas gracias por su tiempo y ayuda ... Eric Concha M. -- Nota: las tildes se han omitido para evitar conflictos con algunos lectores de correo. * Un economista es un experto que sabrá mañana por qué las cosas que predijo ayer no han sucedido hoy (Laurence Peter). * SATYÂT NÂSTI PARO DHARMAH [[alternative HTML version deleted]]
Carlos J. Gil Bellosta
2012-Jan-17 23:15 UTC
[R-es] Problema para integrar una funcion ajustada a un conjunto de datos con la instruccion sm.density(x)
Hola, ¿qué tal? La función integrate necesita como argumento una función. La salida de la función density no es una función: es un objeto que, entre otras cosas, contiene x <- rnorm( 1000 ) densidad <- density( x ) str( densidad ) List of 7 $ x : num [1:512] -3.65 -3.63 -3.62 -3.6 -3.59 ... $ y : num [1:512] 3.50e-05 4.30e-05 5.25e-05 6.37e-05 7.70e-05 ... $ bw : num 0.221 $ n : int 1000 $ call : language density.default(x = x) $ data.name: chr "x" $ has.na : logi FALSE - attr(*, "class")= chr "density" los objetos x e y que son, por decirlo de alguna manera, "puntos por los que pasa la función de densidad". Tienes la opción de convertir esos puntos en una función que luego puedes integrar con integrate usando, si no quieres complicarte la vida, rectángulos o trapecios. Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com El día 17 de enero de 2012 22:12, Eric <ericconchamunoz en gmail.com> escribió:> Estimada comunidad, nuevamente con algo que no se como hacer en R, pero > aprendiendo .... > > El problema es el siguiente: > 1. tengo un conjunto de 10 mil datos (n) cuyo valor va entre 0 y 10.000 a > los que aplico una funcion sm.density() para obtener una especie de > histograma pero con una curva que parece continua. > 2. Una vez que obtengo esa curva necesito calcular el area bajo la curva en > ciertos intervalos, esto equivale a aplicar una integral en esos > intervalos. He intentado hacerlo de la siguiente forma: > integrand <- function(x){sm.density(x)} > lim02ene.via <- integrand(compara.tiempos2[,1]) > int.lim02ene.via <- integrate(lim02ene.via, -Inf, Inf) > > pero obtengo el siguiente error: > > Error in get(as.character(FUN), mode = "function", envir = envir) : > object 'lim02ene.via' of mode 'function' was not found > > buscando encontre que la funcion a integrar debe ser "vectorizable" y que > para eso se puede aplicar la funcion "vectorize", pero sigo obteniendo el > mismo error, el problema parece ser que el resultado de aplicar la funcion > sm.density no es una funcion si no un conjunto de muchos puntos (x.y) ... > entonces. > > como puedo hacer para calcular un area bajo la curva obtenida con > sm.density() ??? > > Muchas gracias por su tiempo y ayuda ... > > Eric Concha M. > > > > > > -- > Nota: las tildes se han omitido para evitar conflictos con algunos lectores > de correo. > > * Un economista es un experto que sabrá mañana por qué las cosas que predijo > ayer no han sucedido hoy (Laurence Peter). > > * SATYÂT NÂSTI PARO DHARMAH > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >
Carlos Ortega
2012-Jan-17 23:29 UTC
[R-es] Problema para integrar una funcion ajustada a un conjunto de datos con la instruccion sm.density(x)
Hola, Esto se aproxima más a lo que debieras de utilizar: sm.density() es una lista y de lo que devuelve te interesa realmente el conjunto "estimate". Y este conjunto ahora lo tienes que convertir en función para que pueda utilizarlo integrate(). La forma de hacerlo es con Vectorize(). Siguiendo todo esto:> integrand <- function(x){sm.density(x)}> > lim02ene.via <- integrand(rnorm(50))$estimate> > foo<- function(x) lim02ene.via> > int.lim02ene.via <- integrate(Vectorize(foo), 0, 100)Error en integrate(Vectorize(foo), 0, 100) :evaluation of function gave a result of wrong length> Que como ves da otro mensaje de error que viene descrito en la propia ayuda de integrate() pero que no proporciona claves para resolver... Sigo mirando. Saludos, Carlos Ortega www.qualityexcellence.es El 17 de enero de 2012 22:12, Eric <ericconchamunoz@gmail.com> escribió:> Estimada comunidad, nuevamente con algo que no se como hacer en R, pero > aprendiendo .... > > El problema es el siguiente: > 1. tengo un conjunto de 10 mil datos (n) cuyo valor va entre 0 y 10.000 a > los que aplico una funcion sm.density() para obtener una especie de > histograma pero con una curva que parece continua. > 2. Una vez que obtengo esa curva necesito calcular el area bajo la curva en > ciertos intervalos, esto equivale a aplicar una integral en esos > intervalos. He intentado hacerlo de la siguiente forma: > integrand <- function(x){sm.density(x)} > lim02ene.via <- integrand(compara.tiempos2[,1]) > int.lim02ene.via <- integrate(lim02ene.via, -Inf, Inf) > > pero obtengo el siguiente error: > > Error in get(as.character(FUN), mode = "function", envir = envir) : > object ''lim02ene.via'' of mode ''function'' was not found > > buscando encontre que la funcion a integrar debe ser "vectorizable" y que > para eso se puede aplicar la funcion "vectorize", pero sigo obteniendo el > mismo error, el problema parece ser que el resultado de aplicar la funcion > sm.density no es una funcion si no un conjunto de muchos puntos (x.y) ... > entonces. > > como puedo hacer para calcular un area bajo la curva obtenida con > sm.density() ??? > > Muchas gracias por su tiempo y ayuda ... > > Eric Concha M. > > > > > > -- > Nota: las tildes se han omitido para evitar conflictos con algunos lectores > de correo. > > * Un economista es un experto que sabrá mañana por qué las cosas que > predijo > ayer no han sucedido hoy (Laurence Peter). > > * SATYÂT NÂSTI PARO DHARMAH > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]
Carlos Ortega
2012-Jan-18 00:13 UTC
[R-es] Problema para integrar una funcion ajustada a un conjunto de datos con la instruccion sm.density(x)
Hola, Había un error en la definición de la función que había hecho y la función que he utilizado como ejemplo (rnorm = distribución normal) presenta problemas a la hora de integrarla en los extremos... De esta forma sí que calcula la integral con el ejemplo que he utilizado:> > integrand <- function(x){sm.density(x)}> > lim02ene.via <- integrand(rnorm(1000))$estimate> > foo<- function(x) lim02ene.via*[x]*> > integrate(Vectorize(foo), 0.999, 99.999, subdivisions=1000)10.70249 with absolute error < 0.0011>El error en la función venía porque antes foo no era una función univaluada (lim02ene.via es un vector de longitud 100, porque esa es la longitud del elemento de la lista sn.density()$estimate). Declarándolo de esta forma (lim02ene.via[x], para cada valor de "x", foo(x) devuelve el valor en la posición "x" de lim02ene.via. Y por otro lado, también se producía un error por el comportamiento de rnorm en sus extremos. Como indica la ayuda de la función integrate(): "Like all numerical integration routines, these evaluate the function on a finite set of points. *If the function is approximately constant (in particular, zero) over nearly all its range it is possible that the result and error estimate may be seriously wrong.*" Y justamente al utilzar la función rnorm, en los extremos (0 y 100) su valor es muy próximo a cero. En el ejemplo con valores ligeramente inferiores a 1 y muy cercanos a 100, integrate es capaz de calcular, pero si pruebas con 0 y 100 entonces no funciona. Para tu caso particular: 1. Prueba directamente: integrand <- function(x){sm.density(x)} lim02ene.via <- integrand(rnorm(1000))$estimate foo<- function(x) lim02ene.via[x] integrate(Vectorize(foo), -Inf, Inf) 2. Si obtienes error, entonces mira el comportamiento de "lim02ene.via" por si hay singularidades, valores muy próximos a cero o discontinuidades... Si tiene estas anomalías, entonces integra "lim02ene.via" a trozos en vez de hacerlo entre -Inf e Inf. Saludos, Carlos Ortega www.qualityexcellence.es El 18 de enero de 2012 00:29, Carlos Ortega <cof@qualityexcellence.es>escribió:> Hola, > > Esto se aproxima más a lo que debieras de utilizar: > > > sm.density() es una lista y de lo que devuelve te interesa realmente el > conjunto "estimate". > Y este conjunto ahora lo tienes que convertir en función para que pueda > utilizarlo integrate(). La forma de hacerlo es con Vectorize(). > > Siguiendo todo esto: > > > > integrand <- function(x){sm.density(x)}> > lim02ene.via <- integrand(rnorm(50))$estimate> > foo<- function(x) lim02ene.via> > int.lim02ene.via <- integrate(Vectorize(foo), 0, 100)Error en integrate(Vectorize(foo), 0, 100) : > evaluation of function gave a result of wrong length> > > > Que como ves da otro mensaje de error que viene descrito en la propia > ayuda de integrate() pero que no proporciona claves para resolver... > Sigo mirando. > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > > El 17 de enero de 2012 22:12, Eric <ericconchamunoz@gmail.com> escribió: > >> Estimada comunidad, nuevamente con algo que no se como hacer en R, pero >> aprendiendo .... >> >> El problema es el siguiente: >> 1. tengo un conjunto de 10 mil datos (n) cuyo valor va entre 0 y 10.000 a >> los que aplico una funcion sm.density() para obtener una especie de >> histograma pero con una curva que parece continua. >> 2. Una vez que obtengo esa curva necesito calcular el area bajo la curva >> en >> ciertos intervalos, esto equivale a aplicar una integral en esos >> intervalos. He intentado hacerlo de la siguiente forma: >> integrand <- function(x){sm.density(x)} >> lim02ene.via <- integrand(compara.tiempos2[,1]) >> int.lim02ene.via <- integrate(lim02ene.via, -Inf, Inf) >> >> pero obtengo el siguiente error: >> >> Error in get(as.character(FUN), mode = "function", envir = envir) : >> object ''lim02ene.via'' of mode ''function'' was not found >> >> buscando encontre que la funcion a integrar debe ser "vectorizable" y que >> para eso se puede aplicar la funcion "vectorize", pero sigo obteniendo el >> mismo error, el problema parece ser que el resultado de aplicar la funcion >> sm.density no es una funcion si no un conjunto de muchos puntos (x.y) ... >> entonces. >> >> como puedo hacer para calcular un area bajo la curva obtenida con >> sm.density() ??? >> >> Muchas gracias por su tiempo y ayuda ... >> >> Eric Concha M. >> >> >> >> >> >> -- >> Nota: las tildes se han omitido para evitar conflictos con algunos >> lectores >> de correo. >> >> * Un economista es un experto que sabrá mañana por qué las cosas que >> predijo >> ayer no han sucedido hoy (Laurence Peter). >> >> * SATYÂT NÂSTI PARO DHARMAH >> >> [[alternative HTML version deleted]] >> >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> >[[alternative HTML version deleted]]
Eric
2012-Jan-18 15:16 UTC
[R-es] Problema para integrar una funcion ajustada a un conjunto de datos con la instruccion sm.density(x)
Perfecto, muchas gracias a todos por su tiempo y sugerencias, estoy probando las alternativas propuestas y ademas probando a hacer rectangulos como propuso carlos gil, pero de base 1 asi es mas facil pues no hay que agrupar, en otras palabras estoy calculando la frecuencia relativa real de cada valor de X ... esto se ve muy facilitado por el uso de vectores en R. Muchas gracias por las sugerencias. Eric. 2012/1/17 Carlos Ortega <cof@qualityexcellence.es>> Perdón... > > Tu función original no es rnrom().. > En tu caso sería: > > integrand <- function(x){sm.density(x)} > lim02ene.via <- integrand(*compara.tiempos2[,1]*)$estimate > foo<- function(x) lim02ene.via[x] > integrate(Vectorize(foo), -Inf, Inf) > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > El 18 de enero de 2012 01:13, Carlos Ortega <cof@qualityexcellence.es>escribió: > > Hola, >> >> Había un error en la definición de la función que había hecho y la >> función que he utilizado como ejemplo (rnorm = distribución normal) >> presenta problemas a la hora de integrarla en los extremos... >> >> De esta forma sí que calcula la integral con el ejemplo que he utilizado: >> >> > > integrand <- function(x){sm.density(x)}> > lim02ene.via <- integrand(rnorm(1000))$estimate> > foo<- function(x) lim02ene.via*[x]*> > integrate(Vectorize(foo), 0.999, 99.999, subdivisions=1000)10.70249 with absolute error < 0.0011 >> >> > >> >> El error en la función venía porque antes foo no era una función >> univaluada (lim02ene.via es un vector de longitud 100, porque esa es la >> longitud del elemento de la lista sn.density()$estimate). Declarándolo de >> esta forma (lim02ene.via[x], para cada valor de "x", foo(x) devuelve el >> valor en la posición "x" de lim02ene.via. >> >> Y por otro lado, también se producía un error por el comportamiento de >> rnorm en sus extremos. Como indica la ayuda de la función integrate(): >> >> "Like all numerical integration routines, these evaluate the function on >> a finite set of points. *If the function is approximately constant (in >> particular, zero) over nearly all its range it is possible that the result >> and error estimate may be seriously wrong.*" >> >> Y justamente al utilzar la función rnorm, en los extremos (0 y 100) su >> valor es muy próximo a cero. >> En el ejemplo con valores ligeramente inferiores a 1 y muy cercanos a >> 100, integrate es capaz de calcular, pero si pruebas con 0 y 100 entonces >> no funciona. >> >> Para tu caso particular: >> 1. Prueba directamente: >> >> integrand <- function(x){sm.density(x)} >> lim02ene.via <- integrand(rnorm(1000))$estimate >> foo<- function(x) lim02ene.via[x] >> integrate(Vectorize(foo), -Inf, Inf) >> >> 2. Si obtienes error, entonces mira el comportamiento de "lim02ene.via" >> por si hay singularidades, valores muy próximos a cero o >> discontinuidades... Si tiene estas anomalías, entonces integra >> "lim02ene.via" a trozos en vez de hacerlo entre -Inf e Inf. >> >> Saludos, >> Carlos Ortega >> www.qualityexcellence.es >> >> >> El 18 de enero de 2012 00:29, Carlos Ortega <cof@qualityexcellence.es>escribió: >> >> Hola, >>> >>> Esto se aproxima más a lo que debieras de utilizar: >>> >>> >>> sm.density() es una lista y de lo que devuelve te interesa realmente el >>> conjunto "estimate". >>> Y este conjunto ahora lo tienes que convertir en función para que pueda >>> utilizarlo integrate(). La forma de hacerlo es con Vectorize(). >>> >>> Siguiendo todo esto: >>> >>> >>> > integrand <- function(x){sm.density(x)}> > lim02ene.via <- integrand(rnorm(50))$estimate> > foo<- function(x) lim02ene.via> > int.lim02ene.via <- integrate(Vectorize(foo), 0, 100)Error en integrate(Vectorize(foo), 0, 100) : >>> evaluation of function gave a result of wrong length> >>> >>> >>> Que como ves da otro mensaje de error que viene descrito en la propia >>> ayuda de integrate() pero que no proporciona claves para resolver... >>> Sigo mirando. >>> >>> Saludos, >>> Carlos Ortega >>> www.qualityexcellence.es >>> >>> >>> >>> El 17 de enero de 2012 22:12, Eric <ericconchamunoz@gmail.com> escribió: >>> >>>> Estimada comunidad, nuevamente con algo que no se como hacer en R, pero >>>> aprendiendo .... >>>> >>>> El problema es el siguiente: >>>> 1. tengo un conjunto de 10 mil datos (n) cuyo valor va entre 0 y 10.000 >>>> a >>>> los que aplico una funcion sm.density() para obtener una especie de >>>> histograma pero con una curva que parece continua. >>>> 2. Una vez que obtengo esa curva necesito calcular el area bajo la >>>> curva en >>>> ciertos intervalos, esto equivale a aplicar una integral en esos >>>> intervalos. He intentado hacerlo de la siguiente forma: >>>> integrand <- function(x){sm.density(x)} >>>> lim02ene.via <- integrand(compara.tiempos2[,1]) >>>> int.lim02ene.via <- integrate(lim02ene.via, -Inf, Inf) >>>> >>>> pero obtengo el siguiente error: >>>> >>>> Error in get(as.character(FUN), mode = "function", envir = envir) : >>>> object ''lim02ene.via'' of mode ''function'' was not found >>>> >>>> buscando encontre que la funcion a integrar debe ser "vectorizable" y >>>> que >>>> para eso se puede aplicar la funcion "vectorize", pero sigo obteniendo >>>> el >>>> mismo error, el problema parece ser que el resultado de aplicar la >>>> funcion >>>> sm.density no es una funcion si no un conjunto de muchos puntos (x.y) >>>> ... >>>> entonces. >>>> >>>> como puedo hacer para calcular un area bajo la curva obtenida con >>>> sm.density() ??? >>>> >>>> Muchas gracias por su tiempo y ayuda ... >>>> >>>> Eric Concha M. >>>> >>>> >>>> >>>> >>>> >>>> -- >>>> Nota: las tildes se han omitido para evitar conflictos con algunos >>>> lectores >>>> de correo. >>>> >>>> * Un economista es un experto que sabrá mañana por qué las cosas que >>>> predijo >>>> ayer no han sucedido hoy (Laurence Peter). >>>> >>>> * SATYÂT NÂSTI PARO DHARMAH >>>> >>>> [[alternative HTML version deleted]] >>>> >>>> >>>> _______________________________________________ >>>> R-help-es mailing list >>>> R-help-es@r-project.org >>>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>>> >>>> >>> >> >-- Nota: las tildes se han omitido para evitar conflictos con algunos lectores de correo. * Un economista es un experto que sabrá mañana por qué las cosas que predijo ayer no han sucedido hoy (Laurence Peter). * SATYÂT NÂSTI PARO DHARMAH [[alternative HTML version deleted]]