miércoles, 29 de mayo de 2019

COMPUTACIÓN NUMÉRICA CON R


COMPUTACIÓN NUMÉRICA CON R
Ing. Luis Manfredo Reyes Chávez
R es actualmente el lenguaje  estadístico más utilizado en el mundo académico y de investigación, primero por su potencia de procesamiento, y en segundo lugar por ser un software libre.

R  puede ser descargado del siguiente sitio: http://www.r-project.org/
Existen versiones para Windows, Mac, Linux y Android

UN ERROR MUY COMUN POR TODOS LADOS ES: HAY GENTE QUE CREE QUE R ES UN PAQUETE ESTADÍSTICO (COMO SAS O SPSS).

Por ser un lenguaje y no un paquete, R tiene capacidades para muchos procesos, pero se debe reconocer que quizá donde más se le ha utilizado es en el campo de la estadística.
Una de las ventajas de R, es la enorme cantidad de librerías (o paquetes), que han sido desarrolladas para ampliar sus capacidades.

La computación simbólica, aunque se puede realizar con una interfase a otros programas matemáticos, no es el fuerte de R.

Si se necesita un poder de computación simbólica, es mejor usar paquetes libres que sí poseen esas capacidades, por ejemplo MAXIMA O REDUCE, que están disponibles sin costo en el sitio del proyecto GNU.

Tampoco es el objeto del presente documento profundizar en cada una de las funciones existentes en R para cómputo numérico, ya sean nativas o incorporadas en librerías. Se pretende realizar un recorrido por las capacidades disponibles, y posteriormente se profundizará en temas específicos.

La siguiente discusión es una traducción y adaptación del documento: Numerical Mathematics, disponible en:  
https://cran.r-project.org/web/views/NumericalMathematics.html

Algebra Lineal Numérica
Como las estadísticas se basan en gran medida en el álgebra lineal, muchas rutinas numéricas de álgebra lineal están presentes en R, y algunas solo de forma implícita. 
Ejemplos de funciones explícitamente disponibles son: operaciones de vectores y matrices, descomposiciones matriciales (QR), resolución de ecuaciones lineales, valores propios / vectores, descomposición de valores singulares o aproximación de mínimos cuadrados.
Paquetes contribuídos para Algebra lineal numérica
  •  Matrix proporciona clases y métodos para matrices densas y dispersas y operaciones en ellas, por ejemplo, descomposición de Cholesky y Schur, matriz exponencial, o normas y números condicionales para matrices dispersas.
  • MASS agrega inversos generalizados (Penrose) y espacios nulos de matrices.
  • expm calcula el exponencial, el logaritmo y la raíz cuadrada de las matrices cuadradas, pero también las potencias de las matrices o la derivada de Frechet. expm () debe ser preferido a la función con el mismo nombre en Matrix.
  • SparseM proporciona clases y métodos para matrices dispersas y para resolver problemas lineales y de mínimos cuadrados en álgebra lineal dispersa
  • rmumps proporciona un acceso para la biblioteca MUMPS, que resuelve grandes sistemas lineales de ecuaciones aplicando un solucionador directo paralelo disperso
  • Rlinsolve es una colección de solucionadores iterativos para sistemas de ecuaciones lineales dispersos. Se proporcionan solucionadores iterativos estacionarios como Jacobi o Gauss-Seidel, así como métodos no estacionarios (subespacio Krylov).
  • svd proporciona enlaces R a implementaciones de vanguardia de la descomposición de valores singulares (SVD) y cálculos de valores propios / vectores propios. El paquete ssvd obtendrá SVD dispersos utilizando un método de umbral iterativo, mientras que irlba calculará valores / vectores singulares aproximados de matrices grandes.
  • El paquete PRIMME interactúa con PRIMME, una biblioteca de C para calcular valores propios y los vectores propios correspondientes de matrices de Hermitt simétricas reales o complejas. Puede encontrar  eigenvalores  singulares más grandes, más pequeños o interiores y aplicará un preacondicionamiento para acelerar la convergencia.
  • Los paquetes geigen y QZ calculan eigen valores y eigen vectores para pares de matrices, y descomposiciones QZ (Schur generalizado).
  • eigeninv genera matrices con un conjunto dado de valores propios ('problema de valores propios inversos').
  • rARPACK , es  un enlace para la biblioteca ARPACK, se usa normalmente para calcular solo unos pocos valores / vectores, por ejemplo, un pequeño número de valores propios más grandes.
  •  RSpectra interactúa con la biblioteca 'Spectra' para la descomposición de valores propios a gran escala y los problemas de SVD.
  • optR usa métodos elementales de álgebra lineal (Gauss, LU, CGM, Cholesky) para resolver sistemas lineales.
  • matrixcalc contiene una colección de funciones para cálculos matriciales, matrices especiales y pruebas de propiedades matriciales, por ejemplo, definición (semi) positiva.
  • onion contiene rutinas para manipular cuaterniones y octonianos (álgebras de división normalizada sobre los números reales); Los cuaterniones pueden ser útiles para manejar rotaciones en el espacio tridimensional.
  • RcppArmadillo y RcppEigen permiten la integración de las bibliotecas de plantillas de C ++ 'Resp. Armadillo'. 'Eigen' para aplicaciones de álgebra lineal escritas en C ++ e integradas en R usando Rcpp para rendimiento y facilidad de uso.
