Hi all,
I have been asked to perform "zero skewness log transformation". It is a procedure in Stata, but as I use R I am trying to find the equivalent for it.
I am not able to find something equivalent. Have any of you tried to do the same ?
Thank you all!
rlnskew0.pdf (stata.com)
Description
lnskew0 creates newvar = ln(±exp − k), choosing k and the sign of exp so that the skewness
of newvar is zero.
My initial though is that I would try to use optim
for this
Hi,
Yes, the challenge is to find the optimal constant. With sign of exp I ques it just depend if the distribution is left-skewed or right-skewed.
I have looked at this optim() you suggest, but I can´t figure out how to use it in this situation.
library(e1071)
set.seed(42)
a_skewed_dist <<- rnorm(1000)^2
hist(a_skewed_dist)
e1071::skewness(a_skewed_dist)
transform_plus <- function(exp,k){log(exp - k)}
transform_min <- function(exp,k){log(-exp - k)}
tplus_wrap <- function(k){
tvals <- transform_plus(a_skewed_dist,k)
abs(e1071::skewness(tvals))
}
tmin_wrap <- function(k){
tvals <- transform_min(a_skewed_dist,k)
abs(e1071::skewness(tvals))
}
(plus_res <- optim(par=c(0),fn=tplus_wrap))
(min_res <- optim(par=c(-100),fn=tmin_wrap))
choice_res <- if(plus_res$value <= min_res$value){
list(optim_res = plus_res,
sign="+",
k=plus_res$par,
func_to_use = function(x){
transform_plus(exp=x,k=plus_res$par)
})
} else {
list(optim_res = min_res,
sign="-",
k=min_res$par,
func_to_use = function(x){
transform_min(exp=x,k=min_res$par)
})
}
(my_transformed_var <- choice_res$func_to_use(a_skewed_dist))
e1071::skewness(my_transformed_var)
hist(my_transformed_var)
system
Closed
5
This topic was automatically closed 42 days after the last reply. New replies are no longer allowed.
If you have a query related to it or one of the replies, start a new topic and refer back with a link.