Mayarin López
Monday, March 14, 2016
Programación .
En esta oportunidad se revisa la programación de funciones, así como las interacciones con el sistema operativo subyacente.
x = numeric(20) # crea un marcador de posición
for (i in 1:length(x)) { x[i] = rnorm(1)} # Esto es lento e ineficiente!!
x
## [1] 1.03701489 0.63676578 0.87394214 -1.91471347 1.95128790
## [6] 0.57468438 1.46748014 -0.42792935 -0.06008890 -0.75664657
## [11] 0.04074740 1.39438864 0.36082759 -0.59889041 -0.60244242
## [16] -0.08609336 -0.59302040 -0.70851342 0.19352522 0.04219452
#o (preferiblemente)
x = rnorm(20) # Esto es mucho mejor
x
## [1] 1.20816075 0.26074399 1.09399517 -1.35086698 0.32531743
## [6] 2.97020245 0.38169584 -0.85285243 -0.03321607 1.75742207
## [11] -1.76747594 0.60863312 -1.32906293 0.45874558 -0.99899449
## [16] 1.38138922 -0.20499625 0.49393229 0.16700635 2.22825025
if (expression1) { expression2 }
o
if (expression1) { expression2 } else { expression3 }
o
ifelse(expression, x, y)
Nota: La sentencia if, con o sin más, pone a prueba una sola instrucción lógica; . Si expression1 se evalúa como VERDADERA, entonces expression2 se evalua. La función ifelse() actúa en vectores y evalúa la expresión dada como expresión y devuelve x si es cierto en caso contrario devuelve y.
-Ejemplo (if (expression1) { expression2 })
x=25
if (sqrt(x)>4) {y=x+11}
y
## [1] 36
a=10
b=15
if (a+b==25) { c=sqrt(a+b) } else { c=a}
c
## [1] 5
#o
if (a+b==35) { d=sqrt(a+b) } else { d=a}
d
## [1] 10
r=12
q=14
ifelse(r+q==26, r-q, q)
## [1] -2
#o
r=12
q=14
ifelse(r+q==36, r-q, q)
## [1] 14
A menudo es útil para generar una variable que consta de una secuencia de valores (por ejemplo, los números enteros de 1 a 100) o un patrón de valores (1 1 1 2 2 2 3 3 3). Esto podría ser necesario para generar una variable que consta de un conjunto de valores repetidos para su uso en una simulación o pantalla gráfica. A modo de ejemplo, se demuestra la generación de los datos de un modelo de regresión lineal de la forma:
E [Y | X1, X2] = β0 + β1X1 + β2X2, V
Var (Y | X) = 9,
Corr (X1, X2) = 0 .
seq(from=1, to=15, length.out=6) # crea una sucesión equiespaciada de longitud 6, desde 1 hasta 15
## [1] 1.0 3.8 6.6 9.4 12.2 15.0
seq(from=1, to=15, by=5) # Crea una sucesión desde el 1 hasta el 15, en pasos de 5
## [1] 1 6 11
seq(1,15) # Genera una sucesión con los números del 1 al 15
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1:15 # Genera una sucesión con los números del 1 al 15
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
rep(115, times=3) #Repite el 115, 3 veces
## [1] 115 115 115
#or
rep(115, each=3) #Repite el 115, 3 veces
## [1] 115 115 115
n = 200
x1 = rep(c(0,1), each=n/2)
x2 = rep(c(0,1), n/2)
beta0 = -1;
beta1 = 1.5;
beta2 = .5;
rmse = 3
table(x1, x2) # la función table() use clasificación cruzadapara construir una tabla de contingencia de los recuentos en cada combinación de niveles de los factores.
## x2
## x1 0 1
## 0 50 50
## 1 50 50
y = beta0 + beta1*x1 + beta2*x2 + rnorm(n, mean=0, sd=rmse)
lm(y ~ x1 + x2)
##
## Call:
## lm(formula = y ~ x1 + x2)
##
## Coefficients:
## (Intercept) x1 x2
## -0.88152 1.83583 0.02587
A menudo es necesario ejecutar una función dada para una serie de variables. Aquí, el cuadrado de cada una de las variables de la lista se calcula como un ejemplo.
x1=c(1,2,3)
x2=c(2,4,6)
x3=c(3,6,9)
l1 = c("x1", "x2","x3")
l2 = c("z1", "z2","z3")
for (i in 1:length(l1)) {
assign(l2[i], eval(as.name(l1[i]))^2)
}
z1
## [1] 1 4 9
z2
## [1] 4 16 36
z3
## [1] 9 36 81
Puede ser útil para generar todas las combinaciones de dos o más vectores.
expand.grid(x1=1:3, x2=c("M", "F"))
## x1 x2
## 1 1 M
## 2 2 M
## 3 3 M
## 4 1 F
## 5 2 F
## 6 3 F
Nota: La función expand.grid () toma dos o más vectores o factores y devuelve un dataframe. El primer factor varía más rápido. El objeto resultante es una matriz.
Un punto fuerte de R es su extensibilidad. En esta sección, se proporciona una introducción a la definición y llamada de funciones . Una nueva función se define por el cuerpo de la función de sintaxis . El cuerpo se compone de una serie de comandos (o expresiones), normalmente separadas por saltos de línea y entre llaves. A continuación, creamos una función para calcular el intervalo de confianza
ci.calc = function(x, ci.conf=.95) {
sampsize = length(x)
tcrit = qt(1-((1-ci.conf)/2), sampsize - 1)
mymean = mean(x)
mysd = sd(x)
return(list(civals=c(mymean-tcrit*mysd/sqrt(sampsize),
mymean+tcrit*mysd/sqrt(sampsize)), ci.conf=ci.conf))
}