我执行了一个回归,它将残差作为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
,因此即使这些值被标记为0
和1
,它们的基本值实际上是1L
和2L
,按任意顺序排列。
此外,cut()
解决方案需要添加Inf
inity才能使其工作。因此,在实践中,这个解决方案相当混乱,尽管它在概念上很适合(findInterval()
是一个简化的cut()
,不需要添加Inf
的初始边界;但相反,它不允许将下限和上限百分位数分配给同一组——这需要额外的步骤(。