R como instrumento de trabajo japf 18/02/2015 Un ejemplo de uso Recta de calibrado I El problema I I Determinar al recta de calibrado para la determinación de fosfatos. Los datos I I 5 patrones de fosfato potásico (concentración en mM) 5 medidas de absorbancia > concentracion <- c( 0.01, 0.04, 0.08, 0.12, 0.16, 0.20 ) > absorbancia <- c( 0.187, 0.305, 0.478, 0.598, 0.738, 0.911 ) Datos tomados de Burguillo, FJ. Representación de los datos 0.10 0.05 concentracion 0.15 0.20 > plot( absorbancia, concentracion ) 0.2 0.4 0.6 absorbancia 0.8 Cálculo del modelo de regresión > lm( concentracion ~ absorbancia ) Call: lm(formula = concentracion ~ absorbancia) Coefficients: (Intercept) absorbancia -0.04172 0.26742 Informe del modelo > modelo <- lm( concentracion ~ absorbancia ) > summary( modelo ) Call: lm(formula = concentracion ~ absorbancia) Residuals: 1 0.0017087 2 3 0.0001527 -0.0061115 4 0.0017977 5 6 0.0043584 -0.0019059 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.041717 0.003978 -10.49 0.000467 *** absorbancia 0.267423 0.006742 39.66 2.41e-06 *** --Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.004067 on 4 degrees of freedom Multiple R-squared: 0.9975, Adjusted R-squared: 0.9968 F-statistic: 1573 on 1 and 4 DF, p-value: 2.414e-06 Representación del modelo 0.10 0.05 concentracion 0.15 0.20 > plot( absorbancia, concentracion ) > abline( modelo ) 0.2 0.4 0.6 absorbancia 0.8 Alternativas: hoja de cálculo Alternativas: hoja de cálculo > > > > > > > > > concentracion <- c( 0.01, 0.04, 0.08, 0.12, 0.16, 0.20 ) absorbancia <- c( 0.187, 0.305, 0.478, 0.598, 0.738, 0.911 ) lm( concentracion ~ absorbancia ) modelo <- lm( concentracion ~ absorbancia ) summary( modelo ) plot( absorbancia, concentracion ) abline( modelo ) Generalizando > > > > > > > > > y <- c( 0.01, 0.04, 0.08, 0.12, 0.16, 0.20 ) x <- c( 0.187, 0.305, 0.478, 0.598, 0.738, 0.911 ) lm( y ~ x ) modelo <- lm( y ~ x ) summary( modelo ) plot( x, y ) abline( modelo ) Sintáxis de R: breve repaso Expresiones I I I I R evalúa expresiones. Las expresiones se escriben siguiendo una sintaxis precisa. Existe muchas alternativas para obtener un mismo resultado. Las expresiones contienen: I I I I I I valores objetos operadores funciones espacios en blanco ;-) En la expresiones, cualquier valor puede ser sustituido por una expresión. Valores numéricos > 0.021 [1] 0.021 > 1e6 [1] 1e+06 > as.integer( 1e6 ) [1] 1000000 > 1:10 [1] 1 2 3 4 5 6 7 8 9 10 Valores numéricos > seq( 0, pi, 0.1 ) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 [18] 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 > 1 / 0 [1] Inf > sqrt(as.complex( -9 ) ) [1] 0+3i > log( -1 ) Warning in log(-1): Se han producido NaNs [1] NaN Textos > "Casa" [1] "Casa" > "Casa" == "casa" [1] FALSE > paste ( "Casa", 1:10 ) [1] "Casa 1" [8] "Casa 8" "Casa 2" "Casa 9" "Casa 3" "Casa 4" "Casa 10" "Casa 5" "Casa 6" > read.table( "http://www.um.es/docencia/emc/datos/biom2003.dat" ) 1 2 3 4 5 6 7 Grupo Peso Altura Pie Hombros Brazos Caderas Sexo Ojos Tipo 1 60 163 37 41 68 95 1 1 2 1 52 166 37 37 70 87 1 2 1 1 61 172 39 39 69 91 1 2 1 1 73 181 43 50 78 101 2 2 1 1 53 172 39 39 72 89 1 1 1 1 63 169 40 37 66 96 1 2 1 1 55 170 38 43 74 97 1 2 1 "Cas Operadores aritméticos + - * > 3 + 2 * 5 [1] 13 > 3 + 2 * 1:5 [1] 5 7 9 11 13 > 3 + ( 2 * 1 ):5 [1] 5 6 7 8 > 1 / ( 2 * 5 ) [1] 0.1 > 1/ 2 / 5 [1] 0.1 / ˆ : %% %*% () ... Operadores lógicos == != > >= < > 3 == 2 [1] FALSE > 3 > 2 [1] TRUE > 3 > 2 & 5 %% 2 != 0 [1] TRUE > 1:5 > 2 [1] FALSE FALSE TRUE TRUE TRUE <= & | Objetos (variables) > concentracion [1] 0.01 0.04 0.08 0.12 0.16 0.20 > modelo Call: lm(formula = concentracion ~ absorbancia) Coefficients: (Intercept) absorbancia -0.04172 0.26742 > str( modelo ) List of 12 $ coefficients : Named ..- attr(*, "names")= $ residuals : Named ..- attr(*, "names")= $ effects : Named ..- attr(*, "names")= num chr num chr num chr [1:2] [1:2] [1:6] [1:6] [1:6] [1:6] -0.0417 0.2674 "(Intercept)" "absorbancia" 0.001709 0.000153 -0.006112 0.00179 "1" "2" "3" "4" ... -0.24903 0.1613 -0.00663 0.00123 0. "(Intercept)" "absorbancia" "" "" . Tipos de objetos: vectores > concentracion[ 1 ] [1] 0.01 > concentracion[ -1 ] [1] 0.04 0.08 0.12 0.16 0.20 > concentracion[ c( 1, 3 ) ] [1] 0.01 0.08 > v <- c( 3, 2, 7, 9 ) > v * 1:2 #reuso de elementos [1] 3 4 7 18 Tipos de objetos: matrices > matrix( 1:12, 3, 4 ) [1,] [2,] [3,] [,1] [,2] [,3] [,4] 1 4 7 10 2 5 8 11 3 6 9 12 > calibrado <- matrix( c( concentracion, absorbancia ), + length( absorbancia ) ) > t( calibrado ) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 0.010 0.040 0.080 0.120 0.160 0.200 [2,] 0.187 0.305 0.478 0.598 0.738 0.911 > calibrado[ 1:2, [,1] [,2] [1,] 0.01 0.187 [2,] 0.04 0.305 ] Tipos de objetos: data frames > calibrado <- data.frame( concentracion, absorbancia ) > calibrado 1 2 3 4 5 6 concentracion absorbancia 0.01 0.187 0.04 0.305 0.08 0.478 0.12 0.598 0.16 0.738 0.20 0.911 > calibrado[ 1, 1 ] concentracion absorbancia 0.01 0.187 > calibrado[ , 1 ] [1] 0.01 0.04 0.08 0.12 0.16 0.20 Tipos de objetos: data frames > calibrado$absorbancia [1] 0.187 0.305 0.478 0.598 0.738 0.911 > calibrado$absorbancia[ 1:3 ] [1] 0.187 0.305 0.478 > calibrado[ 1 ] 1 2 3 4 5 6 concentracion 0.01 0.04 0.08 0.12 0.16 0.20 Tipos de objetos: listas > names( modelo ) [1] "coefficients" "residuals" [5] "fitted.values" "assign" [9] "xlevels" "call" > modelo$model 1 2 3 4 5 6 concentracion absorbancia 0.01 0.187 0.04 0.305 0.08 0.478 0.12 0.598 0.16 0.738 0.20 0.911 > modelo$coefficients (Intercept) absorbancia -0.04171686 0.26742343 > modelo$residuals "effects" "qr" "terms" "rank" "df.residual" "model" Funciones > nomreDeLaFuncion( argumento1, argumento1, ... ) > seq( 0, 2, 0.1 ) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 [18] 1.7 1.8 1.9 2.0 > seq( from = 0, to = 2, by = 0.1 ) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 [18] 1.7 1.8 1.9 2.0 > seq( to = 2, by = 0.1, from = 0 ) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 [18] 1.7 1.8 1.9 2.0 I I Buscar funciones Una “chuelta” de funciones: R reference card V2 Datos: gráficas y tablas Ficheros de datos I Nombres: I I I I I I prohibidas las tildes, signos de puntuación, letras locales (ñ, ç, . . . ) tanto en el fichero y como en los directorios. desaconsejados los espacios en blanco Datos España (por regiones).csv extensión: .csv o .txt o .dat Mejor nombreDeFichero.csv que nombre_de_fichero.csv Se recomienda uso de localc como “editoR de datos” y para el manejo de ficheros .csv Prestar atención a los separadores de columnas (de campos) utilizados. Lectura de datos I Desde la pestaña files abrir el fichero calibrado.csv concentracion absorbancia 1 0.01 0.187 2 0.04 0.305 3 0.08 0.478 4 0.12 0.598 5 0.16 0.738 6 0.2 0.911 I Ejercicio I I I Supongamos que las observaciones 1, 2 y 3 fueron hechas PE y las dos últimas por PI. incluir esta información en el fichero como variable observador. Guardar los datos como calibrado3.csv (opción File > Save as) Lectura del fichero > calibrado3 <- read.table( "calibrado3.csv" ) > summary( calibrado3 ) concentracion Min. :4.600e-06 1st Qu.:9.100e-06 Median :1.370e-05 Mean :1.368e-05 3rd Qu.:1.820e-05 Max. :2.280e-05 absorbancia Min. :0.2717 1st Qu.:0.4929 Median :0.7254 Mean :0.7246 3rd Qu.:0.9531 Max. :1.1799 > calibrado3$observador [1] PE PE PE PI PI Levels: PE PI > as.character( calibrado3$observador ) [1] "PE" "PE" "PE" "PI" "PI" observador PE:3 PI:2 Lectura del fichero > biom <- read.table( "http://www.um.es/docencia/emc/datos/biom2003.dat" > names( biom ) [1] "Grupo" [8] "Sexo" "Peso" "Ojos" "Altura" "Tipo" "Pie" "Hombros" "Brazos" > head( biom ) 1 2 3 4 5 6 Grupo Peso Altura Pie Hombros Brazos Caderas Sexo Ojos Tipo 1 60 163 37 41 68 95 1 1 2 1 52 166 37 37 70 87 1 2 1 1 61 172 39 39 69 91 1 2 1 1 73 181 43 50 78 101 2 2 1 1 53 172 39 39 72 89 1 1 1 1 63 169 40 37 66 96 1 2 1 > aggregate( biom[ 2:7 ], list( biom$S ), mean ) 1 2 Group.1 Peso Altura Pie Hombros Brazos Caderas 1 58.48485 165.6364 38.10606 38.53030 69.77273 93.90909 2 72.81250 178.1250 42.71875 45.65625 75.21875 97.90625 "Cad Gráficos Curvas 0.0 −0.5 −1.0 sin(x) 0.5 1.0 > curve( sin, -pi, pi ) −3 −2 −1 0 x 1 2 3 Elementos gráficos 0.0 −0.5 −1.0 sen(α) 0.5 1.0 > curve( sin, -pi, pi, + xlab = expression( alpha ), + ylab = expression( sen( alpha ) ), + lwd = 3, col = "grey" ) > abline( h = 0, v = 0, col = "black" ) −3 −2 −1 0 α 1 2 3 Elementos gráficos > curve( sin, -pi, pi, + xlab = expression( alpha ), + ylab = expression( sen( alpha ) ), + lwd = 3, col = "grey", + main = "Función seno", asp = 1 ) > abline( h = 0, v = 0, col = "black" ) 0.0 −0.5 −1.0 −1.5 sen(α) 0.5 1.0 1.5 Función seno −3 −2 −1 0 α 1 2 3 Más curvas 0.2 0.1 0.0 dnorm(x) 0.3 0.4 > curve( dnorm, -4, 4 ) > abline( h = 0, v = qnorm( c( 0.025, 0.05, 0.1, 0.5, 0.9, 0.95, 0.975 ) −4 −2 0 x 2 4 Más elegancia en las curvas > > > + > > p <- c( 0.025, 0.05, 0.1, 0.5, 0.9, 0.95, 0.975 ) curve( dnorm, -4, 4, ylab = expression( f(x) ) ) title( main = expression( f(x) == frac( 1, ( sqrt( 2*pi ) * sigma ) ) e ^ -frac( x - mu, 2 * sigma^2)) ) abline( h = 0 ) segments( qnorm( p ), 0, qnorm( p ), dnorm( qnorm( p ) ) ) 1 ( 2πσ) x−µ − e 2σ2 0.2 0.1 0.0 f(x) 0.3 0.4 f(x) = −4 −2 0 2 4 Escalas logarítmicas N0 <- 2 R <- 1.7 t <- 1:25 N <- N0 * R ^ t plot( t, N, type = "l", lwd = 3 ) abline( h = seq( 0, max( N ), 1e5 ), v = seq( 0, max( t ), length.out = 6 ), col = "grey" ) 0 200000 N 600000 1000000 > > > > > > + + 5 10 15 20 25 Escalas logarítmicas plot( t, N, type = "l", log = "y", lwd = 3 ) for( i in 1:6 ) abline( h = seq( 10^(i-1), 10^i, length.out = 10 ), col = "grey" ) abline( v = seq( 0, max( t ), length.out = 6 ), col = "grey" ) lines( t, N, lwd = 3 ) 1e+01 N 1e+03 1e+05 > > + + > > 5 10 15 t 20 25 Datos representación > hist( biom$Altura, prob = TRUE ) > curve( dnorm(x, mean = mean( biom$Altura ), + sd = sd( biom$Altura ) ), add = TRUE ) 0.02 0.01 0.00 Density 0.03 0.04 Histogram of biom$Altura 150 160 170 biom$Altura 180 190 Datos representación > > + + > + > v <- biom$Altura # generalizando la solución hist( v, prob = TRUE, breaks = seq( min( v ) * 0.95, max( v ) * 1.05, length.out =10), ylim = c( 0, 0.05 ) ) curve( dnorm(x, mean = mean( v ), sd = sd ( v ) ), min( v ), max( v ), add = TRUE ) abline( v = 170, col = 3, lwd = 3 ) # representando una estatura dada 0.03 0.02 0.01 0.00 Density 0.04 0.05 Histogram of v Representando dos variables: scatterplot 170 160 150 biom$Altura 180 > plot( biom$Peso, biom$Altura, col = biom$Sexo, pch = 20 ) 40 50 60 70 biom$Peso 80 90 Solapamiento de puntos: alternativas 170 160 150 biom$Altura 180 > plot( biom$Peso, biom$Altura, col = biom$Sexo, + cex = biom$Sexo, pch = 20 ) 40 50 60 70 biom$Peso 80 90 Solapamiento de puntos: alternativas 170 160 150 biom$Altura 180 > plot( biom$Peso, biom$Altura, col = rgb( biom$Sexo/2, 0, 0, 0.5 ), + cex = 2, pch = 20 ) 40 50 60 70 biom$Peso 80 90 Solapamiento de puntos: alternativas 170 160 150 jitter(biom$Altura, 2) 180 > plot( jitter( biom$Peso, 2 ), jitter( biom$Altura, 2 ), + col = biom$Sexo, pch = 20 ) 40 50 60 70 jitter(biom$Peso, 2) 80 90 Solapamiento de puntos: alternativas seleccion <- biom$Sexo == 2 plot( biom$Peso, biom$Altura, type = "n" ) points( biom$Peso[ seleccion ], biom$Altura[ seleccion ], col = 2, pch = 20, cex = 2 ) points( biom$Peso[ !seleccion ], biom$Altura[ !seleccion ], col = 1, pch = 20 ) 170 160 150 biom$Altura 180 > > > + > + 40 50 60 70 biom$Peso 80 90 Boxplot 80 70 60 50 40 40 50 60 70 80 90 par( mfrow = c( 1, 2 ) ) boxplot( biom$Peso ~ biom$Sexo ) f <- factor( biom$Sexo, labels = c( "mujer", "hombre" ) ) boxplot( biom$Peso ~ f, col = c( "pink", "blue" ) ) 90 > > > > 1 2 mujer hombre Tablas > table( biom$Sexo, biom$Ojos ) 1 2 1 15 51 2 3 29 > biom$Sexo <- factor( biom$Sexo, labels = c( "mujer", "hombre" ) ) > biom$Ojos <- factor( biom$Ojos, labels = c( "claros", "oscuros" ) ) > ( tabSO <- table( biom$Sexo, biom$Ojos ) ) mujer hombre claros oscuros 15 51 3 29 Gráficos de tablas > colores <- c( "darkred", "red" ) > plot( tabSO, col = colores ) tabSO oscuros claros mujer hombre ¿Tablas? 1.8 1.6 1.4 1.2 1.0 0.8 jitter(as.integer(biom$Sexo)) 2.0 2.2 > plot( jitter(as.integer( biom$Tipo ) ), + jitter( as.integer (biom$Sexo) ), pch = 20, col = biom$Ojos ) 1.0 1.5 2.0 jitter(as.integer(biom$Tipo)) 2.5 3.0 Gráficos de tablas par( mfrow = c( barplot( tabSO, barplot( tabSO, barplot( tabSO, 1, 3 ) ) col = colores ) beside = TRUE, col = colores ) beside = TRUE, col = colores, horiz = TRUE ) 0 0 10 claros 20 20 40 30 60 40 oscuros 50 80 > > > > claros oscuros claros oscuros 0 10 20 30 40 50 Tabla de valores de probabilidad para la N(0, 1) > > > > > > z <- seq( 0, 3, by = 0.01 ) tabla <- pnorm( z )[ 1:300 ] tabPnormal <- matrix( tabla, byrow = TRUE, ncol = 10 ) colnames( tabPnormal ) <- paste( ".0", 0:9, sep = "" ) rownames( tabPnormal ) <- seq( 0, 2.9, 0.1 ) round( tabPnormal, 4 ) 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 .00 0.5000 0.5398 0.5793 0.6179 0.6554 0.6915 0.7257 0.7580 0.7881 0.8159 0.8413 0.8643 0.8849 0.9032 .01 0.5040 0.5438 0.5832 0.6217 0.6591 0.6950 0.7291 0.7611 0.7910 0.8186 0.8438 0.8665 0.8869 0.9049 .02 0.5080 0.5478 0.5871 0.6255 0.6628 0.6985 0.7324 0.7642 0.7939 0.8212 0.8461 0.8686 0.8888 0.9066 .03 0.5120 0.5517 0.5910 0.6293 0.6664 0.7019 0.7357 0.7673 0.7967 0.8238 0.8485 0.8708 0.8907 0.9082 .04 0.5160 0.5557 0.5948 0.6331 0.6700 0.7054 0.7389 0.7704 0.7995 0.8264 0.8508 0.8729 0.8925 0.9099 .05 0.5199 0.5596 0.5987 0.6368 0.6736 0.7088 0.7422 0.7734 0.8023 0.8289 0.8531 0.8749 0.8944 0.9115 .06 0.5239 0.5636 0.6026 0.6406 0.6772 0.7123 0.7454 0.7764 0.8051 0.8315 0.8554 0.8770 0.8962 0.9131 .07 0.5279 0.5675 0.6064 0.6443 0.6808 0.7157 0.7486 0.7794 0.8078 0.8340 0.8577 0.8790 0.8980 0.9147 .08 0.5319 0.5714 0.6103 0.6480 0.6844 0.7190 0.7517 0.7823 0.8106 0.8365 0.8599 0.8810 0.8997 0.9162 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. A modo de conclusiones Mucha información. . . disponible > > > > > > > ? plot ?? plot apropos( "*lot" ) example( jitter ) demo() vignette( "raster" ) data() I cran.r-project.org I I I I I Aplicaciones interactivas (shiny) Catálogo de gráficos Lista de correo de la UMU [email protected] ... Ayudate y te ayudarán I I I I I I I I I I Define los objetivos de los materiales a elaborar Decompon los objetivos en cuestiones sencillas y solubles Organiza adecuadamente los datos Busca en la red soluciones a problemas semejantes Genera tablas y gráficos desde R partiendo de los datos Evita las “chapuzas”: generaliza Usa librerías para ahorrar código (y errores) Pide ayuda (listas de usuarios) ... R no es un programa, es la clave para una forma de pensar Para terminar. . . . . . consigue tu certificado. . . de manejo básico de R en: tryR ¡Registrate!
© Copyright 2024