BestNormalize дает ложные результаты? - PullRequest
1 голос
/ 29 января 2020

Мне интересно, почему я получаю разные результаты каждый раз, когда я запускаю этот код:

# arcsinh transformation
(arcsinh_obj <- arcsinh_x(df$Var1))
# Box Cox's Transformation
(boxcox_obj <- boxcox(df$Var1))
# Yeo-Johnson's Transformation
(yeojohnson_obj <- yeojohnson(df$Var1))
# orderNorm Transformation
(orderNorm_obj <- orderNorm(df$Var1))
# Pick the best one automatically
(BNobject <- bestNormalize(df$Var1))
# Last resort - binarize
(binarize_obj <- binarize(df$Var1))

summary(df$Var1)
xx <- seq(min(12), max(56), length = 295)

plot(xx, predict(arcsinh_obj, newdata = xx), type = "l", col = 1, ylim = c(-4, 4),
     xlab = 'df$Var1', ylab = "g(df$Var1)")
lines(xx, predict(boxcox_obj, newdata = xx), col = 2)
lines(xx, predict(yeojohnson_obj, newdata = xx), col = 3)
lines(xx, predict(orderNorm_obj, newdata = xx), col = 4)

legend("bottomright", legend = c("arcsinh", "Box Cox", "Yeo-Johnson", "OrderNorm"), 
       col = 1:4, lty = 1, bty = 'n')

par(mfrow = c(2,2))
MASS::truehist(arcsinh_obj$x.t, main = "Arcsinh transformation", nbins = 100)
MASS::truehist(boxcox_obj$x.t, main = "Box Cox transformation", nbins = 100)
MASS::truehist(yeojohnson_obj$x.t, main = "Yeo-Johnson transformation", nbins = 100)
MASS::truehist(orderNorm_obj$x.t, main = "orderNorm transformation", nbins = 100)

par(mfrow = c(1,2))
MASS::truehist(BNobject$x.t, 
               main = paste("Best Transformation:", 
                            class(BNobject$chosen_transform)[1]), nbins = 100)
plot(xx, predict(BNobject, newdata = xx), type = "l", col = 1, 
     main = "Best Normalizing transformation", ylab = "g(x)", xlab = "x")

dev.off()
boxplot(log10(BNobject$oos_preds), yaxt = 'n')
axis(2, at=log10(c(.1,.5, 1, 2, 5, 10)), labels=c(.1,.5, 1, 2, 5, 10))

Я даже пробовал это делать каждый раз, когда я запускал анализ на тот случай, если он действительно влиял на

 rm(list = ls())

Не могли бы вы дать мне руку?

Спасибо, LIL

1 Ответ

1 голос
/ 10 февраля 2020

Вероятно, вы получите разные результаты, потому что функция bestNormalize() использует повторную перекрестную проверку (и не устанавливает автоматически начальное число), поэтому результаты будут немного отличаться при каждом запуске.

Попробуйте установить семена (например, set.seed(3)).

Или вы можете указать функции не выполнять повторное CV, установив out_of_sample = FALSE, или использовать одноразовое CV, установив loo = TRUE.

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