Funciones especiales
Muchas funciones matemáticas especiales están presentes en R, especialmente logaritmos y exponenciales, funciones trigonométricas e hiperbólicas, o funciones de Bessel y Gamma. Muchas más funciones especiales están disponibles en paquetes contribuidos.
  • gsl proporciona una interfaz a la 'Biblioteca Científica GNU' que contiene implementaciones de muchas funciones especiales, por ejemplo las funciones Airy y Bessel, las integrales elípticas y exponenciales, la función hipergeométrica, la función W de Lambert y muchos más.
  • Las funciones de Airy y Bessel, para números reales y complejos, también se computan en el paquete Bessel , con aproximaciones para argumentos grandes.
  • pracma incluye funciones especiales, tales como funciones de error e inversas, función gamma incompleta y compleja, integrales exponenciales y logarítmicas, integrales de Fresnel, el poligamma y las funciones zeta de Dirichlet y Riemann.
  • appell calcula las funciones hipergeométricas de Gauss '2F1 y Appell F1 para parámetros y argumentos complejos con bastante precisión.
  • La función hipergeométrica (y hipergeométrica generalizada) se calcula en hipergeo , incluidas las fórmulas de transformación y los valores especiales de los parámetros.
  • Las funciones elípticas y modulares están disponibles en el paquete elíptico , incluida la función Weierstrass P y las funciones theta de Jacobi. Existen herramientas para visualizar funciones complejas.
  • El paquete expint envuelve las funciones C de la Biblioteca Científica GNU para calcular las integrales exponenciales y la función Gamma incompleta, incluidos los valores negativos para su primer argumento.
  • fourierin calcula las integrales de Fourier de funciones de una y dos variables utilizando la transformada rápida de Fourier.
  • logOfGamma utiliza aproximaciones para calcular los logaritmos naturales de la función Gamma para valores grandes.
  • Package lamW implementa ambas ramas de valor real de la función Lambert W (usando Rcpp).
