Попытка добавить столбец логики, циклически изменяя время в тибле в R - PullRequest
0 голосов
/ 01 апреля 2020

Я начал тиражировать фактор стоимости, используемый Фамой и Френчем в для построения стратегии портфеля для моей последней диссертации.

У меня есть набор месячных рыночных пределов от S & P 500 за эти годы. Я создал al oop, чтобы определить, является ли переменная (mkt cap) определенного наблюдения в определенную дату выше или ниже определенного порога, вычисленного в поперечном сечении в одно и то же время (для всех наблюдений переменной mkt cap в время т). Чтобы достичь этого, я подумал, что подходящей техникой для l oop. Таким образом, для каждой даты я вычисляю порог и проверяю критерии. К сожалению, я не могу сохранить логическое в течение l oop. Когда я печатаю результаты, я вижу, что я хочу сохранить, но когда я пытаюсь сохранить, я получаю только результаты, относящиеся к последнему шагу l oop.

for(d in dates$date){
  month <- data_tbk %>% filter(date==d) 
  up <- quantile(month$mktcap, 0.8, na.rm=TRUE)
  low <- quantile(month$mktcap, 0.2, na.rm=TRUE)
  data_tbk %>% filter(date==d) %>%
    mutate(ptf=ifelse(mktcap>=up,1,ifelse(mktcap<=low,0,NA))) %>%
    print
    }

Другой способ, которым я пытался следовать, заключается в следующем, но я получил еще меньше:

data_tbk$ptf <- NA
for(d in dates$date){
  month <- data_tbk %>% filter(date==d)
  up <- quantile(month$mktcap, 0.8, na.rm=TRUE)
  low <- quantile(month$mktcap, 0.2, na.rm=TRUE)
  data_tbk %>% filter(date==d) %>% filter(mktcap>=up) %>% ptf=1
  filter(data_tbk, date==d) %>% filter(mktcap<=low) %>% ptf=0
  }

Как мне изменить коды, чтобы получить столбец, содержащий логические 1 или 0 в соответствии с по критериям?

data_pdk

1 Ответ

0 голосов
/ 01 апреля 2020

Вам не понадобится al oop.

Если ваш фрейм данных равен data_tbk, этот код создаст новую переменную is_higher. 1, если mktcap больше Q80%, 0, если меньше Q20%, и NA для остальных.

library(dplyr)

data_tbk  <- data_tbk %>% 
    mutate(is_higher = case_when(
                        mktcap >  quantile(mktcap,0.8) ~ 1,
                        mktcap <= quantile(mktcap,0.2) ~ 0,
                        TRUE ~ NA) )

Если вы рассчитываете квантиль для даты, добавьте предложение group_by.

data_tbk <- data_tbk %>% 
    group_by(date) %>%
    mutate(is_higher = case_when(
                        mktcap >  quantile(mktcap,0.8) ~ 1,
                        mktcap <= quantile(mktcap,0.2) ~ 0,
                        TRUE ~ NA) )

PS. Вам необходимо установить пакет dplyr

install.package("dplyr")
...