Usando R

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!