这里提供一种在R中通过最大化似然来估计具有指数截断的幂律的缩放指数和指数速率的方法:
powerexp.fit <- function(data,threshold=1,method="constrOptim",initial_rate=-1) {
x <- data[data>=threshold]
negloglike <- function(theta) {
-powerexp.loglike(x,threshold,exponent=theta[1],rate=theta[2])
}
pure_powerlaw <- pareto.fit(data,threshold)
initial_exponent <- pure_powerlaw$exponent
if (initial_rate < 0) { initial_rate <- exp.fit(data,threshold)$rate }
minute_rate <- 1e-6
theta_0 <- as.vector(c(initial_exponent,initial_rate))
theta_1 <- as.vector(c(initial_exponent,minute_rate))
switch(method,
constrOptim = {
ui <- rbind(c(1,0),c(0,1))
ci <- c(-1,0)
if (theta_0[1] == -1) {theta_0[1] <- theta_0[1] + minute_rate}
if (theta_0[2] == 0) {theta_0[2] <- theta_0[2] + minute_rate}
est <- constrOptim(theta=theta_0,f=negloglike,grad=NULL,ui=ui,ci=ci)
alpha <- est$par[1]
lambda <- est$par[2]
loglike <- -est$value},
optim = {
est <- optim(par=theta_0,fn=negloglike)
alpha <- est$par[1]
lambda <- est$par[2]
loglike <- -est$value},
nlm = {
est.0 <- nlm(f=negloglike,p=theta_0)
est.1 <- nlm(f=negloglike,p=theta_1)
est <- est.0
if (-est.1$minimum > -est.0$minimum) { est <- est.1;cat("NLM had to switch\n") }
alpha <- est$estimate[1]
lambda <- est$estimate[2]
loglike <- -est$minimum},
{cat("Unknown method",method,"\n"); alpha<-NA; lambda<-NA; loglike<-NA}
)
fit <- list(type="powerexp", exponent=alpha, rate=lambda, xmin=threshold,
loglike=loglike, samples.over.threshold=length(x))
return(fit)
}
请查看https://github.com/jeffalstott/powerlaw/获取更多信息