Using the lognorm package

# twDev::genVigs()
#rmarkdown::render("lognorm.Rmd","md_document") 
library(knitr)
opts_chunk$set(out.extra = 'style="display:block; margin: auto"'
    #, fig.align = "center"
    #, fig.width = 4.6, fig.height = 3.2
    , fig.width = 6, fig.height = 3.75 #goldener Schnitt 1.6
    , dev.args = list(pointsize = 10)
    , dev = c('png','pdf')
    )
knit_hooks$set(spar = function(before, options, envir) {
    if (before) {
        par( las = 1 )                   #also y axis labels horizontal
        par(mar = c(2.0,3.3,0,0) + 0.3 )  #margins
        par(tck = 0.02 )                          #axe-tick length inside plots             
        par(mgp = c(1.1,0.2,0) )  #positioning of axis title, axis labels, axis
     }
})
library(lognorm) 
if (!require(ggplot2) || !require(dplyr) || !require(purrr)) {
    print("To generate this vignette, ggplot2, dplyr, and purrr are required.")
    knit_exit()
}
themeTw <- ggplot2::theme_bw(base_size = 10) + 
  theme(axis.title = element_text(size = 9))

Distribution

Shape by multiplicative standard deviation

Density distributions of lognormal distributions (lines) get closer to normal density shaded area) as multiplicative standard deviation $\sigma^$ decreases down to 1.2 for same $\mu^ = 1$.

x <- seq(0,2.5,length.out = 200)
mu <- log(1)
sigmaStar0 <- c(1.2,1.5,2,5)
ans <- map_df(sigmaStar0, function(sigmaStarI){
  data.frame(
    sigmaStar = sigmaStarI, x = x
    , density = dlnorm(x, mu, log(sigmaStarI))
    , cumDensity = plnorm(x, mu, log(sigmaStarI))
    )
}) %>% mutate(sigmaStar = factor(sigmaStar, levels = rev(as.character(sigmaStar0)) ))
coefNorm <- getLognormMoments(mu, log(sigmaStar0[1]))
ansNormal <- data.frame(
  sigmaStar = "normal", x = x
  , density = dnorm(x, coefNorm[1], sqrt(coefNorm[2]))
  , cumDensity = pnorm(x, coefNorm[1], sqrt(coefNorm[2]))
  )
#ansNormal %>%  ggplot(aes(x,density)) + geom_line()
ans %>% ggplot(aes(x,density, linetype = sigmaStar, color = sigmaStar)) + 
  geom_area(
    data = ansNormal, aes(linetype = NA, color = NA), fill = "blue"
    , alpha = 0.1, show.legend = FALSE) +
  geom_line() +
  scale_linetype_discrete(name = bquote(sigma^"*"), breaks = rev(sigmaStar0)) +
  scale_color_discrete(name = bquote(sigma^"*"), breaks = rev(sigmaStar0)) +
  themeTw +
  theme(legend.position = c(0.98,0.98), legend.justification = c(1,1)) +
  theme(axis.title.x = element_blank())
ans %>% ggplot(aes(x,cumDensity, linetype = sigmaStar, color = sigmaStar)) + 
  geom_line(
    data = ansNormal, color = "blue", linetype = "dotted", show.legend = FALSE) +
  geom_line() +
  scale_linetype_discrete(name = bquote(sigma^"*"), breaks = rev(sigmaStar0)) +
  scale_color_discrete(name = bquote(sigma^"*"), breaks = rev(sigmaStar0)) +
  themeTw +
  theme(legend.position = c(0.98,0.98), legend.justification = c(1,1)) +
  theme(axis.title.x = element_blank())

Density, distribution function, quantile function and random generation

Are already provided with the base stats package. See ?dlnorm.

Expected value, Variance, Mode, and Median

getLognormMode(mu = 0.6,sigma = 0.5)
getLognormMedian(mu = 0.6,sigma = 0.5)
(theta <- getLognormMoments(mu = 0.6,sigma = 0.5))

Mode < Median < Mean for the right-skewed distribution.

The return type of getLognormMoments is a matrix.

Parameter Estimation from moments

moments <- cbind(mean = c(1,1), var = c(0.2, 0.3)^2 )
(theta <- getParmsLognormForMoments( moments[,1], moments[,2]))
ans <- map_df(1:nrow(moments), function(i){
  tibble(
    sd = sqrt(moments[i,2]), x = x
    , density = dlnorm(x, theta[i,1], theta[i,2])
    )
}) %>% mutate(sd = factor(sd)) 
ans %>% ggplot(aes(x,density, linetype = sd, color = sd)) + 
  geom_vline(xintercept = 1, color = "grey10", size = 0.2) +
  geom_line() +
  themeTw +
  theme(legend.position = c(0.98,0.98), legend.justification = c(1,1)) +
  theme(axis.title.x = element_blank())

The larger the spread, the more skewed is the distribution, here both with an expected value of one.



Try the lognorm package in your browser

Any scripts or data that you put into this service are public.

lognorm documentation built on Nov. 22, 2021, 1:07 a.m.