Polinomios
La función polyroot () en la base R determina todos los ceros de un polinomio, según el algoritmo de Jenkins-Traub. La función de regresión lineal lm () puede realizar un ajuste polinomial cuando se usa poly () en la fórmula del modelo (con la opción raw = TRUE ).
  • polinom y Polinom proporcionan una funcionalidad similar para manipular polinomios univariados, como evaluar polinomios (esquema de Horner), diferenciarlos o integrarlos, o resolver polinomios, es decir, encontrar todas las raíces (basadas en un cálculo de valores propios).
  • MonoPoly ajusta polinomios univariados a los datos dados, aplicando diferentes algoritmos.
  • multipol proporciona varias herramientas para manipular y combinar estos polinomios de varias variables.
  • mpoly facilita las manipulaciones simbólicas en polinomios multivariados, incluidas las operaciones básicas de cálculo diferencial en polinomios, más algunos cálculos de base de Groebner.
  • mvp permite la manipulación rápida de polinomios multivariados simbólicos, utilizando métodos de impresión y coerción del paquete 'mpoly', pero ofrece mejoras de velocidad.
  • orthopolynom consiste en una colección de funciones para construir polinomios ortogonales y sus relaciones de recurrencia, entre ellos los polinomios de Chebyshev, Hermite y Legendre, así como los polinomios esféricos y ultrasónicos. Hay funciones para operar en estos polinomios.
Diferenciación e integración
D () y deriv () en base R calculan derivadas de expresiones simples simbólicamente. La función integra () implementa un enfoque para integrar numéricamente funciones univariadas en R. Aplica la cuadratura de Gauss-Kronrod adaptativa y puede manejar singularidades y dominios ilimitados hasta cierto punto.
  • Deriv proporciona una solución extendida para la diferenciación simbólica en R; el usuario puede agregar reglas derivadas personalizadas, y la salida para una función será nuevamente una función ejecutable.
  • numDeriv establece el estándar para la diferenciación numérica en R, que proporciona gradientes numéricos, jacobianos y hessianos, calculados por diferencias finitas simples, extrapolación de Richardson o el enfoque de pasos complejos de gran precisión.
  • autodiffr (en Github) proporciona un acceso a R para los paquetes Julia ForwardDiff.jl y ReverseDiff.jl para hacer una diferenciación automática para las funciones R nativas. (Funciona solo con Julia v0.6 por el momento)
  • pracma contiene funciones para calcular derivadas numéricas, incluida la extrapolación de Richardson o el paso complejo. fderiv () calcula derivadas numéricas de órdenes superiores. pracma tiene varias rutinas para la integración numérica: cuadratura adaptativa de Lobatto, integración de Romberg, fórmulas de Newton-Cotes, reglas de cuadratura de Clenshaw-Curtis. integral2 () integra funciones en dos dimensiones, también para dominios caracterizados por coordenadas polares o con límites de intervalo variable.
  • gaussquad contiene una colección de funciones para realizar la cuadratura gaussiana, entre ellas las reglas de cuadratura de Chebyshev, Hermite, Laguerre y Legendre, que devuelven explícitamente los nodos y los pesos en cada caso. La función gaussquad () en el paquete statmod hace un trabajo similar.
  • fastGHQuad proporciona una implementación rápida basada en Rcpp de la cuadratura de Gauss-Hermite (adaptativa).
  • mvQuad proporciona métodos para generar cuadrículas multivariables que pueden utilizarse para la integración multivariable. Estas cuadrículas se basarán en diferentes reglas de cuadratura, como las fórmulas de cuadratura de Newton-Cotes o Gauss.
  • SparseGrid proporciona otro enfoque para la integración multivariable en espacios de alta dimensión. Crea grillas n-dimensionales dispersas que se pueden usar como con las reglas de cuadratura.
  • SphericalCubature emplea cubature para integrar funciones sobre esferas y bolas unitarias en el espacio n-dimensional; SimplicialCubature proporciona métodos para integrar funciones sobre simplicidades m dimensionales en el espacio n-dimensional. Ambos paquetes comprenden métodos exactos para los polinomios.
  • El paquete polyCub contiene algunas rutinas para la integración numérica sobre dominios poligonales en dos dimensiones.
  • Pade calcula los coeficientes de numerador y denominador de la aproximación de Pade, dados los coeficientes de la serie de Taylor de longitud suficiente.
  • características extrae características de datos funcionales, como primera y segunda derivadas, o curvatura en puntos críticos, mientras que RootsExtremaInflections encuentra raíces, extremos y puntos de inflexión de curvas definidas por puntos discretos.
