Проблема с условно ранжированием p-значений - PullRequest
0 голосов
/ 27 марта 2019

Я провожу моделирование временных рядов и хочу удалить термины из своего временного ряда, основываясь на удалении p-значений самого низкого ранга.Критерии, которые у меня есть, состоят в том, чтобы ранжировать только p-значения, которые исключают «ar», «ma», «intercept», «price.diff» и ранжировать только, если p> 0.2.

Вот пример:

term         pval   rank
ar1          0.001  NA
ar2          0.292  NA   
ar3          0.000  NA
ma1          0.000  NA
intercept    0.000  NA
Price.Diff   0.859  NA
School       0.818  2
Easter       0.149  NA
Christmas    0.049  NA
High.Week    0.000  NA
Low.Week     0.000  NA

Это функция, которую я написал:

rank_p<-function(x) {
  x["rank"]<-NA
  x$rank<-ifelse(test = substr(x$term,1,2) != "ar" & 
  substr(x$term,1,2) != "ma" & 
  substr(x$term,1,stop = nchar(x$term)) != "intercept" &
  substr(x$term,1, stop = nchar(x$term)) != "Price.Diff" & 
  x$pval > 0.2,
  yes = rank(-x$pval, na.last = NA),
  no = NA)
 return(x)
  }

Моя проблема в том, что ранг для этого примера начинается с 2. Это будет второе по величине p-значение, потому что яисключаю price.diff, это должно быть ранжировано 1.

Есть ли проблема в заказе условий?

1 Ответ

0 голосов
/ 27 марта 2019

Причина, по которой ваш рейтинг не соответствует желаемому, заключается в том, что ваш термин yes включает весь столбец.Таким образом, вам нужно установить столбец в зависимости от вашего состояния.В текущей функции происходит то, что вы ранжируете столбец без фильтра, а затем меняете на NA все, что не соответствует условию.

Я только что добавил слегка измененную версию вашего кода всделай это.Все, что я изменил, это определил ваше состояние, а затем поместил в таблицу соответствующий кадр.РЕДАКТИРОВАТЬ: это будет работать с отображаемыми данными, но не в том случае, если существует более одной строки, удовлетворяющей условию.

rank_p <- function(x) {
  x["rank"] <- NA
  cond <- {substr(df$term,1,2) != "ar" & 
      substr(df$term,1,2) != "ma" & 
      substr(df$term,1,stop = nchar(df$term)) != "intercept" &
      substr(df$term,1, stop = nchar(df$term)) != "Price.Diff" & 
      df$pval > 0.2}

  x$rank <- ifelse(test = cond,
                   yes = rank(-x[cond, ]$pval, na.last = NA),
                   no = NA)
  return(x)
}

Для этого нужно только ранжировать строки, соответствующие вашему условию (x[cond, ]).

Это может быть еще более упрощено, потому что вы уже установили их на NA, просто измените те из них, которые удовлетворяют условию.Не похоже, что вам нужен ifelse вообще!Это также назначит вектор ранжирования подмножеству такой же длины, которое должно работать для больших наборов, которые содержат более 1 строки, которая удовлетворяет условию.

rank1_p <- function(x) {
  x["rank"] <- NA
  cond <- {substr(df$term,1,2) != "ar" & 
      substr(df$term,1,2) != "ma" & 
      substr(df$term,1,stop = nchar(df$term)) != "intercept" &
      substr(df$term,1, stop = nchar(df$term)) != "Price.Diff" & 
      df$pval > 0.2}
  x[cond, "rank"] <- rank(-x[cond,]$pval, na.last = NA)

  return(x)
}
...