====== R ====== Es un lenguaje y entorno de programación para análisis estadístico y gráfico. \\ Existe un IDE para trabajar con el lenguaje denominado [[http://www.rstudio.org|RStudio]]. Para instalarlo en Ubuntu añadiremos el paquete ''r-base''. ===== Básico ===== ==== Funciones básicas ==== * ''dim(variable)'': Devuelve la dimensión de una variable (//filas x columnas//). * ''class(variable)'': Devuelve el tipo de datos que es la variable. * ''summary(variable)'': Devuelve un resúmen (máximos, mínimos, número de elementos de una categoría...) de una variable (matriz, data.frame...). Mostrar por pantalla: * ''print(variable)'': Muestra por pantalla un texto. * ''sprintf("formato", variables)'': Devuelve, **no lo muestra**, un string formateado. Strings: * ''s = paste(s, "Delta", sep="")'': Concatena al string ''s'' la palabra ''Delta'' con ninguna separación. Listas: * ''a = c(2, 3, 5)'': creará una lista de tres números. * ''a = c(c(2, 3, 5), 3)'': creará una lista de cuatro números. Trabajo con paquetes: Para la ayuda: * ''?? funcion'': Busca en la ayuda disponible los registros que casan con el nombre de esta función. * ''help funcion'': Muestra la ayuda para la función. ==== Variables ==== === Variables categóricas === En R son denominadas ''factor'' y sus categorías ''levels''. \\ \\ Podremos crear una variable categórica a partir de una que no lo es (asignando los distintos valores que tiene como levels) de la siguiente forma: Dictamen <- factor(Dictamen) Podremos ver los levels de una variable factor mediante: levels(Dictamen) Podremos cambiar los nombres de los levels mediante: levels(Dictamen) <- c("positiu","negatiu")'' === Operadores === * ''ifelse(a>0,a,0)'' : Operador ternario. ==== Conjuntos de datos ==== === Generación === * ''rep'': genera una serie de valores repeticas veces. > rep(1:4, 2) [1] 1 2 3 4 1 2 3 4 > rep (c(1,2), 2) [1] 1 2 1 2 > rep (0, 5) [1] 0 0 0 0 0 === Acciones sobre un conjunto de datos === Para cambiar los valores de un conjunto de datos lo podremos hacer como sigue (aquí cambia los registros de Ingressos que tengan valor 99999999 o 0 por NA): Ingressos[Ingressos == 99999999 | Ingressos == 0] <- NA Si en vez de convertirlos a NA los quisiesemos eliminar (el ejemplo elimina los registros que no tienen 0 ni en la columna 1, en la 3, en la 6 ni en la 8): dd <- dd[dd[,1] != 0 & dd[,3] != 0 & dd[,6] != 0 & dd[,8] != 0,] Si quisiesemos ver un conteo del contenido podríamos hacer (el ejemplo devuelve el número de registros que tienen en la columna 1 un 0): table(dd[,1]==0) Contar el número de elementos que tienen en la primera variable el valor concreto... sum(datos[,1] == 2) Seaparar unos datos ''Data'' en dos tablas y de forma aleatoria: learn <- sample(1:150, 75) mydata.learn <- Data[learn, ] mydata.test <- Data[-learn, ] Para conocer el número de filas y de columnas de un conjunto de datos utilizaremos la funcion ''nrow'' y ''ncol'' respectivamente. \\ La función ''rbind'' te permite concatenar dos conjuntos de datos, el segundo después del primero. \\ Podemos recoger un subconjunto si, por ejemplo, tenemos en una variable ''idxs'' los indices así: ''sub <- conjunto[idxs]''. O el subconjunto negativo restante ''sub <- conjunto[-idxs]''. === Vectores y matrices === Creación de una matriz: > A <- matrix ( c (1 ,2 ,3 ,4) ,2 ,2 , byrow = TRUE ) > A [,1] [,2] [1,] 1 2 [2,] 3 4 > a <- matrix ( c (1 ,2 ,3 ,4) ,4 ,1) > a [,1] [1,] 1 [2,] 2 [3,] 3 [4,] 4 * ''scale(X)'' centra y reduce (normaliza) la matriz X. * Para aplicar una función sobre una matriz utilizaremos ''apply''. Esta recibe como primer parámetro la matriz, como segundo sobre qué se aplicará (1 = filas, 2 = columnas, ''c(1,2)'' = filas y columnas) y la función: ''apply (x, 2, sum)''. * Con la combinación de signos ''%*%'' podemos hacer el //dot product// (producto escalar) :?: (no sé si es dot product o scalar product, también existe %o%). * ''diag(x)'' recibe un vector x y lo coloca como diagonal en una matriz de 0. * ''t(x)'' recoge la matriz traspuesta de x. === Data Frame === Para crear un Data Frame a partir de dos vectores de dimensión igual: dd <- data.frame(x,y) Para leer un archivo de datos (un csv separado por tabs, columnas...) y cargarlo en un data.frame usaremos: datos <- read.table("alpha.csv",header=T) * ''attributes (var)'': Devuelve las propiedades\acciones que se pueden hacer sobre el dataframe var. * ''names(var)'': Devuelve los nombres de las columnas del data frame. * ''variable$nombre_columna'': Acceso a una columna del dataframe. Mediante ''attach(var)'' haremos accesibles (sin necesidad de acceder por dataframe$columna sino como variables) las columnas del data frame. \\ Para eliminar una columna de un data frame: ''datos$beta2=NULL'' \\ ==== Control de flujo ==== === If === if(datos$beta1[i]==1) producto_preferido[i] = 1 === Bucle for === producto_preferido <- nrow(252) for (i in 1:252) { producto_preferido[i]=NA if(datos$beta1[i]==1) producto_preferido[i] = 1 } > for (i in 1:10) { print(c(sum(datos[,i] == 1) / nrow(datos), sum(datos[,i] == 2) / nrow(datos))); } === Funciones === Para crear la función ''p.xk'' a la que se le pasan dos parámetros, lo que devuelve es el resultado de último comando ejecutado. p.xk <- function(vec,fac){nk <- as.vector(table(fac)); n <- sum(nk); xk <- tapply(vec,fac,mean); txk <- (xk-mean(vec))/(sd(vec)*sqrt((n-nk)/(n*nk))); pxk <- pt(txk,n-1,lower.tail=F)} Si en una función queremos devolver datos complejos haremos lo siguiente, esto sería: ''cv = cvalidation(datos); cv$learn;'' cvalidation = function (dframe) { nregs = nrow(dframe); nind_group = nregs/10; ilearn = sample(1:nregs, nind_group * 9); dlearn <- dframe[ilearn,]; dtest <- dframe[-ilearn,]; list(learn = dlearn, test = dtest); } ==== Usar datos externos ==== * ''try(data())'' devuelve los paquetes de datos disponibles. * ''data(iris3)'' carga los datos de iris3. Por ejemplo, para trabajar con ellas: data(iris3) Data <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]), Sp = rep(c("s","c","v"), rep(50,3))) ===== Estadística ===== ==== Básico ==== Generación de una distribución normal: x <- rnorm(50) Recoger la desviación estándard de una matriz, un vector o un dataframe: sd(X) Aunque también podríamos sacarlas (pero centradas con ''center'' o escaladas con el vector unidad con ''scale'') con: pc1 = prcomp(X, scale=T) pc1$sdev ==== Objetos estadísticos ==== === Regresión linear (lm) === Para crear un objeto "regresión linear" a partir de las columnas x,y de un dataframe deberemos indicarlo con ''~'': reg1 <- lm(dd$y ~ dd$x, data=dd) === Regresión local (loess) === reg2 <- loess(y ~ x, data=dd) ===== Gráficos ===== ==== Funciones ==== * ''plot(x)'': Muestra en un gráfico de puntos los elentos de x. Podríamos hacer también ''plot(x,y)'', que sería poner x en función de y. * ''hist(x)'': Muestra en un histograma la forma de x. ==== Como... ==== * **Hacer plots 3d**: los encontrarás en el paquete ''rgl''. Contiene funciones como ''plot3d''... ===== Data Mining & Machine Learning ===== data(HouseVotes84, package="mlbench") model <- naiveBayes(Class ~ ., data = HouseVotes84) # Entrenamiento, predecir Class pred <- predict(model, HouseVotes84[,-1]) # Prediccion (sobre los mismos datos) table(pred, HouseVotes84$Class) # Tabla de confusión \ contingencia ==== Naïve Bayes ==== ===== Avanzado ===== ==== Funciones ==== === K nearest neighbors (knn) === En el package ''class'': aux = datos[,-10] # Volcado de los datos menos la columna Ingressos aux1 = aux[!is.na(Ingressos),] # Cogemos los Ingressos que no tienen NA de aux en aux1 aux2 = aux[is.na(Ingressos),] # Cogemos los Ingresos que tienen NA de aux knn.ing = knn(aux1,aux2,Ingressos[!is.na(Ingressos)]) # Hacemos el knn con los que no tienen NA sobre los que sí tienen Ingressos[is.na(Ingressos)] = knn.ing # Asignamos los nuevos valores ===== Notas ===== ==== Como... ==== === Crear una tabla === Denominada ''pvalk.con'' de ''nresp'' filas y ''ncon'' columnas y asignar los nombres de las columnas y las filas a partir de una categórica y de otra matriz: pvalk.con <- matrix(NA,nresp,ncon) rownames(pvalk.con) <- levels(tmp) colnames(pvalk.con) <- row.names(pvalcon) === Limpiar el workspace === rm(list=ls()) ==== Notas ==== * {{math_langs:matlabr.pdf|Comparación de MATLAB y R}}, sacada de [[http://www.math.umaine.edu/~hiebeler/comp/matlabR.html]].