Programación

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

Ejecución condicional

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

- Ejemplo (if (expression1) { expression2 } else { expression3 })

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

-Ejemplo (ifelse(expression, x, y))

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

- Secuencia de valores o patrones.

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

- Secuencia de valores o patrones.

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

-El código siguiente implementa el modelo descrito anteriormente para n = 200.

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

- Ejecutar una acción repetidamente sobre un conjunto de variables.

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

-Cuadrícula de valores

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.

Funciones

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)) 
  }