R中的对数概率图
我相信这很容易,但我一直在努力寻找在R中如何做到这一点 我有一些数据,我正试图适应幂律分布。为此,您需要将数据绘制在对数累积概率图上。y轴是数据频率的对数(或对数概率,如果您愿意),x轴是值的对数。如果它是一条直线,那么它符合幂律分布,梯度决定幂律参数 如果我想要数据的频率,我可以使用ecdf()函数: 我的数据集名为Profits.negative,它只是一长串小于零的交易利润(我已经将它们全部转换为正数,以避免以后出现日志记录问题) 这样我就可以打字了R中的对数概率图,r,power-law,ecdf,R,Power Law,Ecdf,我相信这很容易,但我一直在努力寻找在R中如何做到这一点 我有一些数据,我正试图适应幂律分布。为此,您需要将数据绘制在对数累积概率图上。y轴是数据频率的对数(或对数概率,如果您愿意),x轴是值的对数。如果它是一条直线,那么它符合幂律分布,梯度决定幂律参数 如果我想要数据的频率,我可以使用ecdf()函数: 我的数据集名为Profits.negative,它只是一长串小于零的交易利润(我已经将它们全部转换为正数,以避免以后出现日志记录问题) 这样我就可以打字了 plot(ecdf(Profits.n
plot(ecdf(Profits.negative))
我得到了一个方便的经验CDF函数。我所需要做的就是将两个轴转换为对数刻度。我可以做x轴:
Profits.negative.logs <- log(Profits.negative)
plot(ecdf(Profits.negative.logs))
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
可以使用软件包拟合和绘制幂律。这里有一个例子。首先,我们从重尾分布生成一些数据:
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)
要获得:
以下是使用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)))
库(ggplot2)
#资料
种子(1)
x=圆形(rlnorm(100,3,2)+1)
#将数据组织到df中
df通过包含您正在使用的数据,您可能会得到更多帮助。这篇文章在这方面很有帮助:这真的很有用。我试图手动复制你的情节,类似于下面拉法的解决方案。我怎样才能查看上面m
的源代码(在plot(m)
中x和y的确切含义),我想看看拉法的k的等价物,如果你做dd=plot(m)
你得到x和y。这有帮助吗?如果要绘制对数图,为什么要沿x轴绘制log(k)seq_(x)
,而不是log(x)?见我在科林回答下面的评论。谢谢
m$setXmin(est[[2]])
m$setPars(est[[3]])
plot(m)
lines(m, col=2)
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)))