En la siguiente entrada se
crea una función llamada momentoMovilque tiene como objetivo rotar
una ventana móvil para calcular ya sea el promedio o la volatilidad histórica de
una serie Es decir, dado una serie unidimensional necesitamos estimar momentos
de esta serie en el tiempo a partir de una ventana móvil. Note que dado una
ventana igual a n, la primera estimación toma las observaciones 1:n, en la
segunda toma 2:n+1, 3:n+2 y asi sucesivamente, hasta recorrer todas las
observaciones.
Para cumplir con la terea anterior
se crea una función llamada momentoMovilque requiere tres argumentos:
1.serie = una serie temporal sobre la
cual se desea aplicar la ventana móvil.
2.ventana= indica el
tamaño de la ventana que vamos a utilizar para realizar nuestros cálculos. Por
ejemplo, sí este número es igual a 10 (valor por default) indica que se va
obtener la volatilidad (o promedio) de las primeras 10 observaciones, rotándose
posteriormente para las siguientes observaciones como se explicó anteriormente.
3.momento= asume dos valores, 1 para obtener la volatilidad histórica
a partir de ventanas móviles y 2 para el caso del promedio.
¿Cómo funciona?
Esta función utiliza un bucle
para recorrer las observaciones del vector [for (obs in 1:tr)], siendo la clave la indexación usada para obtener una parte del vector x,
en tal sentido, cuando obs=1, se llaman las observaciones de x del 1 al 10
mediante idenxacion x[obs:(obs+ventana-1)], obs:(obs+ventana-1)=1:(1+10-1)=1:10… note que siempre se va cambiando siempre en el
for es obs, que va tomando el valor de 1,2,3,…n-10. Finalmente,
usamos un condicional para que en función del valor tomado por el argumento memento, guarde la volatilidad histórica
o la media de la serie.
#' En la función momentoMovil
#' @param serie serie unidimensional de
datos
#' @param ventana longitud de la ventana
#' @param momento 1 calcula la volatilidad,
2 media
Ahora se genera una variable
aleatoria para probar la función anterior. Modificando el argumento momento de
la función podemos generar la volatilidad o la media histórica mediante una
ventana móvil.
En
la siguiente entrada se explica, a partir de algunos ejemplos, cómo utilizar los
operadores lógicos y relacionales en R. Estos ejemplos se desarrollan usando una pequeña base de datos
simulada:
nombre <-
c("Miguel", "Ara", "Marirza", "Juan",
"Maira", "Dro")
mujer <-
c(0,1,1,0,1,0)
edad <-
c(20,17,25,35,48,12)
data <-
data.frame(nombre, mujer, edad)
head(data)
nombre
mujer edad
1Miguel020
2Ara117
3 Marirza125
4Juan035
5Maira148
6Dro012
1.1. Operadores relacionales
Los
operadores relacionales permiten establecer relación entre variables o
vectores, son los clásicos operadores de:
> mayor que
>=
mayor igual
< menor
<=
menor igual
==
igual
!=
diferente
Cuando
aplicamos estos operadores relacionales (o de comparación) sobre un vector se obtienen vectores
lógicos con el valor TRUE (==1) en caso de cumplirse comparación (de ser cierta) y 0 en los
demás casos (FALSE==0), por ejemplo:
5>2
[1] TRUE
5<=2
[1] FALSE
Si
quisiéramos que el nuevo vector asuma los valores 0 o 1 para presentar
verdadero o falso, usaríamos la opción as.numeric:
as.numeric(5>2)
[1]
1
Cuando
se aplica este operador sobre un vector este actúa de forma vectorizada, es
decir, realiza la comparación para cada una de las posiciones del vector, por
lo que, arroja un nuevo vector de la misma dimensión, indicando Falso o
Verdadero para cada una de las posiciones del vector, según se cumpla o no la
condición indicada. Por ejemplo, suponga necesitamos agregar una nueva variable a la base de datos simulada, donde se identifiquen a los menores de edad dentro de una base de datos:
data$menores
<- edad<18#Agrega una variable llamada
menores a la data
head(data)
nombre mujer
edad menores
1Miguel020FALSE
2Ara117TRUE
3 Marirza125FALSE
4Juan035FALSE
5Maira148FALSE
6Dro012TRUE
Sobre
estos vectores podemos aplicar el operador de negación (!, not) que sería
comparable con identificar el complemento de un conjunto. Por ejemplo,
anteriormente obtuvimos los menores de edad, para obtener los mayores podemos
utilizar el operador de negación sobre el vector (variable) menores creada anteriormente:
data$meyores <- !edad<18# edad>=18
data
nombre mujer
edad menores meyores
1Miguel020FALSETRUE
2Ara117TRUEFALSE
3 Marirza125FALSETRUE
4Juan035FALSETRUE
5Maira148FALSETRUE
6Dro012TRUEFALSE
En
el caso de objetos no numéricos (caracteres), la expresión o el valor buscado
se coloca entre comillas. En el siguiente ejemplo identificamos todas las
observaciones que tienen por nombre Miguel:
data$Miguel <- nombre=="Miguel"
head(data)
nombre mujer edad menores meyores Miguel
1Miguel020FALSETRUETRUE
2Ara117TRUEFALSEFALSE
3 Marirza125FALSETRUEFALSE
4Juan035FALSETRUEFALSE
5Maira148FALSETRUEFALSE
6Dro012TRUEFALSEFALSE
1.2. Operadores lógicos
1.2.1. Or
Los
operadores lógicos nos permiten utilizar 2 o más operadores relacionales. Por
ejemplo, la unión de eventos la asociamos al operador o (|). Este operador requiere se
cumpla al menos una de las condiciones impuestas para asumir un valor
verdadero. Por ejemplo, suponga deseamos identificar las personas que sean
menores de edad o mujeres (o indica que solo necesitamos se cumpla una de las dos condiciones). Es decir, esta nueva variable colocará el valor de
verdadero a todas las observaciones que cumplan al menos una de las dos
condiciones:
data$mujeresOmenor
<- edad<18 | mujer==1
data
nombre mujer edad menores meyores Miguel
mujeresOmenor
1Miguel020FALSETRUETRUEFALSE
2Ara117TRUEFALSEFALSETRUE
3 Marirza125FALSETRUEFALSETRUE
4Juan035FALSETRUEFALSEFALSE
5Maira148FALSETRUEFALSETRUE
6Dro012TRUEFALSEFALSETRUE
En
caso de usar dos veces el operador o (||), nos estamos preguntando si todas las observaciones de nuestra data cumplen al
menor una de las condiciones indicadas. En tal sentido, el ejemplo anterior
arroja un FALSE, porque no todas las observaciones cumplen al menos una de las
condiciones indicadas, preguntándonos si todas las observaciones son o mujeres
o menores de edad.
edad<18
|| mujer==1
[1]
FALSE
Una
alternativa al operador anterior es la función all:
all(edad<18
| mujer==1)
[1]
FALSE
Por
el contrario, el operador any
se pregunta si al menos 1 cumple esa condición:
any(edad<18 | mujer==1)
[1] TRUE
1.2.1. AND
El
operador (y) corresponde con la operación de intersección en álgebra de
conjuntos. Este operador, para colocar un TRUE, requiere que se cumplan todas
las restricciones indicadas. Respecto al ejemplo anterior, ahora requerimos que
la observación sea mujer y menor de edad al mismo tiempo, por lo que usamos el operador y, que en R viene dado por "&":
data$mujeresYmenor
<- edad<18 & mujer==1
data
nombre mujer edad menores meyores Miguel
mujeresOmenor mujeresYmenor
1Miguel020FALSETRUETRUEFALSEFALSE
2Ara117TRUEFALSEFALSETRUETRUE
3 Marirza125FALSETRUEFALSETRUEFALSE
4Juan035FALSETRUEFALSEFALSEFALSE
5Maira148FALSETRUEFALSETRUEFALSE
6Dro012TRUEFALSEFALSETRUEFALSE
Tal
como en el operador O, usar dos veces este operador realiza la pregunta de si
todas las observaciones en la base de datos presentan o cumple con ambas condiciones. Es decir,
pregunta si todas las mujeres son menores de edad:
edad<18
&& mujer==1
[1]
FALSE
1.2.3. Xor
El
comando xor devuelve TRUE en los
casos donde solo una de las observaciones de un vector creado con dos condiciones, contienen un true. Para el siguiente
ejemplo, note que la segunda observación ahora es FALSE, dado que este operado
equivale a or (|) pero haciendo falso aquellos casos donde la opción &
también resultaría verdadera.
data$hombremayor
<- xor(edad<18, mujer==1)
data
nombre mujer edad menores meyores Miguel
mujeresOmenor mujeresYmenor hombremayor
1Miguel 020FALSETRUETRUEFALSEFALSEFALSE
2Ara117TRUEFALSEFALSETRUETRUEFALSE
3 Marirza125FALSETRUEFALSETRUEFALSETRUE
4Juan035FALSETRUEFALSEFALSEFALSEFALSE
5Maira148FALSETRUEFALSETRUEFALSETRUE
6Dro012TRUEFALSEFALSETRUEFALSETRUE
1.2.4. Contenido en (%in%)
Suponga
queremos identificar los valores de una determinada variable que cumplen con
varias condiciones, para tales fines podemos utilizar el operador or como se muestra
en el siguiente ejemplo:
Ahora,
R coloca un TRUE en las observaciones que cumplen con una de esas edades.
Podemos abreviar esta instrucción mediante el operador contenido en (%in%),
este coloca el valor TRUE en aquellas observaciones que contienen al meno uno de
los valores mostrados en un conjunto determinado:
data$edad12_22in <-edad %in% c(12,22,25)
La
función identical me permite comparar todos los valores de dos vectores, aquí la usamos para verificar que ambos procesos arrojan el mismo resultado:
identical(data$edad12_22, data$edad12_22in)
[1] TRUE
cbind(edad, data$edad12_22, data$edad12_22)
edad
[1,]20 0 0
[2,]17 0 0
[3,]25 1 1
[4,]35 0 0
[5,]48 0 0
[6,]12 1 1
#
Borra una variable de la data
data<-data[,-which(colnames(data)=="edad12_22")]
data
1.2.5. Between
El
operador %()% permite identificar si
un valor está dentro o fuera de un rango determinando (equivale a >
estrictamente mayor y [ es igual a >=.
1.2.6. ifelse
El
comando si condicional (ifelse) permite modificar el
valor que asuma nuestra variable en los casos donde se cumple la comparación
indicada.
ifelse(edad<18,1,0)
[1]
0 1 0 0 0 1
menor1
<- ifelse(edad<18,1,0)
menor2
<- ifelse(edad<18,"Menor", "Mayor")
data.frame(edad,
data$menores, menor1, menor2)
edad
data.menores menor1 menor2
120FALSE0Mayor
217TRUE1Menor
325FALSE0Mayor
435FALSE0Mayor
548FALSE0Mayor
612TRUE1Menor
1.2.7. Funciones lógicas en R
> is.na(c(NA,22))
[1]TRUE FALSE
> is.numeric(c(NA,22))
[1] TRUE
> is.logical(c(NA,22))
[1] FALSE
> is.vector(c(NA,22))
[1] TRUE
>
is.matrix(c(NA,22))
[1]
FALSE
2.3. Indexación con operadores
lógicos
Podemos
indexar (filtrar) colocando corchetes posteriores al nombre de un objeto o
vector y dentro de este corchete colocar la opción lógica que queremos resaltar. Por ejemplo, si queremos traer las edades de las personas menores de
edad.
edad[edad<18]
# Edad de los menores
[1]
17 12
edad[edad<18
& mujer==1] # edad de las mujeres menores
[1]
17
mean(edad[mujer==1])# la
edad promedio de las mujeres
[1]
30
2.4. Igualdad parcial (grep)
Los
operadores anteriores cuestionan sobre el valor total de las celdas, sin
embargo, podemos estar interesados en identificar valores parciales: edades que
inician con 1, nombres que inician con A, entre otros. Esta tarea requiere un
operador de igualdad parcial. En R este operador se obtiene a partir de la función grep, esta regresa las
posiciones de las variables que cumplen con una determinada condición.
En
los siguientes ejemplos identificamos, las observaciones cuyos nombres inician
con m (hay muchos ejemplos en Internet):
grep("M", nombre)# posiciones
[1]
1 3 5
nombre[grep("M",
nombre)] #nombres
[1]
"Miguel""Marirza"
"Maira"
nombre[grep("A|M",
nombre)] #nombres inciain A o M
[1]
"Miguel""Ara""Marirza" "Maira"
data[grep("M",
nombre),] #filtar en la base estos nombres
nombre mujer edad menores meyores Miguel
mujeresOmenor mujeresYmenor hombremayor edad12_22in
1Miguel020FALSETRUETRUEFALSEFALSEFALSEFALSE
3 Marirza125FALSETRUEFALSETRUEFALSETRUETRUE
5Maira148FALSETRUEFALSETRUEFALSETRUEFALSE
mean(edad[grep("M",
nombre)]) #edad promedio de los que su nombre inicia con m
[1]
31
nombre[grep("[A-J]",
nombre)] #inicia con un nombre de A a J