Отобразить лямбду, используемую в функции caret :: BoxCoxTrans - PullRequest
0 голосов
/ 25 июня 2018

Я использую функцию BoxCoxTrans из пакета caret:

library(caret)
library(purrr)
model1 <- apply(X = my.df, 2, BoxCoxTrans)
model2 <- purrr::map2(model1, my.df, function(x,y) predict(x,y))
trans.df <- as.data.frame(do.call(cbind, model2))

library(rcompanion)
plotNormalHistogram(trans.df)
print(trans.df)

Она работает правильно и преобразует данные, но у меня нет способа узнать, какое значение лямбда-выражения используется дляпреобразование.

1 Ответ

0 голосов
/ 25 июня 2018

Вы можете найти эти значения в model1.Я покажу вам, как получить их, используя данные iris.

library(caret)
fudge <- 0.2
out <- lapply(iris[1:2], BoxCoxTrans, fudge = fudge) # instead of apply(..., margin = 2, ...)

Теперь рассмотрим структуру out

str(out, 2)
#List of 2
# $ Sepal.Length:List of 6
#  ..$ lambda  : num -0.1
#  ..$ fudge   : num 0.2
#  ..$ n       : int 150
#  ..$ summary :Classes 'summaryDefault', 'table'  Named num [1:6] 4.3 5.1 5.8 5.84 6.4 ...
#  .. .. ..- attr(*, "names")= chr [1:6] "Min." "1st Qu." "Median" "Mean" ...
#  ..$ ratio   : num 1.84
#  ..$ skewness: num 0.309
#  ..- attr(*, "class")= chr "BoxCoxTrans"
# $ Sepal.Width :List of 6
#  ..$ lambda  : num 0.3
#  ..$ fudge   : num 0.2
#  ..$ n       : int 150
#  ..$ summary :Classes 'summaryDefault', 'table'  Named num [1:6] 2 2.8 3 3.06 3.3 ...
#  .. .. ..- attr(*, "names")= chr [1:6] "Min." "1st Qu." "Median" "Mean" ...
#  ..$ ratio   : num 2.2
#  ..$ skewness: num 0.313
#  ..- attr(*, "class")= chr "BoxCoxTrans"

Используя base R, вы можете использоватьsapply и `[[` теперь следующим образом

sapply(out, `[[`, "lambda")
#Sepal.Length  Sepal.Width 
#        -0.1          0.3 

Поскольку вы используете purrr, вы можете рассмотреть map и pluck

map_dbl(out, pluck, "lambda")
#Sepal.Length  Sepal.Width 
#        -0.1          0.3

БлагодаряВнимательно комментируя @ missuse, мы можем получить лямбду, используемую для преобразования, как

library(dplyr)
real_lambda <- case_when(between(lambda, -fudge, fudge) ~ 0,
                         between(lambda, 1 - fudge, 1 + fudge) ~ 1,
                         TRUE ~ lambda)

real_lambda <- setNames(real_lambda, names(lambda))
real_lambda
#Sepal.Length  Sepal.Width 
#         0.0          0.3

Это необходимо, потому что функция BoxCoxTrans имеет аргумент fudge, который является

допускомзначение: лямбда-значения в пределах +/- fudge будут приведены к 0, а в пределах 1 +/- fudge будут приведены к 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...