[英]Log Log Probability Chart in R
我確信這很容易,但是我一直在試圖找出如何在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函數,但這只是估計參數 - 我想繪制數據並查看它是否排列。
您可以使用poweRlaw包來擬合和繪制冪律。 這是一個例子。 首先,我們從重尾分布中生成一些數據:
set.seed(1)
x = round(rlnorm(100, 3, 2)+1)
接下來,我們加載包並創建一個數據對象和一個displ對象:
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)
要得到:
數據生成首先( 你實際上是分開的 )):
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")
這是使用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)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.