R es un lenguaje de programación para computación estadística y visualización de datos . Ha sido adoptado en los campos de minería de datos , bioinformática y análisis de datos . [8]
El lenguaje principal de R se ve ampliado por una gran cantidad de paquetes de extensión , que contienen código reutilizable, documentación y datos de muestra.
El software R es software de código abierto y gratuito . Tiene la licencia del Proyecto GNU y está disponible bajo la Licencia Pública General GNU . [3] Está escrito principalmente en C , Fortran y el propio R. Se proporcionan ejecutables precompilados para varios sistemas operativos .
Como lenguaje interpretado , R tiene una interfaz de línea de comandos nativa . Además, hay disponibles múltiples interfaces gráficas de usuario de terceros , como RStudio , un entorno de desarrollo integrado , y Jupyter , una interfaz para portátiles .
R fue iniciado por los profesores Ross Ihaka y Robert Gentleman como un lenguaje de programación para enseñar introducción a la estadística en la Universidad de Auckland . [9] El lenguaje se inspiró en el lenguaje de programación S , y la mayoría de los programas S pueden ejecutarse sin modificaciones en R. [6] El lenguaje también se inspiró en el alcance léxico de Scheme , permitiendo variables locales. [1]
El nombre del idioma, R , proviene de ser tanto un sucesor del idioma S como la primera letra compartida de los autores, Ross y Robert. [10] En agosto de 1993, Ihaka y Gentleman publicaron un binario de R en StatLib, un sitio web de archivo de datos . Al mismo tiempo, anunciaron la publicación en la lista de correo de s-news . [11] El 5 de diciembre de 1997, R se convirtió en un proyecto GNU cuando se lanzó la versión 0.60. [12] El 29 de febrero de 2000, se lanzó la primera versión oficial 1.0. [13]
Un conjunto de datos numéricos puede tener una tendencia central (donde residen algunos de los puntos de datos más típicos). [14] La media aritmética ( promedio ) es la medida de tendencia central más utilizada. [14] La media de un conjunto de datos numéricos es la suma de los puntos de datos dividida por el número de puntos de datos. [14]
Supongamos que se tomó una muestra de cuatro observaciones de mediciones de temperatura en grados Celsius con 12 horas de diferencia.
Este programa de computadora R generará la media de :
# La función c() "combina" una lista en un solo objeto. x <- c ( 30 , 27 , 31 , 28 ) suma <- suma ( x ) longitud <- longitud ( x ) media <- suma / longitud mensaje ( "Medio:" ) imprimir ( medio )
Nota: R puede tener el mismo identificador que represente tanto el nombre de una función como su resultado. Para obtener más información, visite alcance .
Producción:
Media: [1] 29
Este programa de R ejecutará la mean()
función nativa para generar la media de x:
x <- c ( 30 , 27 , 31 , 28 ) mensaje ( "Media:" ) imprimir ( media ( x ) )
Producción:
Media: [1] 29
Una desviación estándar de un conjunto de datos numéricos es una indicación de la distancia promedio a la que se encuentran todos los puntos de datos de la media. [15] Para un conjunto de datos con una pequeña cantidad de variación, entonces cada punto de datos estará cerca de la media, por lo que la desviación estándar será pequeña. [15]
Supongamos que se tomó una muestra de cuatro observaciones de mediciones de temperatura en grados Celsius con 12 horas de diferencia.
Este programa R generará la desviación estándar de :
x <- c ( 30 , 27 , 31 , 28 ) distanciaDeMedia <- x - media ( x ) distanciaDeMediaCuadrado <- distanciaDeMedia ** 2 distanciaDeMediaCuadradoSum <- suma ( distanciaDeMediaCuadrado ) varianza <- distanciaDeMediaCuadrado / ( longitud ( x ) - 1 ) Desviación estándar <- sqrt ( varianza ) mensaje ( "Desviación estándar:" ) imprimir ( desviación estándar )
Producción:
Desviación estándar: [1] 1,825742
Este programa R ejecutará la sd()
función nativa para generar la desviación estándar de :
x <- c ( 30 , 27 , 31 , 28 ) mensaje ( "Desviación estándar:" ) imprimir ( sd ( x ) )
Producción:
Desviación estándar: [1] 1,825742
Un fenómeno puede ser el resultado de uno o más eventos observables . Por ejemplo, el fenómeno de los accidentes de esquí puede ser consecuencia de la presencia de nieve en las montañas. Un método para medir si un conjunto de datos numéricos está relacionado o no con otro conjunto de datos es la regresión lineal . [17]
Si existe una relación lineal , entonces un diagrama de dispersión de los dos conjuntos de datos mostrará un patrón que se asemeja a una línea recta. [18] Si se incluye una línea recta en el diagrama de dispersión de modo que la distancia promedio desde todos los puntos hasta la línea sea mínima, entonces la línea se llama línea de regresión . La ecuación de la recta de regresión se llama ecuación de regresión . [19]
La ecuación de regresión es una ecuación lineal ; por lo tanto, tiene pendiente y intercepto en y . El formato de la ecuación de regresión es . [20] [un]
Supongamos que se tomó una muestra de cuatro observaciones de mediciones de temperatura en grados Celsius con 12 horas de diferencia. Al mismo tiempo, se cambió el termómetro a la temperatura Fahrenheit y se tomó otra medición.
Este programa R generará la pendiente y la intersección con el eje y de una relación lineal que depende de :
x <- c ( 30 , 27 , 31 , 28 ) y < - c ( 86,0 , 80,6 , 87,8 , 82,4 ) # Construir el numerador independentDistanceFromMean <- x - mean ( x ) sampledDependentDistanceFromMean <- y - mean ( y ) independentDistanceTimesSampledDistance <- independentDistanceFromMean * sampledDependentDistanceFromMean IndependentDistanceTimesSampledDistanceSum <- suma ( independienteDistanceTimesSampledDistance ) # Construye el denominador independentDistanceFromMeanSquared <- independentDistanceFromMean ** 2 distanciaindependienteDeMeanCuadradoSum <- suma ( distanciaindependienteDeMeanCuadrado ) # La pendiente es el aumento sobre la pendiente de ejecución <- independentDistanceTimesSampledDistanceSum / independentDistanceFromMeanSquaredSum yIntercepto <- media ( y ) - pendiente * ( media ( x ) ) mensaje ( "Pendiente:" ) imprimir ( pendiente ) mensaje ( "Y-intercept:" ) imprimir ( yIntercept )
Producción:
Pendiente: [1] 1,8 Intersección en Y: [1] 32
Este programa de R ejecutará las funciones nativas para generar la pendiente y la intersección con el eje y :
x <- c ( 30 , 27 , 31 , 28 ) y < - c ( 86,0 , 80,6 , 87,8 , 82,4 ) # Ejecutar lm() con Fahrenheit depende de Celsius linearModel <- lm ( y ~ x ) # coeficientes() devuelve una estructura que contiene la pendiente y los coeficientes de intercepción y <- coeficientes ( modelo lineal ) # Extraer la pendiente de la pendiente de la estructura <- coeficientes [[ "x" ]] # Extraer la intersección y de la estructura yIntercept <- coeficientes [[ "(Intersección)" ]] mensaje ( "Pendiente:" ) imprimir ( pendiente ) mensaje ( "Y-intercept:" ) imprimir ( yIntercept )
Producción:
Pendiente: [1] 1,8 Intersección en Y: [1] 32
El coeficiente de determinación determina el porcentaje de variación explicado por la variable independiente. [21] Siempre se encuentra entre 0 y 1. [22] Un valor de 0 indica que no hay relación entre los dos conjuntos de datos, y un valor cercano a 1 indica que la ecuación de regresión es extremadamente útil para hacer predicciones. [23]
Este programa R generará el coeficiente de determinación de la relación lineal entre y :
x <- c ( 30 , 27 , 31 , 28 ) y < - c ( 86,0 , 80,6 , 87,8 , 82,4 ) # Construya el numerador linearModel <- lm ( y ~ x ) coeficientes <- coeficientes ( linearModel ) pendiente <- coeficientes [[ "x" ]] yIntercept <- coeficientes [[ "(Intercept)" ]] predictedResponse <- yIntercept + ( pendiente * x ) predictedResponseDistanceFromMean <- predictedResponse - media ( y ) predichaResponseDistanceFromMeanSquared <- predichaResponseDistanceFromMean ** 2 predictedResponseDistanceFromMeanSquaredSum <- suma ( predichoResponseDistanceFromMeanSquared ) # Construir el denominador sampledResponseDistanceFromMean <- y - mean ( y ) sampledResponseDistanceFromMeanSquared <- sampledResponseDistanceFromMean ** 2 sampledResponseDistanceFromMeanSquaredSum <- suma ( sampledResponseDistanceFromMeanSquared ) coeficienteDeDeterminación <- predictedResponseDistanceFromMeanSquaredSum / sampledResponseDistanceFromMeanSquaredSum mensaje ( "Coeficiente de determinación:" ) imprimir ( coeficienteDeDeterminación )
Producción:
Coeficiente de determinación: [1] 1
Este programa R ejecutará las funciones nativas para generar el coeficiente de determinación :
x <- c ( 30 , 27 , 31 , 28 ) y < - c ( 86,0 , 80,6 , 87,8 , 82,4 ) modelo lineal <- lm ( y ~ x ) resumen <- resumen ( modelo lineal ) coeficienteDeDeterminación <- resumen [[ "r.squared" ]] mensaje ( "Coeficiente de determinación:" ) imprimir ( coeficienteDeDeterminación )
Salida: [b]
Coeficiente de determinación: [1] 1
Este programa R mostrará un diagrama de dispersión con una línea de regresión incorporada y una ecuación de regresión que ilustra la relación entre y :
x <- c ( 30 , 27 , 31 , 28 ) y < - c ( 86,0 , 80,6 , 87,8 , 82,4 ) modelo lineal <- lm ( y ~ x ) coeficientes <- coeficientes ( modelo lineal ) pendiente <- coeficientes [[ "x" ]] intersección <- coeficientes [[ "(Intercepción)" ]] # Ejecute pegar() para construir la ecuación de regresión cadena regressionEquation <- pegar ( "y =" , interceptar , "+" , pendiente , "x" ) # Mostrar un diagrama de dispersión con la línea de regresión y el diagrama integrado de la ecuación ( x , y , main = "Fahrenheit depende de Celsius" , sub = regressionEquation , xlab = "Degress Celsius" , ylab = "Degress Fahrenheit" , abline ( linearModel ) )
Producción:
Este programa R generará una gráfica múltiple y una tabla de residuos.
# La variable independiente es una lista de números del 1 al 6. x <- 1 : 6 # La variable dependiente es una lista de cada variable independiente al cuadrado. y <- x ^ 2 # La ejecución del modelo lineal en una ecuación cuadrática producirá residuos. Modelo lineal <- lm ( y ~ x ) # Mostrar los residuos. resumen ( modelo lineal ) # Crea una trama múltiple de 2 por 2. par ( mfrow = c ( 2 , 2 )) # Genera el gráfico múltiple. trama ( modelo lineal )
Producción:
Residuos: 1 2 3 4 5 6 7 8 9 10 3,3333 -0,6667 -2,6667 -2,6667 -0,6667 3,3333Coeficientes: Estimar Std. Valor t de error Pr(>|t|) (Intercepción) -9,3333 2,8441 -3,282 0,030453 * x 7,0000 0,7303 9,585 0,000662 *** --- Signif. códigos: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0,1 '' 1Error estándar residual: 3,055 en 4 grados de libertad R cuadrado múltiple: 0,9583, R cuadrado ajustado: 0,9478 Estadístico F: 91,88 en 1 y 4 DF, valor p: 0,000662
Este ejemplo del conjunto de Mandelbrot destaca el uso de números complejos . Modela las primeras 20 iteraciones de la ecuación , donde representa diferentes constantes complejas.z = z2 + c
c
Instale el paquete que proporciona la write.gif()
función de antemano:
instalar.paquetes ( "caTools" )
programa R:
biblioteca ( caTools )jet.colors <- colorRampPalette ( c ( "verde" , "rosa" , "#007FFF" , "cian" , "#7FFF7F" , "blanco" , "#FF7F00" , "rojo" , "#7F0000" )) dx <- 1500 # define ancho dy <- 1400 # define altura C <- complejo ( real = rep ( sec ( -2.2 , 1.0 , longitud.out = dx ), cada uno = dy ), imag = rep ( sec ( -1.2 , 1.2 , longitud.out = dy ), dx )) # remodelar como matriz de números complejos C <- matriz ( C , dy , dx ) # inicializar la salida de la matriz 3D X <- matriz ( 0 , c ( dy , dx , 20 )) Z <- 0 # bucle con 20 iteraciones para ( k en 1 : 20 ) { # la ecuación en diferencias central Z <- Z ^ 2 + C # capturar los resultados X [, , k ] <- exp ( - abs ( Z )) } write.gif ( X , "Mandelbrot.gif" , col = jet.colors , retraso = 100 )
Producción:
R es un lenguaje interpretado , por lo que los programadores normalmente acceden a él a través de un intérprete de línea de comandos . Si un programador escribe 1+1
en el símbolo del sistema R2
y presiona Enter, la computadora responde con . [24] Los programadores también guardan programas R en un archivo y luego ejecutan el intérprete por lotes Rscript. [25]
R almacena datos dentro de un objeto . A un objeto se le asigna un nombre que el programa informático utiliza para establecer y recuperar un valor . [26] Un objeto se crea colocando su nombre a la izquierda del par de símbolos<-
. [27] El par de símbolos <-
se denomina operador de asignación . [28]
Para crear un objeto llamado x
y asignarle el valor entero82
:
x <- 82L impresión ( x )
Producción:
[1] 82
El [1]
que se muestra antes del número es un subíndice . Muestra que el contenedor de este número entero es el índice uno de una matriz .
El objeto R más primitivo es el vector . [29] Un vector es una matriz unidimensional de datos. Para asignar varios elementos a la matriz, utilice la c()
función para "combinar" los elementos. Los elementos deben ser del mismo tipo de datos . [30] R carece de tipos de datos escalares , que son marcadores de posición para una sola palabra , generalmente un número entero. En cambio, se almacena un único número entero en el primer elemento de una matriz. El número entero único se recupera utilizando el subíndice de índice de [1]
. [C]
Programa R para almacenar y recuperar un único número entero:
almacenar <- 82L recuperar <- almacenar [ 1 ] imprimir ( recuperar [ 1 ] )
Producción:
[1] 82
Cuando se aplica una operación a un vector, R aplicará la operación a cada elemento de la matriz. Esto se llama operación por elementos . [31]
Este ejemplo crea el objeto nombrado x
y le asigna números enteros del 1 al 3. El objeto se muestra y luego nuevamente con uno agregado a cada elemento:
x <- 1 : 3 imprimir ( x ) imprimir ( x + 1 )
Producción:
[1] 1 2 3 [1] 2 3 4
Para lograr muchas adiciones, R implementa el reciclaje de vectores . [31] El número uno que sigue al signo más ( +
) se convierte en una matriz interna de tres unos. La +
operación recorre simultáneamente ambas matrices y realiza la suma en cada par de elementos. Los resultados se almacenan en otra matriz interna de tres elementos que se devuelve a la print()
función.
Un vector numérico se utiliza para almacenar números enteros y de punto flotante . [32] La característica principal de un vector numérico es la capacidad de realizar aritmética sobre los elementos. [32]
De forma predeterminada, los números enteros (números sin punto decimal) se almacenan como punto flotante. Para forzar la asignación de memoria de números enteros, agregue una L
al número. Como excepción, el operador de secuencia :
asignará, de forma predeterminada, memoria de números enteros.
programa R :
x <- 82L imprimir ( x [ 1 ] ) mensaje ( "Tipo de datos:" ) tipo de ( x )
Producción:
[1] 82 Tipo de datos: [1] "entero"
programa R :
x <- c ( 1L , 2L , 3L ) imprimir ( x ) mensaje ( "Tipo de datos:" ) tipo de ( x )
Producción:
[1] 1 2 3 Tipo de datos: [1] "entero"
programa R :
x <- 1 : 3 imprimir ( x ) mensaje ( "Tipo de datos:" ) tipo de ( x )
Producción:
[1] 1 2 3 Tipo de datos: [1] "entero"
Un vector doble almacena números reales , que también se conocen como números de coma flotante . La asignación de memoria para un número de coma flotante es de doble precisión . [32] La doble precisión es la asignación de memoria predeterminada para números con o sin punto decimal.
programa R :
x <- 82 imprimir ( x [ 1 ] ) mensaje ( "Tipo de datos:" ) tipo de ( x )
Producción:
[1] 82 Tipo de datos: [1] "doble"
programa R :
x <- c ( 1 , 2 , 3 ) imprimir ( x ) mensaje ( "Tipo de datos:" ) tipo de ( x )
Producción:
[1] 1 2 3 Tipo de datos: [1] "doble"
Un vector lógico almacena datos binarios , ya sea TRUE
o FALSE
. El propósito de este vector es almacenar el resultado de una comparación. [33] Un dato lógico se expresa como TRUE
, T
, FALSE
o F
. [33] Las letras mayúsculas son obligatorias y las constantes no están rodeadas por comillas . [33]
programa R :
x <- 3 < 4 imprimir ( x [ 1 ] ) mensaje ( "Tipo de datos:" ) tipo de ( x )
Producción:
[1] VERDADERO Tipo de datos: [1] "lógico"
Se pueden comparar dos vectores utilizando los siguientes operadores lógicos : [34]
Un vector de caracteres almacena cadenas de caracteres . [35] Las cadenas se crean encerrando el texto entre comillas dobles. [35]
programa R :
x <- "hola mundo" imprimir ( x [ 1 ] ) mensaje ( "Tipo de datos:" ) tipo de ( x )
Producción:
[1] "hola mundo" Tipo de datos: [1] "carácter"
programa R :
x <- c ( "hola" , "mundo" ) imprimir ( x ) mensaje ( "Tipo de datos:" ) tipo de ( x )
Producción:
[1] "hola" "mundo" Tipo de datos: [1] "carácter"
Un Factor es un vector que almacena una variable categórica . [36] La factor()
función convierte una cadena de texto en un tipo enumerado , que se almacena como un número entero . [37]
En diseño experimental , un factor es una variable independiente a probar (una entrada) en un experimento controlado . [38] Se utiliza un experimento controlado para establecer la causalidad , no sólo la asociación . [39] Por ejemplo, se podría observar que un aumento en las ventas de chocolate caliente está asociado con un aumento en los accidentes de esquí.
Una unidad experimental es un elemento sobre el que se realiza un experimento. Si la unidad experimental es una persona, entonces se la conoce como sujeto . Una variable de respuesta (también conocida como variable dependiente ) es un posible resultado de un experimento. Un nivel de factor es una característica de un factor. Un tratamiento es un entorno que consta de una combinación de un nivel (característica) de cada uno de los factores de entrada. Una réplica es la ejecución de un tratamiento en una unidad experimental y produce variables de respuesta . [40]
Este ejemplo construye dos programas R para modelar un experimento para aumentar el crecimiento de una especie de cactus . Se prueban dos factores :
Programa R para configurar el diseño:
# El paso 1 es establecer los niveles de un factor. # Vector de los niveles del agua: waterLevel <- c ( "none" , "light" , "medium" ) # El paso 2 es crear el factor. # Vector del factor agua: waterFactor <- factor ( # Aunque es posible un subconjunto, use todos los niveles. waterLevel , niveles = waterLevel ) # Vector de los niveles del polímero: polymerLevel <- c ( "notUsed" , "used" ) # Vector del factor polímero: polímeroFactor <- factor ( nivelpolímero , niveles = nivelpolímero ) # Los tratamientos son el producto cartesiano de ambos factores. tratamientoProductoCartesiano <- expand.grid ( factoragua , factorpolímero ) mensaje ( "Factor de agua:" ) imprimir ( factor de agua ) mensaje ( "\nFactor de polímero:" ) imprimir ( Factor de polímero ) mensaje ( "\nTratamiento Producto cartesiano:" ) imprimir ( tratamientoProductocartesiano )
Producción:
Factor de agua: [1] ninguno ligero medio Niveles: ninguno ligero medioFactor de polímero: [1] no usado usado Niveles: no usado usadoTratamiento Producto cartesiano: Var1 Var2 1 ninguno no usado 2 ligero no usado 3 medio no usado 4 ninguno usado 5 ligero usado 6 medio usado
Programa R para almacenar y mostrar los resultados:
Unidad experimental <- c ( "cactus1" , "cactus2" , "cactus3" ) replicateWater <- c ( "none" , "light" , "medium" ) replicatePolymer <- c ( "notUsed" , "used" , "notUsed" ) replicatePulgadas <- c ( 82L , 83L , 84L ) respuesta <- data.frame ( unidad experimental , replicarAgua , replicarPolímero , replicarPulgadas ) imprimir ( respuesta )
Producción:
experimentalReplica de unidadReplica de aguaReplica de polímeroPulgadas 1 cactus1 ninguno no usado 82 2 cactus2 ligero usado 83 3 cactus3 mediano no usado 84
Un marco de datos almacena una matriz bidimensional. [41] La dimensión horizontal es una lista de vectores. La dimensión vertical es una lista de filas. Es la estructura más útil para el análisis de datos . [42] Los marcos de datos se crean usando la data.frame()
función. La entrada es una lista de vectores (de cualquier tipo de datos). Cada vector se convierte en una columna de una tabla . Los elementos de cada vector están alineados para formar las filas de la tabla.
programa R :
entero <- c ( 82L , 83L ) cadena <- c ( "hola" , "mundo" ) data.frame <- data.frame ( entero , cadena ) print ( data.frame ) mensaje ( "Tipo de datos:" ) clase ( marco de datos )
Producción:
cadena entera 1 82 hola 2 83 mundo Tipo de datos: [1] "data.frame"
Los marcos de datos se pueden deconstruir proporcionando el nombre de un vector entre corchetes dobles. Esto devuelve el vector original. Se puede acceder a cada elemento del vector devuelto mediante su número de índice.
Programa R para extraer la palabra "mundo". Se almacena en el segundo elemento del vector "cadena":
entero <- c ( 82L , 83L ) cadena <- c ( "hola" , "mundo" ) marco.datos <- marco.datos ( entero , cadena ) vector <- marco.datos [[ "cadena" ]] imprimir ( vector [ 2 ] ) mensaje ( "Tipo de datos:" ) tipo de ( vector )
Producción:
[1] "mundo" Tipo de datos: [1] "carácter"
La codificación vectorizada es un método para producir programas informáticos R de calidad que aprovechan las fortalezas de R. [43] El lenguaje R está diseñado para ser rápido en pruebas lógicas, subconjuntos y ejecución de elementos. [43] Por otro lado, R no tiene un bucle rápido. [44] Por ejemplo, R puede buscar y reemplazar más rápido usando vectores lógicos que usando un bucle. [44]for
for
Un for
bucle repite un bloque de código durante una cantidad específica de iteraciones . [45]
Ejemplo de búsqueda y reemplazo usando un for
bucle:
vector <- c ( "uno" , "dos" , "tres" ) for ( i en 1 : longitud ( vector ) ) { if ( vector [ i ] == "uno" ) { vector [ i ] <- "1" } } mensaje ( "Vector reemplazado:" ) imprimir ( vector )
Producción:
Vector reemplazado: [1] "1" "dos" "tres"
La sintaxis de R permite utilizar un vector lógico como índice de un vector. [46] Este método se llama subconjunto . [47]
Ejemplo de R :
vector <- c ( "uno" , "dos" , "tres" ) imprimir ( vector [ c ( VERDADERO , FALSO , VERDADERO ) ] )
Producción:
[1] "uno" "tres"
R permite que el operador de asignación <-
sobrescriba un valor existente en un vector utilizando un número de índice. [28]
Ejemplo de R :
vector <- c ( "uno" , "dos" , "tres" ) vector [ 1 ] <- "1" imprimir ( vectorial )
Producción:
[1] "1" "dos" "tres"
R también permite que el operador de asignación <-
sobrescriba un valor existente en un vector utilizando un vector lógico .
Ejemplo de R :
vector <- c ( "uno" , "dos" , "tres" ) vector [ c ( VERDADERO , FALSO , FALSO ) ] <- "1" imprimir ( vectorial )
Producción:
[1] "1" "dos" "tres"
Debido a que se puede utilizar un vector lógico como índice y a que el operador lógico devuelve un vector, se puede realizar una búsqueda y reemplazo sin un for
bucle.
Ejemplo de R :
vector <- c ( "uno" , "dos" , "tres" ) vector [ vector == "uno" ] <- "1" imprimir ( vectorial )
Producción:
[1] "1" "dos" "tres"
Una función es un objeto que almacena código de computadora en lugar de datos . [48] El propósito de almacenar código dentro de una función es poder reutilizarlo en otro contexto. [48]
R viene con más de 1000 funciones nativas para realizar tareas comunes. [49] Para ejecutar una función:
(
)
En este ejemplo se tira un dado una vez. El nombre de la función nativa es sample()
. Los datos a tratar son:
size
parámetro indica sample()
ejecutar el rollo una vezmuestra ( 1 : 6 , tamaño = 1 )
Posible salida:
[dieciséis
El intérprete de R proporciona una pantalla de ayuda para cada función nativa. La pantalla de ayuda aparece después de escribir un signo de interrogación seguido del nombre de la función:
? muestra
Salida parcial:
Descripción: 'muestra' toma una muestra del tamaño especificado de los elementos de 'x' usando con o sin reemplazo.Uso: muestra (x, tamaño, reemplazar = FALSO, prob = NULL)
La sample()
función tiene disponibles cuatro parámetros de entrada . Los parámetros de entrada son piezas de información que controlan el comportamiento de la función. Los parámetros de entrada se pueden comunicar a la función mediante una combinación de tres formas:
Por ejemplo, cada una de estas llamadas a sample()
lanzará un dado una vez:
muestra ( 1 : 6 , 1 , F , NULL ) muestra ( 1 : 6 , 1 ) muestra ( 1 : 6 , tamaño = 1 ) muestra ( tamaño = 1 , x = 1 : 6 )
Cada parámetro de entrada tiene un nombre. [50] Si una función tiene muchos parámetros, la configuración name = data
hará que el código fuente sea más legible. [51] Si se omite el nombre del parámetro, R coincidirá con los datos en el orden de posición. [51] Por lo general, los parámetros que rara vez se utilizan tendrán un valor predeterminado y pueden omitirse.
La salida de una función puede convertirse en la entrada de otra función. Esta es la base para el acoplamiento de datos . [52]
Este ejemplo ejecuta la función sample()
y envía el resultado a la función sum()
. Simula la tirada de dos dados y los suma.
suma ( muestra ( 1 : 6 , tamaño = 2 , reemplazar = VERDADERO ) )
Posible salida:
[1] 7
Una función tiene parámetros típicamente para ingresar datos. Alternativamente, una función (A) puede usar un parámetro para ingresar otra función (B). La función (A) asumirá la responsabilidad de ejecutar la función (B).
Por ejemplo, la función replicate()
tiene un parámetro de entrada que es un marcador de posición para otra función. Este ejemplo se ejecutará una replicate()
vez y cinco veces. Simulará lanzar un dado cinco veces:replicate()
sample()
replicar ( 5 , muestra ( 1 : 6 , tamaño = 1 ) )
Posible salida:
[1] 2 4 1 4 5
Debido a que es igualmente probable que cada cara de un dado aparezca en la parte superior, lanzar un dado muchas veces genera una distribución uniforme . [53] Este ejemplo muestra un histograma de un dado lanzado 10.000 veces:
hist ( replicar ( 10000 , muestra ( 1 : 6 , tamaño = 1 ) ) )
Es probable que la salida tenga una parte superior plana:
Mientras que un conjunto de datos numéricos puede tener una tendencia central , también puede no tener una tendencia central. No obstante, un conjunto de datos de la media aritmética de muchas muestras tendrá una tendencia central a converger a la media de la población. La media aritmética de una muestra se llama media muestral . [54] El teorema del límite central establece que para un tamaño de muestra de 30 o más, la distribución de la media muestral ( ) tiene una distribución aproximadamente normal , independientemente de la distribución de la variable bajo consideración ( ). [55] Un histograma que muestra una frecuencia de promedios de puntos de datos mostrará que la distribución de la media de la muestra se asemeja a una curva en forma de campana .
Por ejemplo, lanzar un dado muchas veces genera una distribución uniforme . No obstante, tirar 30 dados y calcular cada promedio ( ) una y otra vez genera una distribución normal.
Programa R para tirar 30 dados 10.000 veces y trazar la frecuencia de los promedios:
hist ( replicar ( 10000 , media ( muestra ( 1 : 6 , tamaño = 30 , reemplazar = T ) ) ) )
Es probable que la salida tenga forma de campana:
Para crear un objeto de función, ejecute la function()
declaración y asigne el resultado a un nombre. [56] Una función recibe entradas tanto de variables globales como de parámetros de entrada (a menudo llamados argumentos). Los objetos creados dentro del cuerpo de la función permanecen locales para la función.
Programa R para crear una función:
# Los parámetros de entrada son xey. # El valor de retorno es un vector doble numérico. f <- función ( x , y ) { primera_expresión <- x * 2 segunda_expresión <- y * 3 primera_expresión + segunda_expresión # La declaración de devolución se puede omitir # si la última expresión no está asignada. # Esto ahorrará algunos ciclos de reloj. }
Salida de uso:
> f ( 1 , 2 ) [1] 8
Los argumentos de la función se pasan por valor .
Programa R que ilustra declaraciones if :
mínimo <- función ( a , b ) { si ( a < b ) mínimo <- a else mínimo <- b devolución ( mínimo ) } máximo <- función ( a , b ) { si ( a > b ) máximo <- a else máximo <- b retorno ( máximo ) } rango <- función ( a , b , c ) { rango <- máximo ( a , máximo ( b , c ) ) - mínimo ( a , mínimo ( b , c ) ) retorno ( rango ) } rango ( 10 , 4 , 7 )
Producción:
[dieciséis
R admite funciones genéricas . Actúan de manera diferente según la clase del argumento pasado. El proceso consiste en enviar el método específico de la clase. Una implementación común es la función de R. print()
Puede imprimir casi todas las clases de objetos. Por ejemplo, print(objectName)
. [57]
R proporciona tres atajos notables disponibles para los programadores.
Si un objeto está presente en una línea por sí solo, entonces el intérprete enviará el objeto a la print()
función. [58]
Ejemplo de R :
entero <- 82L entero
Producción:
[1] 82
Si una función creada por el programador omite la return()
declaración , entonces el intérprete devolverá la última expresión no asignada . [59]
Ejemplo de R :
f <- function () { # No asignar la expresión a un objeto. 82L + 1L }
Salida de uso:
> f () [1] 83
El símbolo -par <-
asigna un valor a un objeto. [28] Alternativamente, =
se puede utilizar como operador de asignación. Sin embargo, se debe tener cuidado porque =
se parece mucho al operador lógico de igualdad, que es ==
. [60]
Ejemplo de R :
entero = 82L imprimir ( entero )
Producción:
[1] 82
Si un conjunto de datos numéricos tiene una tendencia central , también puede tener un histograma de apariencia simétrica , una forma que se asemeja a una campana. Si un conjunto de datos tiene un histograma aproximadamente en forma de campana, se dice que tiene una distribución normal . [61]
En 1817, un contratista del ejército escocés midió el tamaño del pecho de 5.732 miembros de una unidad de la milicia . La frecuencia de cada tamaño fue: [62]
R tiene la write.csv()
función de convertir un marco de datos en un archivo CSV .
Programa R para crear chestsize.csv:
tamaño del pecho <- c ( 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 ) frecuencia <- c ( 3 , 19 , 81 , 189 , 409 , 753 , 1062 , 1082 , 935 , 646 , 313 , 168 , 50 , 18 , 3 , 1 ) dataFrame <- data.frame ( tamaño del cofre , frecuencia ) write.csv ( dataFrame , file = "chestsize.csv" , # De forma predeterminada, write.csv() crea la primera columna como número de fila. row.names = FALSE )
El primer paso en la ciencia de datos es importar un conjunto de datos. [63]
Programa R para importar chestsize.csv en un marco de datos:
marco de datos <- read.csv ( "chestsize.csv" ) imprimir ( marco de datos )
Producción:
Frecuencia del tamaño del pecho 1 33 3 2 34 19 3 35 81 4 36 189 5 37 409 6 38 753 7 39 1062 8 40 1082 9 41 935 10 42 646 11 43 313 12 44 168 13 45 50 14 46 18 15 47 3 16 48 1
El segundo paso en la ciencia de datos es transformar los datos al formato que esperan las funciones. [63] El conjunto de datos sobre el tamaño del pecho se resume en frecuencia; sin embargo, las funciones de distribución normal de R requieren un doble vector numérico.
Función R para convertir un marco de datos resumido a frecuencia en un vector:
# Nombre de archivo: frecuenciaDataFrameToVector.RfrecuenciaDataFrameToVector <- function ( dataFrame , dataColumnName , frecuenciaColumnName = "frecuencia" ) { dataVector <- dataFrame [[ dataColumnName ]] frecuenciaVector <- dataFrame [[ frecuenciaColumnName ]] vectorIndex <- 1 frecuenciaIndex <- 1 vector <- NA for ( dato en vector de datos ) { frecuencia <- Vector de frecuencia [ índice de frecuencia ] for ( i en 1 : frecuencia ) { vector [ vectorIndex ] <- datum vectorIndex <- vectorIndex + 1 } índice de frecuencia <- índice de frecuencia + 1 } retorno ( vector ) }
R tiene la source()
función de incluir otro archivo fuente de R en el programa actual.
Programa R para cargar y mostrar un resumen del conjunto de datos de 5732 miembros:
fuente ( "frequencyDataFrameToVector.R" ) marco de datos <- read.csv ( "chestsize.csv" ) ChestSizeVector <- frecuenciaDataFrameToVector ( dataFrame , "pecho" ) mensaje ( "Cabeza:" ) cabeza ( pechoTamañoVector ) mensaje ( "\nCola:" ) cola ( pechoSizeVector ) mensaje ( "\nCount:" ) longitud ( chestSizeVector ) mensaje ( "\nMean:" ) significa ( chestSizeVector ) mensaje ( "\nDesviación estándar:" ) sd ( ChestSizeVector )
Producción:
Cabeza: [1] 33 33 33 34 34 34Cola: [1] 46 46 47 47 47 48Conteo: [1] 5732Media: [1] 39,84892Desviación estándar: [1] 2,073386
El tercer paso en la ciencia de datos es visualizar el conjunto de datos. [63] Si un histograma de un conjunto de datos se asemeja a una forma de campana, entonces está distribuido normalmente . [61]
Programa R para mostrar un histograma del conjunto de datos:
fuente ( "frequencyDataFrameToVector.R" ) marco de datos <- read.csv ( "chestsize.csv" ) ChestSizeVector <- frecuenciaDataFrameToVector ( dataFrame , "pecho" ) hist ( pechoTamañoVector )
Producción:
Cualquier variable ( ) en un conjunto de datos se puede convertir en una variable estandarizada ( ). La variable estandarizada también se conoce como puntuación z. [64] Para calcular la puntuación z, reste la media y divida por la desviación estándar . [sesenta y cinco]
Función R para convertir una medición en una puntuación z:
# Nombre de archivo: zScore.RzScore <- función ( medición , media , desviación estándar ) { ( medición - media ) / desviación estándar }
Programa R para convertir una medida del tamaño del pecho de 38 en una puntuación z:
fuente ( "zScore.R" ) imprimir ( zScore ( 38 , 39.84892 , 2.073386 ) )
Producción:
[1] -0,8917394
Programa R para convertir una medida del tamaño del pecho de 42 en una puntuación z:
fuente ( "zScore.R" ) imprimir ( zScore ( 42 , 39.84892 , 2.073386 ) )
Producción:
[1] 1.037472
Un conjunto de datos estandarizado es un conjunto de datos en el que cada miembro de un conjunto de datos de entrada se ejecutó a través de la zScore
función.
Función R para convertir un vector numérico en un vector de puntuación z:
# Nombre de archivo: zScoreVector.Rfuente ( "zScore.R" ) zScoreVector <- función ( vector ) { zScoreVector = NA for ( i en 1 : longitud ( vector ) ) { zScoreVector [ i ] <- zScore ( vector [ i ], media ( vector ), sd ( vector ) ) } retorno ( zScoreVector ) }
Programa R para estandarizar el conjunto de datos del tamaño del cofre:
fuente ( "frequencyDataFrameToVector.R" ) fuente ( "zScoreVector.R" ) marco de datos <- read.csv ( "chestsize.csv" ) ChestSizeVector <- frecuenciaDataFrameToVector ( dataFrame , dataColumnName = "pecho" ) zScoreVector <- zScoreVector ( pechoTamañoVector ) mensaje ( "Cabeza:" ) cabeza ( zScoreVector ) mensaje ( "\nTail:" ) tail ( zScoreVector ) mensaje ( "\nCount:" ) longitud ( zScoreVector ) mensaje ( "\nMean:" ) ronda ( mean ( zScoreVector ) ) mensaje ( "\nDesviación estándar:" ) sd ( zScoreVector ) histórico ( zScoreVector )
Producción:
Cabeza : [ 1 ] -3.303253 -3.303253 -3.303253 -2.820950 -2.820950 -2.820950 Cola : [ 1 ] 2.966684 2.966684 3.448987 3.448987 3.448987 3.931290 Conteo : [ 1 ] 5732 Media : [ 1 ] 0 Desviación estándar : [ 1 ] 1
Un histograma de un conjunto de datos distribuido normalmente que se convierte a su conjunto de datos estandarizado también se asemeja a una curva en forma de campana. La curva se llama curva normal estándar o curva z . Las cuatro propiedades básicas de la curva z son: [66]
La probabilidad de que una medición futura sea un valor entre un rango designado es igual al área bajo la curva normal estándar de las dos puntuaciones z del rango designado . [67]
Por ejemplo, supongamos que el intendente de la milicia escocesa quisiera abastecerse de uniformes. ¿Cuál es la probabilidad de que el próximo recluta necesite una talla entre 38 y 42?
programa R :
biblioteca ( tigrestats ) fuente ( "frequencyDataFrameToVector.R" ) fuente ( "zScore.R" ) marco de datos <- read.csv ( "chestsize.csv" ) ChestSizeVector <- frecuenciaDataFrameToVector ( dataFrame , dataColumnName = "pecho" ) zScore38 <- zScore ( 38 , media ( chestSizeVector ), sd ( chestSizeVector ) ) zScore42 <- zScore ( 42 , media ( chestSizeVector ), sd ( chestSizeVector ) ) areaLeft38 <- tigrestats :: pnormGC ( zScore38 ) areaLeft42 <- tigrestats :: pnormGC ( zScore42 ) áreaEntre <- áreaIzquierda42 - áreaIzquierda38 mensaje ( "Probabilidad:" ) imprimir ( áreaEntre )
Producción:
Probabilidad: [1] 0,6639757
La pnormGC()
función puede calcular la probabilidad entre un rango sin calcular primero la puntuación z.
programa R :
fuente de la biblioteca ( tigrestats ) ( "frequencyDataFrameToVector.R" ) marco de datos <- read.csv ( "chestsize.csv" ) ChestSizeVector <- frecuenciaDataFrameToVector ( dataFrame , dataColumnName = "pecho" ) areaBetween <- Tigerstats :: pnormGC ( c ( 38 , 42 ), media = media ( pechoTamañoVector ), sd = sd ( pechoTamañoVector ), región = "entre" , gráfico = VERDADERO ) mensaje ( "Probabilidad:" ) imprimir ( áreaEntre )
Producción:
Probabilidad: [1] 0,6639757
Los paquetes R son colecciones de funciones, documentación y datos que expanden R. [68] Por ejemplo, los paquetes agregan funciones de informes como RMarkdown , knitr y Sweave . La fácil instalación y uso de paquetes han contribuido a la adopción del lenguaje en la ciencia de datos . [69]
La Comprehensive R Archive Network (CRAN) fue fundada en 1997 por Kurt Hornik y Fritz Leisch para alojar el código fuente , los archivos ejecutables, la documentación y los paquetes creados por el usuario de R. [70] Su nombre y alcance imitan la Red Integral de Archivos TeX y la Red Integral de Archivos Perl . [70] CRAN originalmente tenía tres espejos y 12 paquetes contribuidos. [71] A diciembre de 2022, tiene 103 espejos [72] y 18.976 paquetes contribuidos. [73] Los paquetes también están disponibles en los repositorios R-Forge, Omegahat y GitHub.
Las Vistas de tareas en el sitio web de CRAN enumeran paquetes en campos como finanzas, genética, informática de alto rendimiento, aprendizaje automático, imágenes médicas, metanálisis , ciencias sociales y estadísticas espaciales.
El proyecto Bioconductor proporciona paquetes para análisis de datos genómicos, ADN complementario , microarrays y métodos de secuenciación de alto rendimiento .
Los paquetes agregan la capacidad de implementar varias técnicas estadísticas como modelado lineal , lineal generalizado y no lineal , pruebas estadísticas clásicas , análisis espacial , análisis de series temporales y agrupación .
El paquete tidyverse está organizado para tener una interfaz común. Cada función del paquete está diseñada para acoplar todas las demás funciones del paquete. [68]
La instalación de un paquete se produce sólo una vez. Para instalar tidyverse : [68]
> instalar.paquetes ( "tidyverse" )
Para crear una instancia de las funciones, datos y documentación de un paquete, ejecute la library()
función. Para crear una instancia de tidyverse : [d]
> biblioteca ( tidyverse )
R viene instalado con una consola de línea de comandos . Disponibles para instalación hay varios entornos de desarrollo integrados (IDE). Los IDE para R incluyen R.app (solo OSX/macOS), Rattle GUI , R Commander , RKWard , RStudio y Tinn-R.
Los IDE de uso general que admiten R incluyen Eclipse a través del complemento StatET y Visual Studio a través de R Tools para Visual Studio .
Los editores que admiten R incluyen Emacs , Vim a través del complemento Nvim-R, Kate , LyX a través de Sweave , WinEdt (sitio web) y Jupyter (sitio web).
Los lenguajes de scripting que admiten R incluyen Python (sitio web), Perl (sitio web), Ruby (código fuente), F# (sitio web) y Julia (código fuente).
Los lenguajes de programación de propósito general que admiten R incluyen Java a través del servidor de socket Rserve y .NET C# (sitio web).
Los marcos estadísticos que utilizan R en segundo plano incluyen Jamovi y JASP .
El R Core Team se fundó en 1997 para mantener el código fuente de R. La Fundación R para Computación Estadística se fundó en abril de 2003 para brindar apoyo financiero. El R Consortium es un proyecto de la Fundación Linux para desarrollar la infraestructura R.
R Journal es una revista académica de acceso abierto que presenta artículos de corta y mediana extensión sobre el uso y desarrollo de R. Incluye artículos sobre paquetes, consejos de programación, noticias de CRAN y noticias sobre fundamentos.
La comunidad R organiza muchas conferencias y reuniones en persona. Estos grupos incluyen:
La implementación principal de R está escrita principalmente en C , Fortran y el propio R. Otras implementaciones incluyen:
Microsoft R Open (MRO) fue una implementación de R. A partir del 30 de junio de 2021, Microsoft comenzó a eliminar gradualmente MRO en favor de la distribución CRAN. [76]
Aunque R es un proyecto de código abierto , algunas empresas brindan soporte comercial:
Nos propusimos desarrollar un lenguaje suficiente para impartir cursos de introducción a la estadística en Auckland.
El coeficiente de determinación siempre está entre 0 y 1...
Un script R es simplemente un archivo de texto sin formato en el que se guarda el código R.
Los marcos de datos son la versión bidimensional de una lista.
Son, de lejos, la estructura de almacenamiento más útil para el análisis de datos[.]
R llama a imprimir cada vez que muestra un resultado en la ventana de su consola.
R ejecutará todo el código del cuerpo y luego devolverá el resultado de la última línea de código.
Tenga cuidado de no confundir=
con==
.=
hace lo mismo que<-
.
El lenguaje R y el software relacionado desempeñan un papel importante en la informática para la ciencia de datos.
... Los paquetes R proporcionan herramientas para una amplia gama de propósitos y usuarios.