2010-11-18 11 views
9

DSL回線のインターネットセッションに関するデータを分析する必要があります。私は、セッションの持続時間がどのように分散されているかを見たいと思っていました。これを行う簡単な方法は、すべてのセッションの期間の確率密度プロットを作成することから始まると考えました。データの確率密度を得る

データをRにロードし、density()関数を使用しました。だから、このようなものでした。

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

私はこの種の分析に慣れています。これはgoogleを通って私が見つけたものでした。私はプロットを得たが、私はいくつかの質問を残した。これは私がやろうとしていることをするための正しい機能ですか、それとも何か他のものがありますか?

プロットでは、Y軸のスケールが0〜1.5であることがわかりました。私はそれが1.5であることができる方法を得ていない、それは0 ... 1からではないでしょうか?

また、私はより滑らかな曲線を得たいと思います。データセットが本当に大きいので、線は実際にギザギザです。私がこれを提示しているときにそれらを滑らかにすることは、より良いでしょう。それをどうやってやりますか?

+5

濃度が誤っています。 Xの密度は**集団からXのすぐ近くにある数を描画する機会に比例した値**として見ることができます。ここで密度関数の積分は1になります。これは、密度関数の最大値が1であることを意味するものではなく、容易に大きくすることができる。実際、df =(1,1)を有するF分布の場合、密度(0における)の最大値は偶数である。 –

+0

@ヨリスはい私はそれを正しく解釈していないことを今や分かっています。むしろ単純に私は確率分布から1未満であると仮定していました。 – sfactor

答えて

2

カーブの滑らかさを変更するには、帯域幅(bw)パラメータを使用して遊んでください。一般的にRは良い仕事をし、自動的に素敵で滑らかな曲線を示しますが、特定のデータセットには当てはまらないかもしれません。

あなたが使用している通話に関しては、それは正しいです。type="l"は、密度オブジェクトをプロットするために使用されるデフォルトです。カーブの下の領域(密度関数の-Infから+ Infまでの積分)は、1になります。

ここで、密度曲線はあなたのケースで使用するのに最適ですか?おそらく、おそらくそうではないかもしれません...あなたがしたい分析のタイプに本当に依存します。おそらくhistを使用すれば十分でしょうし、具体的な期間を選択することができればさらに有益です(詳細は?histを参照)。

+0

ありがとう私は見ていますが、私はまだ密度軸が1より大きい理由を得ることができません。 – sfactor

+0

私が言ったように、それは曲線の下の領域です(つまり合計(dx * y))= 1実際のy軸の値は帯域幅によって異なります。帯域幅値が小さくなるほどy値が高くなります。差異を見るために密度(rnorm(1000)、0.2)と密度(rnorm(1000)、2)をプロットしてみてください。 – nico

+0

ヒストは、密度に比べて右に歪んで見えます。なぜなら、ポアソン分布変数を持つ通常のカーネルが仮定されているからです。 –

10

nicoが言ったように、histをチェックアウトする必要がありますが、2つを組み合わせることもできます。次に、linesで密度を呼び出すことができます。 例:カーネル密度推定値がデフォルトとしてガウシアンカーネルを想定していることを Histogram of duration

注:

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(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である:あなたが直接densityを呼び出した場合には、デフォルトの推定帯域幅を報告します。あなたのデータをチェックして、nicoが示唆したようにそれを使って遊んでください。あなたは?bw.nrdを見たいかもしれません。

+0

非常に良い~~~~~~~~~~~~~~~~~~ –

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()) 
+0

はい、そうです、ビンは常に(右= TRUE右= FALSE対)の整数のいずれかの側によるであろう。私は主にデータの事前可視化のためにこれを使用しますが、ほとんど害はありません。しかし、それは簡単密度... – eyjo

+0

@eyjoにシンプル-0.5で固定することができます:それはあなたが整数の区切りを使用していると仮定していますが、あなたはそれによって限定されるものではなく、 – nico

関連する問題