es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:
enter image description here

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.

Tags:  , ,

Answer

  1. Avatar for 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 por año e identificador de la acción utilizando la función group_by, y luego utilizar la función mutate para crear una nueva columna con la fórmula calculada.

    Aquí está el código para lograr esto:

    library(dplyr)
    
    df_formula <- df %>%
      group_by(año, identificador_accion) %>%
      mutate(formula = sum(peso * (aum - lag(aum)) / aum * (identificador_fondo != lag(identificador_fondo)), na.rm = TRUE))
    

    En este código, primero agrupamos los datos por año e identificador_accion. Luego, utilizamos la función mutate para crear una nueva columna llamada formula, 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 variables peso y aum se acceden directamente, mientras que identificador_fondo utiliza una condición != para excluir el valor de la fila actual, i, de la calculación. También utilizamos lag() para acceder al valor de aum e identificador_fondo para la fila anterior, j.

    El parámetro na.rm se establece en TRUE para manejar los valores NA 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 columna formula con los valores calculados.

Comments are closed.