首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从5%的百分位数中创建一个虚拟对象

从5%的百分位数中创建一个虚拟对象
EN

Stack Overflow用户
提问于 2021-03-15 22:22:30
回答 2查看 28关注 0票数 1

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

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

我知道如何对特定值执行此操作(例如,如果我希望所有小于0.03的残差都等于1和0,否则:dummy <- ifelse(residuals <= -0.03, 1, 0)),但不是针对精确的百分位数。

我希望这一点是清楚的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-15 22:25:39

我们可以使用quantile函数:

代码语言:javascript
复制
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建议的一行程序

代码语言:javascript
复制
perc_dummy = as.numeric(xx <= quantile(xx, 0.05) | xx >= quantile(xx, 0.95))
票数 2
EN

Stack Overflow用户

发布于 2021-03-15 22:41:50

R有一个单独的逻辑数据类型,可以用来代替将这些数据编码为数字。所以我一般会写

代码语言:javascript
复制
dummy = data <= quantile(data, 0.05) | data >= quantile(data, 0.95)

但是,如果您坚持使用0/1,则可以使用as.integer()as.numeric()ifelse()轻松地转换上面的值。

另一种解决方案允许统一处理上下百分位数,它使用cut()

代码语言:javascript
复制
cut(data, c(-Inf, quantile(data, c(0.05, 0.95)), Inf), labels = c(1L, 0L, 1L))

但是,要注意这是一个factor,所以即使这些值被标记为01,它们的底层值实际上是1L2L,顺序是任意的。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66639778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档