3

これは簡単だと思いますが、Rでこれを行う方法を見つけようとして髪を引き裂いてきました。

べき法則の分布に適合させようとしているデータがいくつかあります。これを行うには、データを両対数累積確率チャートにプロットする必要があります。y軸はデータの頻度(または必要に応じて対数確率)の対数であり、x軸は値の対数です。直線の場合、べき乗則の分布に適合し、勾配がべき乗則のパラメーターを決定します。

データの頻度が必要な場合は、ecdf()関数を使用できます。

私のデータセットはProfits.negativeと呼ばれ、ゼロ未満の取引利益の長いリストです(後でログの問題を回避するために、概念的にすべてを正の数に変換しました)。

だから私はタイプすることができます

plot(ecdf(Profits.negative))

そして、便利な経験累積分布関数がプロットされます。私がする必要があるのは、両方の軸を対数目盛に変換することです。私はx軸を行うことができます:

Profits.negative.logs <- log(Profits.negative)
plot(ecdf(Profits.negative.logs))

もうすぐです!y軸をログに記録する方法を理解する必要があります!しかし、私はそれを行うことができないようであり、ecdfオブジェクトから図を抽出する方法を理解することはできません。誰か助けてもらえますか?

power.law.fit関数があることは知っていますが、それはパラメーターを推定するだけです。データをプロットして、それが整列するかどうかを確認したいと思います。

4

3 に答える 3

6

power- lawパッケージを使用して、べき乗則を当てはめてプロットすることができます。これが例です。最初に、裾の重い分布からいくつかのデータを生成します。

set.seed(1)
x = round(rlnorm(100, 3, 2)+1)

次に、パッケージをロードし、データ オブジェクトと displ オブジェクトを作成します。

library(poweRlaw)
m = displ$new(x)

xminスケーリング パラメータを推定できます。

est = estimate_xmin(m))

パラメータを設定します

m$setXmin(est[[2]])
m$setPars(est[[3]])

次に、データをプロットし、適合線を追加します。

plot(m)
lines(m, col=2)

取得するため:

ここに画像の説明を入力

于 2013-02-06T20:29:17.167 に答える
2

最初にデータを生成します (実際にはあなたが別れます ; )):

set.seed(1)
Profits.negative <- runif(1e3, 50, 100) + rnorm(1e2, 5, 5)

ロギングとecdf:

Profits.negative.logs <- log(Profits.negative)
fn <- ecdf(Profits.negative.logs)

ecdf関数を返します。そこから何かを抽出したい場合は、関数のクロージャーを調べることをお勧めします。

ls(environment(fn))
# [1] "f"      "method" "n"      "nobs"   "x"      "y"      "yleft"  "yright"

さて、これでアクセスできるようxになりましたy

x <- environment(fn)$x
y <- environment(fn)$y

おそらくそれはあなたが必要とするものです。実際、ほぼ同じ結果plot(fn)を示しています。plot(x,y,type="l")y 軸をログに記録するには、次のものが必要です。

plot(x,log(y),type="l")
于 2013-02-06T19:42:13.520 に答える
1

を使用したアプローチは次のggplot2とおりです。

library(ggplot2)

# data
  set.seed(1)
  x = round(rlnorm(100, 3, 2)+1)

# organize data into a df
  df <- data.frame(x = sort(x, decreasing = T),
                   pk <- ecdf(x)(x),
                   k <- seq_along(x))

# plot
  ggplot(df, aes(x=k, y= pk)) + geom_point(alpha=0.5) + 
    coord_trans(x = 'log10', y = 'log10') +
    scale_x_continuous(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) +
    scale_y_continuous(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x)))

ここに画像の説明を入力

于 2017-05-14T01:43:25.407 に答える