2016-12-11 2 views
1

У меня есть серия возвратов финансовой компании с другими характеристиками. Заголовок данных являются:Расчет децильных рядов внутри по группам в R

голова (companyReturnsNameScore)

PERMNO  date TICKER  PRC VOL  RET SHROUT 
1 85814 19980831 CTAC 6.1875 27989 -0.489691 6431 
2 85814 20021231 CTAC 27.5700 97498 1.177725 11388 
3 85814 19990129 CTAC 14.7500 5658 -0.180556 6275 
4 85814 20021031 CTAC 9.0300 20192 -0.097000 11382 
5 85814 20021129 CTAC 12.6600 15474 0.401993 ... 
    marketCap marketCapDeclile 
1 39791.81    2 
2 313967.16    6 
3 92556.25    4 
4 102779.46    4 
5 152958.12    5 

можно рассчитать рыночную капитализацию децильный ранга (от 1 до 10) в течение всего периода, который вы видите в переменной «marketCapDecile» , Я использую функцию «децильную» в пакете «StatMeasures» как простой способ получить дециль ряды, но при попытке использовать функцию, чтобы получить Децильные ряды по дате, я получаю следующее сообщение об ошибке:

by(companyReturnsNameScore,companyReturnsNameScore$date,decile(companyReturnsNameScore$marketCap)) Error in FUN(X[[i]], ...) : could not find function "FUN"

Функция «decile» существует, потому что я могу запускать без ошибок за пределами операции «by ...», но когда я ее размещаю внутри, я получаю ошибку.

Как я могу генерировать децильные ряды 'marketCap' по дате с помощью функции 'by'. Я не хочу использовать функцию «decile», но когда я пытаюсь использовать «quantile» или другой инструмент, я, похоже, не могу генерировать рейтинги дециля ...

Спасибо за помощь.

+0

Ugh ... Я пытался получить данные в хороших столбцах, но по какой-то причине не работал. Извините, банда ... – fibrou

ответ

0

Один метод представляет собой комбинацию quantile с findInterval. quantile вместе с аргументом probs = 1: 10/10, будут вычислять значения на каждом дециле, эти значения подаются на findInterval, который строит категории.

# set up dummy vector for example 
temp <- 1:100 
findInterval(temp, quantile(temp, probs=1:10/10), left.open=T) 
[1] 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 
[30] 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 
[59] 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 
[88] 8 8 8 9 9 9 9 9 9 9 9 9 9 

Конечно, просто добавьте 1 л к результату, если вы хотите ДЕЦИЛЬНЫЙ 1 через 10.

0

decile всегда будет бросать предупреждение, если входной коэффициент имеет длину < 2. Я обновил свой кадр данных тестирования для имеют кратные даты.

PERMNO  date TICKER  PRC VOL  RET SHROUT  mc 
1: 85814 19980831 CTAC 6.1875 27989 -0.489691 6431 39791.81 
2: 85814 20021031 CTAC 27.5700 97498 1.177725 11388 313967.16 
3: 85814 19980831 CTAC 14.7500 5658 -0.180556 6275 92556.25 
4: 85814 20021031 CTAC 9.0300 20192 -0.097000 11382 102779.46 
5: 85814 20021031 CTAC 12.6600 15474 0.401993 6400 152958.12 

Я хотел бы использовать library(purrr);library(dplyr) вместо by для этого сценария, из-за by требующих функции, которые будут работать на весь кадр данных.

df %>% split(.$date) %>% map_df(~ mutate(., date_decile = decile(mc))) 
    PERMNO  date TICKER  PRC VOL  RET SHROUT  mc date_decile 
1 85814 19980831 CTAC 6.1875 27989 -0.489691 6431 39791.81   1 
2 85814 19980831 CTAC 14.7500 5658 -0.180556 6275 92556.25   10 
3 85814 20021031 CTAC 27.5700 97498 1.177725 11388 313967.16   10 
4 85814 20021031 CTAC 9.0300 20192 -0.097000 11382 102779.46   1 
5 85814 20021031 CTAC 12.6600 15474 0.401993 6400 152958.12   5 
+0

Спасибо @ nathan-day. Фактически, я решил, как сделать децилирование без ошибок. Я просто необходимо иметь вызов функции без аргументов: – fibrou

+0

У меня проблемы сейчас захват тех Децильные занимает > companyReturnsNameScore $ marketCapDecileRank <ей (companyReturnsNameScore $ Капитализация, дата companyReturnsNameScore $, Децильная) Ошибки в '$ <- .data.frame' ('* tmp *', "marketCapDecileRank", value = list (: Замена имеет 1080 строк, данные имеют 1785812 ------------------- ------------------ Как я могу захватить эти ранги для каждой комбинации значений даты/рыночной цены? – fibrou

+0

вы можете либо скомпоновать свой оригинальный (большой) фрейм данных, чтобы он имеет только одну строку на дату, или вы можете объединиться в ряды дециля, так что большой фрейм данных будет иметь одинаковое значение дециля для каждого наблюдения (строки) определенной даты. – Nate

Смежные вопросы