【问题标题】:Reverse Johnson transformation逆约翰逊变换
【发布时间】:2019-05-26 12:42:00
【问题描述】:

我想执行回归,并且我有一个带有左偏目标变量(谋杀)的数据集,如下所示:

data("USAArrests")

str(USAArrests)
'data.frame':   50 obs. of  4 variables:
 $ Murder  : num  13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
 $ Assault : int  236 263 294 190 276 204 110 238 335 211 ...
 $ UrbanPop: int  58 48 80 50 91 78 77 72 80 60 ...
 $ Rape    : num  21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9 25.8 ...


hist(USAArrests&Murder)

因为数据是左偏的。我可以对目标进行对数转换,以提高模型的性能。

train = USArrests[1:30,]

train$Murder = log(train$Murder)

test = USArrests[31:50,]

如果我想在测试集上应用此模型,则必须反转转换以获得实际结果。我可以通过exp 完成。

fit = lm(Murder~., data = train)

pred = predict(fit, test)

exp(pred)

但是,就我而言,对数转换不足以获得目标的正态分布。所以我使用了约翰逊变换。

library(bestNormalize)

train$Murder = yeojohnson(train$Murder)$x.t

是否有可能像上面的对数转换一样反转这种转换?

【问题讨论】:

  • 从帮助页面的详细信息部分:可以通过predict 函数对新数据和反转执行此转换。我的重点。

标签: r transformation


【解决方案1】:

正如 Rui Barradas 所说,predict 函数可以在这里使用。除了直接从yeojohnson 函数中拉出x.t 之外,您还可以执行以下操作:

# Store the transformation object
yj_obj <- yeojohnson(train$Murder)

# Perform transformation
yj_vals <- predict(yj_obj)

# Reverse transformation
orig_vals <- predict(yj_obj, newdata = yj_vals, inverse = TRUE)

# Should be the same as the original values
all.equal(orig_vals, train$Murder)

通过log_x 函数(连同predict 函数和inverse = TRUE 参数),可以使用对数和幂转换完成相同的工作流程。

【讨论】:

    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 2021-04-01
    • 2019-02-08
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多