如何在r中为帕累托分布复制此对数-对数图?

时间:2018-10-12 23:09:05

标签: r plot statistics

我正在尝试复制该情节

enter image description here

根据该文章,已绘制了整条线,并使用该公式生成了随机数

enter image description here

我用来生成随机数的代码是

r <- c(runif(600, min = 0, max = 1))
pnumbers = c()
a = 0.17
b = 4200
for(i in 1:600){
  pnumbers[i] = a*(1 - r[i]*(1 - (a/b)^0.75))^(-1/0.75)
}
x2 <- sort(pnumbers)

并使用该图中所示的等式11中的随机数

enter image description here

该函数是使用此代码计算的

pareto1 <- ppareto(x2, 0.17, 0.75)
survpareto <- 1 - pareto1

我可以得到直线虚线,但无法获得带有空圆的曲线图。假定空cicle图是由数据集和等式11组成的,但我得到了另一条直线!其实...一样的直线!! The graph that I got 我用这段代码得到了那个情节

pdf("PruebaGraficoLogLog.pdf")
pareto2 <- 1 - (0.17/x)^0.75
survpareto2 <- 1 - pareto2
plot(x2, survpareto, log = "xy", col = "blue", type = "l", lty = 5)
points(x, survpareto2, log = "xy")
dev.off()

我的问题是,为了正确地复制点火棒,我该怎么办?我究竟做错了什么? 感谢您的帮助与合作。

编辑:我更改了标题,以使其更加具体和详细。 这是我在玩具模型中使用的序言(包装)

library(EnvStats)
library(stats)
library(base)

我没有使用软件包fitdistrplus,因为(而且我也不知道为什么)我无法将其安装在计算机中。我使用的是R 3.3,但该软件包的安装始终会失败。

1 个答案:

答案 0 :(得分:1)

首先有两个重要评论:

  • 图中圆圈所示的样本的生存分布与您给定的参数abc不匹配在您的帖子中。您能否解释一下如何得出以下特定值:a = 0.17b = 4200c = 0.75

  • 我不得不说我不太理解练习的全部内容。该图显示了有界/截断的帕累托分布的样本(使用逆变换采样绘制,请参见下文)。然后表明,样本的生存分布与有界的帕累托分布一致,而不是无界的帕累托分布(这显然是预期的)。当您尝试从基础分布(此处:有界帕累托)中估计参数时,通常会执行此操作。 那么您是否想问如何估计截断的帕累托分布的参数?如果是这样,这取决于数据(对于随机数据,固定种子意味着没有可重复性)和估算方法(通常为ML)。也许看看MASS:fitdistr会很有用。


除了这些注释之外,这是一个可重现的示例,用于生成x并绘制log xlog S(x)的关系。

  1. 根据您给出的方程式生成n=600个样本x(根据图形标题,我认为这是等式13)。

    set.seed(2018)
    rsample <- function(n, a, b, c) a * (1 - runif(n) * (1 - (a / b)^c)) ^ (-1 / c)
    
    x <- rsample(600, 0.17, 4200, 0.75)
    

    请注意,x是通过inverse-transform sampling (ITS)bounded Pareto distribution生成的。将系数abc映射到来自维基百科的有界帕累托分布的定义很容易:

    a = L         (location parameter)
    b = H         (location parameter)
    c = alpha     (shape parameter)
    
  2. 我们使用F_X(x) = P(X ≤ x)

    计算经验累积分布函数ecdf
    Px <- ecdf(x)
    
  3. 我们现在可以为任何值F_X(x)计算x(请记住,有界帕累托分布的支持是L ≤ x ≤ H)。我们选择的值应使其对应于图中对数刻度所示的间隔。然后,生存函数就是S_X(x) = 1 - F_X(x) = P(X > x)

    library(tidyverse)
    df <- data.frame(
        x = exp(seq(0, 1.6, 0.05))) %>%
        mutate(
            Px = Px(x),
            Sx = 1 - Px)
    
  4. 我们将x与生存函数S_X(x)进行对数对数绘制。

    ggplot(df, aes(log(x), log(Sx))) +
        geom_point(size = 3, shape = 21)
    

enter image description here

如您所见,生存分布的形状与图形不匹配,表明参数a = 0.17b = 4200c = 0.75与图中用于生存函数样本的参数。