有条件地排名p值的问题

问题描述 投票:0回答:1

我正在进行一些时间序列建模,并希望根据删除最低等级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开始。这将是第二高的p值,但因为我排除price.diff,这应该排在1。

订购条件的问题是什么?

r conditional rank
1个回答
0
投票

您的排名不符合要求的原因是因为您的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)
}
© www.soinside.com 2019 - 2024. All rights reserved.