我正在进行一些时间序列建模,并希望根据删除最低等级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。
订购条件的问题是什么?
您的排名不符合要求的原因是因为您的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)
}