Создать фиктивную переменную на основе процентильного ранга - PullRequest
0 голосов
/ 09 мая 2019

Я хочу создать фиктивные переменные для регрессии.Таким образом, данные примерно выглядят примерно так:

Year  Month Price  Volume  Return StockCode
1991  1       10     300     1.2  AAPL
1991  2       11     320     1.3  AAPL
1992  1       23     310     2.1  AMZN
1992  2       22     302     2.3  AMZN

Я хотел бы ранжировать их на основе процентиля для переменных Price, Volume и Return, и создать соответствующую фиктивную переменную для каждой переменной для каждой акции.Верхние 30% будут назначены 1, Средние 40% будут назначены 0, а Нижние 30% будут назначены -1.В идеале, фрейм данных должен выглядеть примерно так:

Year Month D_Price D_Volume D_Return StockCode
1991  1       -1     -1       -1      AAPL
1991  2       0       1        0      AAPL
1992  1       1       0        0      AMZN
1992  2       0       0        1      AMZN

Я пытался искать ресурсы онлайн и сток-поток, но нет примера, который бы мог ответить на вопрос о том, как я могу подойти к этой проблеме.Ценим за любую помощь.Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Вы также можете использовать sapply и quantile из base R и stats

Инициализировать ваш data.frame:

df <- data.frame(Year =c(1991, 1991, 1992, 1992), Month = c(1, 2, 1, 2), Price = c(10, 11, 23, 22), Volume = c(300, 320, 310, 302), Return = c(1.2, 1.3, 2.1, 2.3), StockCode= c('AAPL', 'AAPL', 'AMZN', 'AMZN'))

Сделать фиктивные переменные:

dummy <- data.frame(sapply(df[c('Price', 'Volume', 'Return')], function(x) {
  y <- quantile(x, probs=c(0.3, 0.7), type = 7) #0.3 and 0.7 are your cut-off percentiles
  ifelse(x < y[1], -1, ifelse(x < y[2], 0, 1))
  }
))

Свяжите dummy с другими интересующими вас столбцами и переименуйте столбцы, чтобы получить то, что вы хотите:

result_df <- cbind(df[c('Year', 'Month')], dummy, df['StockCode'])
colnames(result_df)[2:4] <- paste0('D_', colnames(df)[2:4])
result_df

  Year D_Month D_Price D_Volume Return StockCode
1 1991       1      -1       -1     -1      AAPL
2 1991       2       0        1      0      AAPL
3 1992       1       1        0      0      AMZN
4 1992       2       0        0      1      AMZN

Надеюсь, это поможет!

2 голосов
/ 09 мая 2019

Вы можете использовать dplyr::percent_rank и cut.

library(dplyr)

df %>%
  mutate_at(vars(Price, Volume, Return), list(cut = function(x) cut(percent_rank(x), c(-Inf,.3,.7,Inf), labels = c(-1,0,1))))

  Year Month Price Volume Return StockCode Price_cut Volume_cut Return_cut
1 1991     1    10    300    1.2      AAPL        -1         -1         -1
2 1991     2    11    320    1.3      AAPL         0          1          0
3 1992     1    23    310    2.1      AMZN         1          0          0
4 1992     2    22    302    2.3      AMZN         0          0          1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...