有条件地排名 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)
}
我正在进行一些时间序列建模,并希望根据删除最低排名 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)
}