【问题标题】:Getting Probability Density of Data获取数据的概率密度
【发布时间】:2011-05-11 23:59:38
【问题描述】:

我需要分析一些有关 DSL 线路的 Internet 会话的数据。我想看看会话持续时间是如何分布的。我想一个简单的方法是从绘制所有会话持续时间的概率密度图开始。

我已经在 R 中加载了数据并使用了density() 函数。所以,是这样的

plot(density(data$duration), type = "l", col = "blue", main = "Density Plot of Duration",
     xlab = "duration(h)", ylab = "probability density")

我是 R 和这种分析的新手。这是我通过谷歌发现的。我得到了一个情节,但我还有一些问题。这是做我想做的事情的正确功能还是还有其他什么?

在图中,我发现 Y 轴刻度是从 0...1.5。我不明白它怎么可能是 1.5,不应该是从 0...1 吗?

另外,我想获得更平滑的曲线。因为,数据集真的很大,所以线条真的是锯齿状的。当我介绍这个时,让它们变得平滑会更好。我该怎么做呢?

【问题讨论】:

  • 你误解了密度。 X 的密度可以看作是一个值从总体中抽取一个与 X 非常接近的数字的机会成正比。现在根据定义,密度函数的积分等于 1。这并不意味着密度函数的最大值应该为 1,它很容易变大。事实上,对于 df= (1,1) 的 F 分布,密度的最大值(在 0 处)甚至是无穷大。
  • @Joris 是的,我现在意识到我没有正确解释它。我相当简单地假设,因为它是一个概率分布,它会小于 1 :)。
  • @JorisMeys,当曲线下的总面积为1时,PDF怎么会大于1?如果 PDF 超过 1,是不是分布不正常,需要归一化?
  • @karthiks 因为例如一个高度为 10、宽度为 0.01 的矩形的面积为 0.1,而 Y 值(因此 PDF)为 10。对于该区域,您需要同时采用X 和 Y 轴都考虑在内,而不仅仅是 Y 轴。

标签: r plot probability distribution data-analysis


【解决方案1】:

正如 nico 所说,您应该查看hist,但您也可以将两者结合起来。然后你可以用lines 来调用密度。 示例:

duration <- rpois(500, 10) # For duration data I assume Poisson distributed
hist(duration,
   probability = TRUE, # In stead of frequency
   breaks = "FD",      # For more breaks than the default
   col = "darkslategray4", border = "seashell3")
lines(density(duration - 0.5),   # Add the kernel density estimate (-.5 fix for the bins)
   col = "firebrick2", lwd = 3)

应该给你类似的东西:

请注意,核密度估计默认采用高斯核。但带宽往往是最重要的因素。如果您直接调用density,它会报告默认的估计带宽:

> density(duration)

Call:
        density.default(x = duration)

Data: duration (500 obs.);      Bandwidth 'bw' = 0.7752

       x                 y            
 Min.   : 0.6745   Min.   :1.160e-05  
 1st Qu.: 7.0872   1st Qu.:1.038e-03  
 Median :13.5000   Median :1.932e-02  
 Mean   :13.5000   Mean   :3.895e-02  
 3rd Qu.:19.9128   3rd Qu.:7.521e-02  
 Max.   :26.3255   Max.   :1.164e-01  

这里是 0.7752。检查它的数据并按照 nico 的建议使用它。你可能想看看?bw.nrd

【讨论】:

    【解决方案2】:

    您应该使用bandwith (bw) 参数来改变曲线的平滑度。一般来说,R 做得很好,并且会自动给出一个漂亮而平滑的曲线,但对于您的特定数据集,情况可能并非如此。

    至于您使用的调用,是的,它是正确的,type="l" 不是必需的,它是用于绘制密度对象的默认值。曲线下的面积(即密度函数从 -Inf 到 +Inf 的积分)将为 = 1。

    现在,密度曲线是否最适合您的情况?也许,也许不是......这真的取决于你想做什么样的分析。可能使用 hist 就足够了,并且可能会提供更多信息,因为您可以选择特定的持续时间箱(有关更多信息,请参阅 ?hist)。

    【讨论】:

    • 谢谢,我会看看,但我仍然不明白为什么密度轴会大于 1。
    • 如我所说,曲线下的面积(即 sum(dx*y))= 1。y 轴的实际值因带宽而异。较小的带宽值将产生较高的 y 值。尝试绘制density(rnorm(1000), 0.2)density(rnorm(1000), 2) 以查看差异。
    • hist 看起来相对于密度向右倾斜。这是因为假设具有泊松分布变量的正常内核?
    • @David:我不能 100% 确定 R 如何计算密度估计值。我猜这也可能是直方图分箱的问题,但我将答案留给比我更有知识的人。
    【解决方案3】:

    我打算将此作为评论添加到上一个答案中,但它太大了。 明显的偏斜是由于值在直方图中的分箱方式造成的。将直方图用于离散数据通常是错误的。见下文...

    set.seed(1001)
    tmpf <- function() {
      duration <- rpois(500, 10) # For duration data I assume Poisson distributed
      hist(duration,
           probability = TRUE, # In stead of frequency
           breaks = "FD",      # For more breaks than the default
           col = "darkslategray4", border = "seashell3",
           main="",ann=FALSE,axes=FALSE,xlim=c(0,25),ylim=c(0,0.15))
      box()
      lines(density(duration),   # Add the kernel density estimate
            col = "firebrick2", lwd = 3)
      par(new=TRUE)
      plot(table(factor(duration,levels=0:25))/length(duration),
           xlim=c(0,25),ylim=c(0,0.15),col=4,ann=FALSE,axes=FALSE)
    }
    
    par(mfrow=c(3,3),mar=rep(0,4))
    replicate(9,tmpf())
    

    【讨论】:

    • 是的,没错,bin 将始终位于整数的任一侧(右 = TRUE 与右 = FALSE)。我主要只是将它用于数据的先前可视化,在那里几乎没有伤害。但它可以很容易地通过一个简单的 -0.5 的密度来修复......
    • @eyjo:假设您使用的是整数中断,但您不受此限制
    猜你喜欢
    • 2022-10-07
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多