Interpolación y aproximación
La Base de R proporciona funciones aprox() para la interpolación constante y lineal, y spline() para la interpolación de spline cúbica (Hermite), mientras que smooth.spline () realiza una aproximación de spline cúbica.Las splines del paquete base crean splines de interpolación periódica en la función periodicSpline () .
  • La interpolación de datos espaciados irregularmente es posible con el paquete akima : aspline () para datos univariados, bicúbico () o interp () para datos en un dominio rectangular 2D. (Este paquete se distribuye bajo la licencia ACM y no está disponible para uso comercial).
  • El paquete signal  contiene varios filtros para suavizar datos discretos, en particular interp1() para interpolación lineal, spline y cúbica, pchip() para interpolación de Hermite cúbica por partes, y sgolay () para el suavizado de Savitzky-Golay.
  • El paquete pracma proporciona interpolación de Lagrange baricéntrica (en 1 y 2 dimensiones) en barylag() resp. barylag2d() , 1-dim. akima en akimaInterp() , e interpolación y aproximación de datos con funciones racionales, es decir, en presencia de singularidades, en ratinterp () y rationalfit() .
  • El paquete interp proporciona interpolación de datos bivariados en cuadrículas regulares e irregulares, ya sea lineal o usando splines. Actualmente se implementa la parte de interpolación lineal por tramos. (Está destinado a proporcionar un reemplazo gratuito para las funciones akima :: interp y tripack :: tri.mesh con licencia de ACM).
  • El paquete chebpol contiene métodos para crear polinomios de  Chebyshev multivariable y la interpolación multilineal en cuadrículas regulares, por ejemplo, el método de baricentro Floater-Hormann, o splines poliarmónicos para datos dispersos.
  • tripack para triangulación de datos espaciados irregularmente es un paquete bidimensional de triangulación de Delaunay restringido que proporciona triangulación y generación de mosaicos Voronoi de datos espaciados irregulares.
  • sinterp() en el paquete stinepack realiza la interpolación basada en funciones racionales por partes aplicando el algoritmo de Stineman. La función de interpolación será monótona en regiones donde los puntos especificados cambien monótonamente.
  • Schumaker() en el paquete schumaker implementa splines que preservan la forma, con garantía de ser monótona cóncavo o convexo si los datos son monotónicos, cóncavos o convexos.
  • ADPF utiliza regresión polinomial de mínimos cuadrados y pruebas estadísticas para mejorar el suavizado de Savitzky-Golay.
  • El paquete conicfit proporciona varios algoritmos (geométricos y algebraicos) para ajustar círculos, elipses y cónicas en general.
Búsqueda de raíces y puntos fijos
uniroot() , que implementa el algoritmo Brent-Decker, es la rutina básica en R para encontrar raíces de funciones univariadas. Hay implementaciones del algoritmo de bisección en varios paquetes contribuidos. Para encontrar la raíz con mayor precisión, hay una función unirootR() en el paquete de precisión múltiple Rmpfr . Y para encontrar raíces de funciones multivariadas, vea los siguientes dos paquetes:
  • Para resolver sistemas de ecuaciones no lineales, el paquete BB proporciona métodos espectrales de Barzilai-Borwein (no monótonos) en sane() , incluida una variante sin derivados en dfsane() , y características de inicio múltiple con análisis de sensibilidad.
  • El paquete nleqslv resuelve sistemas no lineales de ecuaciones usando alternativamente el método de Broyden o Newton, apoyado por estrategias como búsquedas de líneas o regiones de confianza.
  • ktsolve define una interfaz común para resolver un conjunto de ecuaciones con BB o nleqslv .
  • El paquete FixedPoint proporciona algoritmos para encontrar vectores de puntos fijos. Estos algoritmos incluyen la aceleración de Anderson, los métodos de extrapolación de épsilon y los métodos polinomiales mínimos.
