约翰逊逆向变换

时间:2019-05-26 12:42:01

标签: r transformation

我想进行回归分析,我有一个数据集,其目标变量(Murder)向左倾斜,如下所示:

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)

enter image description here

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

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

是否有可能像上面的log转换那样逆转这种转换?

1 个答案:

答案 0 :(得分:0)

如Rui Barradas所述,此处可以使用predict函数。您可以执行以下操作,而不是直接从x.t函数中抽出yeojohnson

# 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参数)通过对数和幂转换来完成相同的工作流程。