R中的对数对数概率图
Posted
技术标签:
【中文标题】R中的对数对数概率图【英文标题】:Log Log Probability Chart in R 【发布时间】:2013-02-06 18:18:47 【问题描述】:我确信这很容易,但我一直在努力寻找如何在 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 函数,但它只是估计参数 - 我想绘制数据并查看它是否对齐。
【问题讨论】:
通过包含您正在使用的数据,您可能会获得更多帮助。这篇文章在这方面很有帮助:***.com/a/5963610/495372 【参考方案1】:您可以使用poweRlaw 包拟合和绘制幂律。这是一个例子。首先,我们从重尾分布中生成一些数据:
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)
获取:
【讨论】:
这真的很有用。我正在尝试手动复制您的情节,类似于下面 rafa 的解决方案。我如何查看上面m
的源代码(plot(m)
中的 x 和 y 到底是什么),如果可能的话,我想在你的代码中看到 rafa 的 k <- seq_along(x)
的等价物? getAnywhere(displ)
没有显示给我。我试图弄清楚为什么他(你也是?)在 x 轴上使用 k
而不是 log(x) ?谢谢
如果您执行dd = plot(m)
,您将返回 x 和 y。这有帮助吗?【参考方案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"
好了,现在我们可以访问x
和y
:
x <- environment(fn)$x
y <- environment(fn)$y
这可能就是您所需要的。事实上,plot(fn)
和plot(x,y,type="l")
显示几乎相同的结果。要记录 y 轴,您只需要:
plot(x,log(y),type="l")
【讨论】:
【参考方案3】:这是一种使用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)))
【讨论】:
如果您要绘制对数图,为什么要在 x 轴上绘制 log(k)seq_along(x)
而不是 log(x)?请参阅上面科林斯回答下的评论。谢谢以上是关于R中的对数对数概率图的主要内容,如果未能解决你的问题,请参考以下文章
R语言构建logistic回归模型并使用对数似然(log likelihood)评估概率模型:对数似然(log likelihood)会惩罚预测和真实类标签之间的不匹配预测模型与空模型的对数似然对比
R语言plotly可视化:使用plotly可视化模型在测试集上预测的概率分数,使用预测概率值对数据点进行配色分数越高颜色越深(visualize predictions on test split)
Java算法 -- 选择排序冒泡排序插入排序前缀和数组Java中的Math.random()函数01不等概率随机到01等概率随机从[1,5]随机到[1,7]随机对数器的使用
Java算法 -- 选择排序冒泡排序插入排序前缀和数组Java中的Math.random()函数01不等概率随机到01等概率随机从[1,5]随机到[1,7]随机对数器的使用