Matemática discreta y teoría de números
No hay tantas funciones disponibles para la teoría numérica computacional. Hay que tener en cuenta que los enteros en doble precisión se pueden representar exactamente hasta 2 ^ 53 - 1 , por encima de ese límite se necesita un paquete de precisión múltiple como gmp , consulte a continuación.
  • El paquete numbers  proporciona funciones para la factorización, números primos, primos gemelos, raíces primitivas, inversos modulares, MCD extendido, etc. Se incluyen algunas funciones de teoría de números como funciones de divisor o función Phi de Euler.
  • Contfrac contiene varias utilidades para evaluar fracciones continuas y convergentes parciales.
  • magic crea e investiga cuadrados mágicos e hipercubos, incluidas funciones para la manipulación y el análisis de matrices dimensionadas arbitrariamente.
  • El paquete freegroup proporciona funcionalidad para manipular elementos de un grupo libre, incluidas la yuxtaposición, la inversión, la multiplicación por un escalar, las operaciones de potencia y las formas de Tietze.
  • El paquete partitions enumera particiones aditivas de enteros, incluyendo particiones restringidas y desiguales.
  • permutations tratan las permutaciones como funciones invertibles de conjuntos finitos e incluyen varias operaciones matemáticas en ellas.
  • El paquete combinat genera todas las permutaciones o todas las combinaciones de una cierta longitud de un conjunto de elementos (es decir, un vector); también calcula los coeficientes binomiales.
  • El paquete arrangements  proporciona generadores e iteradores para permutaciones, combinaciones y particiones. Los iteradores permiten a los usuarios generar arreglos de una manera rápida y eficiente en memoria. Las permutaciones y combinaciones se pueden dibujar con / sin reemplazo y son compatibles con multisets.
  • RcppAlgos proporciona funciones flexibles para generar combinaciones o permutaciones de un vector con o sin restricciones. El paquete de extensión bigIntegerAlgos presenta un algoritmo de tamiz cuadrático para factorizar completamente enteros grandes.
  • El paquete Zseq genera secuencias enteras conocidas; El paquete 'gmp' es adoptado para computar con números arbitrariamente grandes. Cada función tiene en su página de ayuda un hipervínculo a la entrada correspondiente en la Enciclopedia en línea de secuencias de números enteros ( OEIS ).
Matemática aritmética y simbólica de precisión múltiple
  • La aritmética de precisión múltiple está disponible en R a través del paquete gmp que se interconecta con la biblioteca GMP C. Algunos ejemplos son la factorización de enteros, una prueba de número primo probabilístico u operaciones en grandes racionales, para los cuales se pueden resolver sistemas de ecuaciones lineales.
  • Las operaciones y funciones de punto flotante de precisión múltiple se proporcionan a través del paquete Rmpfr utilizando las bibliotecas MPFR y GMP. Se incluyen números especiales y algunas funciones especiales, así como rutinas para la búsqueda, integración y optimización de raíz con precisión arbitraria.
  • Brobdingnag maneja números muy grandes manteniendo su logaritmo más una bandera que indica su signo. (Una excelente viñeta explica cómo se hace esto usando los métodos S4).
  • VeryLargeIntegers implementa una biblioteca de precisión múltiple que permite almacenar y administrar enteros arbitrariamente grandes; Incluye pruebas de primalidad probabilística y algoritmos de factorización.
  • Paquete Ryacas interconecta el sistema de álgebra computacional 'Yacas'. Admite cálculos de precisión simbólicos y arbitrarios en cálculo y álgebra lineal.
  • El paquete rSymPy accede al sistema de álgebra simbólica 'SymPy' (escrito en Python) desde R. Admite cálculos de precisión arbitrarios, álgebra lineal y cálculo, resolución de ecuaciones, matemáticas discretas y mucho más.
