我执行了一个回归,将残差作为zoo对象返回给我。
现在我希望从这些残差中创建一个虚拟对象,如果这些残差属于所有残差的上5%或下5%,则取值1,否则取值0。
我知道如何对特定值执行此操作(例如,如果我希望所有小于0.03的残差都等于1和0,否则:dummy <- ifelse(residuals <= -0.03, 1, 0)),但不是针对精确的百分位数。
我希望这一点是清楚的。
发布于 2021-03-15 22:25:39
我们可以使用quantile函数:
xx <- rnorm(1000)
perc_dummy <- ifelse(xx <= quantile(xx, .05), 1,
ifelse(xx >= quantile(xx, .95), 1, 0))
table(perc_dummy)
# perc_dummy
# 0 1
# 900 100 由Konrad Rudolph建议的一行程序
perc_dummy = as.numeric(xx <= quantile(xx, 0.05) | xx >= quantile(xx, 0.95))发布于 2021-03-15 22:41:50
R有一个单独的逻辑数据类型,可以用来代替将这些数据编码为数字。所以我一般会写
dummy = data <= quantile(data, 0.05) | data >= quantile(data, 0.95)但是,如果您坚持使用0/1,则可以使用as.integer()、as.numeric()或ifelse()轻松地转换上面的值。
另一种解决方案允许统一处理上下百分位数,它使用cut()
cut(data, c(-Inf, quantile(data, c(0.05, 0.95)), Inf), labels = c(1L, 0L, 1L))但是,要注意这是一个factor,所以即使这些值被标记为0和1,它们的底层值实际上是1L和2L,顺序是任意的。
此外,cut()解决方案需要添加Infinity才能工作。因此,在实践中,这个解决方案相当混乱,尽管它在概念上很适合(findInterval(),这是一个简化的cut(),不需要添加Infinite界限;但相反,它不允许将上下百分位数分配给同一组- this将需要额外的步骤)。
https://stackoverflow.com/questions/66639778
复制相似问题