从5%的百分位数中创建一个假人

  • 本文关键字:创建 假人 一个 百分 r
  • 更新时间 :
  • 英文 :


我执行了一个回归,它将残差作为zoo对象返回。

现在,我希望从这些残差中创建一个假人,如果这些残差属于所有残差的上5%或下5%,则取1,否则取0。

我知道如何对特定值进行计算(例如,如果我希望所有小于0.03的残差都等于1,否则为0:dummy <- ifelse(residuals <= -0.03, 1, 0)(,但不适用于精确的百分位数。

我希望这是清楚的。

我们可以使用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))

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,因此即使这些值被标记为01,它们的基本值实际上是1L2L,按任意顺序排列。

此外,cut()解决方案需要添加Infinity才能使其工作。因此,在实践中,这个解决方案相当混乱,尽管它在概念上很适合(findInterval()是一个简化的cut(),不需要添加Inf的初始边界;但相反,它不允许将下限和上限百分位数分配给同一组——这需要额外的步骤(。

最新更新