9

我需要分析一些有关 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 吗?

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

4

3 回答 3

10

正如 nico 所说,你应该 check out 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.

于 2010-11-18T12:58:12.817 回答
2

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

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

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

于 2010-11-18T12:23:52.933 回答
1

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

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())
于 2010-11-18T17:19:37.300 回答