Cómo realizar operaciones sigma en grandes conjuntos de datos de panel utilizando dplyr.
Tengo un conjunto de datos de panel de series temporales que está estructurado de la siguiente manera:
Hay varios fondos que tienen múltiples acciones y tenemos la serie temporal del peso de la acción dentro de ese fondo y el valor total del fondo para ese año.
Como puedes ver, el panel no está balanceado.
df <- data.frame(
fund_id = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L),
stock_id = c(1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 2L, 2L, 3L, 3L, 3L),
year = c(2011L, 2012L, 2011L, 2012L, 2013L, 2011L, 2012L, 2013L, 2012L,2013L, 2011L, 2012L, 2013L, 2014L, 2011L, 2012L, 2013L),
weight = c(0.3L, 0.2L, 0.7L, 0.8L, 1L, 0.2L, 0.1L, 0.2L, 0.7L, 0.8L, 0.8L, 0.2L, 0.3L, 1L, 0.5L, 0.2L, 0.7L),
aum = c(3L, 3.5L, 3L, 3.5L, 4L, 5L, 4L, 5L, 4L, 5L, 5L, 4L, 6L, 7L, 5L, 6L, 6L)
)
> df
fund_id stock_id year weight aum
1 1 1 2011 0.3 3.0
2 1 1 2012 0.2 3.5
3 1 2 2011 0.7 3.0
4 1 2 2012 0.8 3.5
5 1 2 2013 1.0 4.0
6 2 1 2011 0.2 5.0
7 2 1 2012 0.1 4.0
8 2 1 2013 0.2 5.0
9 2 2 2012 0.7 4.0
10 2 2 2013 0.8 5.0
11 2 3 2011 0.8 5.0
12 2 3 2012 0.2 4.0
13 3 2 2013 0.3 6.0
14 3 2 2014 1.0 7.0
15 3 3 2011 0.5 5.0
16 3 3 2012 0.2 6.0
17 3 3 2013 0.7 6.0
>
Me gustaría calcular la siguiente fórmula para cada año y cada acción:
Por favor, ten en cuenta que i es el identificador del fondo y n es el identificador de la acción, en este caso j debería ser cualquier otro fondo excepto i. La fórmula se repite para cada año, por lo que eliminé el subíndice t. AUM solo depende del ID del fondo y del año y no de la acción, por lo que sería el mismo valor para el mismo fondo y año pero con un ID de acción diferente.
Estaba pensando en usar dplyr para hacer esto, pero tengo un conjunto de datos de panel muy grande y no estoy seguro de cómo hacerlo.
davy.ai
Para calcular la fórmula para cada año y cada acción, podemos utilizar el paquete
dplyr
en R. Podemos agrupar los datos poraño
eidentificador de la acción
utilizando la funcióngroup_by
, y luego utilizar la funciónmutate
para crear una nueva columna con la fórmula calculada.Aquí está el código para lograr esto:
En este código, primero agrupamos los datos por
año
eidentificador_accion
. Luego, utilizamos la funciónmutate
para crear una nueva columna llamadaformula
, que calcula la fórmula deseada para cada fila.La función
sum()
suma el resultado de la fórmula para todas las filas dentro del grupo. Las variablespeso
yaum
se acceden directamente, mientras queidentificador_fondo
utiliza una condición!=
para excluir el valor de la fila actual,i
, de la calculación. También utilizamoslag()
para acceder al valor deaum
eidentificador_fondo
para la fila anterior,j
.El parámetro
na.rm
se establece enTRUE
para manejar los valoresNA
que aparecerán, ya que la primera fila de cada grupo no tiene un valor anterior para utilizar en el cálculo.El marco de datos resultante
df_formula
contendrá todas las columnas originales, así como la nueva columnaformula
con los valores calculados.