Interfaces Python
Python, a través de sus módulos 'NumPy', 'SciPy', 'Matplotlib', 'SymPy' y 'pandas', tiene disponibles herramientas numéricas y gráficas eficientes y elaboradas.
  • reticulate es una interfaz R para los módulos, clases y funciones de Python. Cuando se llama a Python en R, los tipos de datos se convierten automáticamente a sus tipos de Python equivalentes; cuando los valores se devuelven de Python a R, se vuelven a convertir en los tipos R. Este paquete del equipo de RStudio es un tipo de estándar para llamar a Python desde R.
  • El paquete R rPython permite llamadas de R a Python, mientras que RPy (con el módulo de Python 'rpy2') interconecta R de Python. SnakeCharmR es una bifurcación de 'rPython' con varias correcciones y mejoras.
  • PythonInR es otro paquete para interactuar con Python desde dentro R. Proporciona clases de Python para vectores, matrices y marcos de datos que permiten una conversión fácil de R a Python y viceversa.
  • feather proporciona enlaces para leer y escribir archivos feather, un ligero almacén de datos binarios diseñado para la máxima velocidad. También se puede acceder a este formato de almacenamiento en Python, Julia o Scala.
  • findpython es un paquete diseñado para encontrar un binario Python aceptable en la ruta, incl. Versión mínima o módulos requeridos.
  • 'pyRserve' es un módulo de Python para conectar Python a un proceso R que ejecuta Rserve como una puerta de enlace RPC. Este proceso R se puede ejecutar en una máquina remota, el acceso variable y las llamadas de función se delegarán a través de la red.
  • XRPython (y 'XRJulia') se basan en el paquete XR de John Chambers y su libro "Extending R" y permiten una integración muy estructurada de R con Python resp. Julia
  • Tenga en cuenta que SageMath es un sistema gratuito de matemáticas de código abierto basado en Python, que permite ejecutar funciones R, pero también brinda acceso a los programas de matemáticas Maxima, GAP, FLINT y muchos más. SageMath se puede descargar o utilizar a través de una interfaz web en CoCalc .
MATLAB, Octave, Julia y otras interfaces
Las interfaces para software de computación numérica como MATLAB (comercial) u Octave (gratis) serán importantes cuando se resuelven problemas numéricos difíciles.
  • El paquete de emulación matlab contiene aproximadamente 30 funciones simples, replicando funciones MATLAB, usando los nombres respectivos de MATLAB y implementándose en R. pura (vea también la práctica para muchas más funciones matemáticas diseñadas con MATLAB en mente).
  • El paquete R.matlab proporciona herramientas para leer y escribir archivos MAT, que es el formato de datos MATLAB. También permite una interfaz unidireccional con un proceso MATLAB, enviando y recuperando objetos a través de una conexión TCP / IP.
Julia es "un lenguaje de programación dinámico de alto nivel y alto rendimiento para computación numérica", lo que lo hace interesante para problemas de optimización y otros cálculos científicos exigentes en R.
  • La interfaz Julia del paquete XRJulia de John Chambers proporciona análogos directos a las llamadas de función de Julia. Un paquete 'juliaExamples' está disponible en Github.
  • JuliaCall proporciona una integración perfecta entre R y Julia. Usando la interfaz de alto nivel, el usuario puede llamar a cualquier función Julia como una función R con conversión automática de tipos.
Los programas comerciales SAS y Mathematica tienen facilidades para llamar a las funciones R. Aquí hay otro Sistema de Álgebra Computacional (CAS) en Matemáticas Puras que se puede llamar desde R.
  • El paquete m2r proporciona una interfaz persistente para Macauley2, un programa de software extendido que apoya la investigación en geometría algebraica y álgebra conmutativa. Macauley2 debe instalarse de forma independiente, de lo contrario, se instanciará un proceso Macauley2 en la nube.

Enlaces relacionados:


No hay comentarios:

Publicar un comentario