【问题标题】:Finding a sensible range找到一个合理的范围
【发布时间】:2013-08-08 09:26:58
【问题描述】:

我现在为此苦苦挣扎了几天。这是stackoverflow上关于同一主题的第三个问题,希望这次我的问题得到更好的定义。

我的数据分布如下:(直方图)

x轴对应概率范围:0到1。

我想将状态 1 到状态 10 的状态合理地分配给概率范围。

这是我得到的:

Interval <- round(quantile(datag, c(seq(0,1,by=0.10))),3)

输出:

   0%   10%   20%   30%   40%   50%   60%   70%   80%   90%  100% 
 0.000 0.008 0.015 0.024 0.036 0.054 0.080 0.124 0.209 0.397 1.000

从 0 到 10 分配状态:

States <- data.frame(datag, State=findInterval(datag, Interval))

head(States)

输出:状态

Probability      State
0.20585012         8
0.21202839         9
0.07087725         6
0.7109513         10
0.9641807         10

问题是这样的:正如您在上面看到的,我已经为概率 0.2120 设置了状态 9,为 > 0.710 设置了状态 10。我会对 prob=0.2120 state 4 和 prob=0.710 state 7 和 prob=0.96 = state 10 这样的东西感到满意。

那么如何更统一地分配状态呢?

复制数据g:

datag <- data.frame(Probability=rgamma(10000, shape=0.6, rate=4.8, scale=1/4.8))

编辑: @罗马:

datag <- subset(datag, Probability<=1)

编辑:@西蒙

是的,我知道“cut”:

table(cut(datag, breaks = c(seq(0,0.8,by=0.1))))

输出:

(0,0.1] (0.1,0.2] (0.2,0.3] (0.3,0.4] (0.4,0.5] (0.5,0.6] (0.6,0.7] (0.7,0.8] 
125545     26625     12795      8126      5556      4108      3227      2606

如何定义休息时间?我在间隔之后(打破自己),所以我可以分配与概率落入的间隔相对应的状态。

【问题讨论】:

  • 据我了解您的问题,quantile 将您的数据划分为内容大致相等的子集,cut 将您的数据划分为长度相等的子集。
  • @西蒙。谢谢。我已经发布了编辑。
  • 如果你能提供一个可重现的例子和预期的结果,那将会有很长的路要走。
  • @Roman。数据是伽马分布的,上面发布的参数。现在 datag 从 0 变为 1。已发布更正。
  • 这个问题好像是cross post 附简历。

标签: r math statistics


【解决方案1】:

你基本上已经在你的 OP 中得到了答案!不要采取错误的方式,但我认为您需要花更多时间阅读?cut 的文档!如果您在cut 中设置labels = FALSE,您将获得每个中断对应的整数代码。

#  Set a seed for true reproducibility!
set.seed(1)
datag <- data.frame(Probability=rgamma(10000, shape=0.6, rate=4.8, scale=1/4.8))
Int <- cut( datag$Probability , breaks = seq(0 , 1 , by = 0.1 ) , lab = FALSE )
head( cbind( Prob = datag$Probability , Int ) )
            Prob Int
[1,] 0.031860645   1
[2,] 0.455054687   5
[3,] 0.134175238   2
[4,] 0.058957301   1
[5,] 0.855493999   9
[6,] 0.009144936   1

【讨论】:

    【解决方案2】:

    我跑了

    datag <- data.frame(Probability=rgamma(10000, shape=0.6, rate=4.8, scale=1/4.8))
    datag <- subset(datag, Probability<=1)
    

    第一个给出了一个显然你忽略的警告,但之后:

    如果这些应该是概率,则不需要第二步。但是继续

    您使用了分位数; datag 根本不统一,所以你得到了你所得到的。如果你想以不同的方式划分 datag,你可以使用cut。例如,对于 10 个类,均匀分布:

    datagcut <- cut(datag$Probability, 10)
    table(datagcut)
    

    但是第一堂课有很多病例,最后一节课很少。如果你愿意,你可以定义你自己的切割(见 ?cut)。

    【讨论】:

    • 谢谢,是的,确实在 SO 向我提供了“剪切”解决方案,它对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-31
    相关资源
    最近更新 更多