首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的对数对数概率图

R中的对数对数概率图
EN

Stack Overflow用户
提问于 2013-02-07 02:18:47
回答 3查看 2.6K关注 0票数 3

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

我有一些数据,我正在尝试将其拟合为幂律分布。为此,您需要在对数-对数累积概率图上绘制数据。Y轴是数据频率的对数(如果您喜欢,也可以是对数概率),x轴是值的对数。如果它是一条直线,那么它符合幂律分布,梯度决定了幂律参数。

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

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

这样我就可以输入

代码语言:javascript
复制
plot(ecdf(Profits.negative))

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

代码语言:javascript
复制
Profits.negative.logs <- log(Profits.negative)
plot(ecdf(Profits.negative.logs))

就快到了!我只需要解决如何对y轴进行对数!但是我似乎做不到这一点,而且我不知道如何从ecdf对象中提取图形。有人能帮上忙吗?

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

EN

回答 3

Stack Overflow用户

发布于 2013-02-07 04:29:17

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

代码语言:javascript
复制
set.seed(1)
x = round(rlnorm(100, 3, 2)+1)

接下来,我们加载包并创建一个data对象和一个displ对象:

代码语言:javascript
复制
library(poweRlaw)
m = displ$new(x)

我们可以估计xmin和缩放参数:

代码语言:javascript
复制
est = estimate_xmin(m))

并设置参数

代码语言:javascript
复制
m$setXmin(est[[2]])
m$setPars(est[[3]])

然后绘制数据并添加拟合线:

代码语言:javascript
复制
plot(m)
lines(m, col=2)

要获得以下信息:

票数 6
EN

Stack Overflow用户

发布于 2013-02-07 03:42:14

首先生成数据(实际上是你们的一部分;):

代码语言:javascript
复制
set.seed(1)
Profits.negative <- runif(1e3, 50, 100) + rnorm(1e2, 5, 5)

日志记录和ecdf

代码语言:javascript
复制
Profits.negative.logs <- log(Profits.negative)
fn <- ecdf(Profits.negative.logs)

ecdf返回function,如果你想从中提取一些东西--看看function的闭包是个好主意:

代码语言:javascript
复制
ls(environment(fn))
# [1] "f"      "method" "n"      "nobs"   "x"      "y"      "yleft"  "yright"

现在,我们可以访问xy

代码语言:javascript
复制
x <- environment(fn)$x
y <- environment(fn)$y

也许这就是你所需要的。事实上,plot(fn)plot(x,y,type="l")显示了几乎相同的结果。要记录y轴,您只需:

代码语言:javascript
复制
plot(x,log(y),type="l")
票数 2
EN

Stack Overflow用户

发布于 2017-05-14 09:43:25

下面是一种使用ggplot2的方法

代码语言:javascript
复制
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)))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14736038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档