Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的对数概率图_R_Power Law_Ecdf - Fatal编程技术网

R中的对数概率图

R中的对数概率图,r,power-law,ecdf,R,Power Law,Ecdf,我相信这很容易,但我一直在努力寻找在R中如何做到这一点 我有一些数据,我正试图适应幂律分布。为此,您需要将数据绘制在对数累积概率图上。y轴是数据频率的对数(或对数概率,如果您愿意),x轴是值的对数。如果它是一条直线,那么它符合幂律分布,梯度决定幂律参数 如果我想要数据的频率,我可以使用ecdf()函数: 我的数据集名为Profits.negative,它只是一长串小于零的交易利润(我已经将它们全部转换为正数,以避免以后出现日志记录问题) 这样我就可以打字了 plot(ecdf(Profits.n

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

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

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

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

这样我就可以打字了

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)))