我相信这很容易,但我一直在努力寻找在R中如何做到这一点。
我有一些数据,我正在尝试将其拟合为幂律分布。为此,您需要在对数-对数累积概率图上绘制数据。Y轴是数据频率的对数(如果您喜欢,也可以是对数概率),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函数,但它只是估计参数--我想绘制数据图,看看它是否对齐。
发布于 2013-02-07 04:29:17
您可以使用poweRlaw包来拟合和绘制幂律曲线。下面是一个例子。首先,我们从重尾分布中生成一些数据:
set.seed(1)
x = round(rlnorm(100, 3, 2)+1)接下来,我们加载包并创建一个data对象和一个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-07 03:42:14
首先生成数据(实际上是你们的一部分;):
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返回function,如果你想从中提取一些东西--看看function的闭包是个好主意:
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")发布于 2017-05-14 09:43:25
下面是一种使用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)))

https://stackoverflow.com/questions/14736038
复制相似问题