有条件地排名 p 值的问题

Issue with conditionally ranking p-values

我正在进行一些时间序列建模,并希望根据删除最低排名 p 值从我的时间序列中删除项。我的标准是仅对排除 "ar"、"ma"、"intercept"、"price.diff" 的 p 值进行排名,并且仅在 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.This 开始,将是第二高的 p 值,但是因为我排除了 price.diff,所以它应该排名第 1。

问题出在条件的顺序上吗?

您的排名不理想的原因是您的 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)
}