Превратите фиктивные переменные в веса

#r #xts #performanceanalytics

Вопрос:

У меня есть таблица фиктивных переменных, где значение равно 1 или NA. Я знаю, что хочу создать одинаковый вес для этих манекенов по рядам. Это мой начальный набор данных, он в формате xts:

            NESN ROG NOVN ZURN ABBN UBSG LONN
1989-12-01   1   NA   1   1    NA   1    NA
1990-01-01   1   NA   1   1    1    1    NA
 

Затем я хотел бы разделить 1 так, чтобы сумма строк была равна 1. Конечный набор данных будет выглядеть следующим образом:

             NESN ROG NOVN ZURN ABBN UBSG LONN
1989-12-01  0.25 NA  0.25 0.25 NA   0.25  NA
1990-01-01  0.2  NA  0.2  0.2  0.2  0.2   NA
 

Поэтому, если во всей строке есть пять акций с фиктивным значением, равным 1, значение 1 будет изменено на 0,2. Если есть 4 акции, она будет изменена на 0,25 и так далее. До сих пор я думал об использовании замены, чтобы заменить 1 на их соответствующий вес. Однако я не знаю, как это сделать для нескольких строк с разным весом. Я делаю это для того, чтобы в конечном итоге рассчитать оборот портфеля.

Комментарии:

1. Спасибо вам за ответы. Однако в итоге я построил свои портфели с помощью пакета portsort, в который уже встроена функция оборачиваемости портфеля наряду с другими полезными функциями.

Ответ №1:

Вы можете разделить фрейм данных на суммы строк.

 # data structure
df <- structure(list(NESN = c(1L, 1L), ROG = c(NA, NA), NOVN = c(1L, 
1L), ZURN = c(1L, 1L), ABBN = c(NA, 1L), UBSG = c(1L, 1L), LONN = c(NA, 
NA)), class = "data.frame", row.names = c("1989-12-01", "1990-01-01"
))

# solution
df/rowSums(df, na.rm=T)
#           NESN ROG NOVN ZURN ABBN UBSG LONN
#1989-12-01 0.25  NA 0.25 0.25   NA 0.25   NA
#1990-01-01 0.20  NA 0.20 0.20  0.2 0.20   NA
 

Ответ №2:

Вы можете использовать применить по строкам и транспонировать:

 df <- data.frame(NESN = c(1,1), ROG = c(NA,NA), NOVN = c(1,1),
           ZURN = c(1,1), ABBN = c(NA,1), UBSG = c(1,1),
           LONN = c(NA,NA))

t(apply(df, 1, function(x){x/sum(x, na.rm = TRUE)}))

     NESN ROG NOVN ZURN ABBN UBSG LONN
[1,] 0.25  NA 0.25 0.25   NA 0.25   NA
[2,] 0.20  NA 0.20 0.20  0.2 0.20   NA