3

我确信这很容易,但我一直在努力寻找如何在 R 中做到这一点。

我有一些数据试图拟合幂律分布。为此,您需要在对数累积概率图上绘制数据。y 轴是数据频率的 LOG(或对数概率,如果您愿意),x 轴是值的对数。如果是一条直线,那么它符合幂律分布,梯度决定幂律参数。

如果我想要数据的频率,我可以使用 ecdf() 函数:

我的数据集称为Profits.negative,它只是一长串小于零的交易利润(我名义上将它们全部转换为正数以避免以后出现记录问题)。

所以我可以输入

plot(ecdf(Profits.negative))

我得到了一个方便的经验 CDF 函数。我需要做的就是将两个轴都转换为对数刻度。我可以做x轴:

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

差不多好了!我只需要弄清楚如何记录 y 轴!但我似乎做不到,我不知道如何从 ecdf 对象中提取数字。任何人都可以帮忙吗?

我知道有一个 power.law.fit 函数,但这只是估计参数 - 我想绘制数据并查看它是否对齐。

4

3 回答 3

6

您可以使用powerRlaw包拟合和绘制幂律。这是一个例子。首先,我们从重尾分布中生成一些数据:

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

接下来我们加载包并创建一个数据对象和一个显示对象:

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"

好吧,现在我们可以访问xand 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 回答