0

我正在使用 bestNormalize 包来转换具有 5 个因子水平(组)的变量。我使用以下代码转换我的数据并查看转换后数据的直方图和正态性检验结果(nooutliers 是我的数据集,totalscore 是我的因变量,Grade 是具有 5 个因子水平的因子):

(BNobjectall <- bestNormalize(nooutliers$totalscore))
nooutliers$transformed <- predict(BNobjectall)
ggplot(nooutliers,aes(x=transformed, fill= Grade))+geom_histogram(binwidth=3)+facet_grid(~Grade)+theme_bw()


nooutliers %>%
  summarise(statistic = shapiro.test(transformed)$statistic,
           p.value = shapiro.test(transformed)$p.value) 

我的问题是 bestNormalize 不考虑因子水平并找到最佳转换方法,因为该变量是单个组。结果,我的一个因子水平的转换因变量值不会变得正常。当我为这个因子水平创建一个子集并应用相同的代码时,我得到了想要的结果。但是,我不知道如何将这种相同的转换(具有相同的值)应用于其他因子水平。

bestNormalize 有没有办法考虑因子水平或将具有相同值的相同转换应用于不同的子集?

4

1 回答 1

0

我不确定我是否完全理解您的目标,但我可以提供一个想法。

bestNormalize需要“训练”数据,因此您可以考虑在单个组上对其进行训练,然后使用以下方法将其应用于其他组predict


# Trains data on Grade 1
(BNobjectall <- bestNormalize(nooutliers$totalscore[nooutliers$Grade == 1]))

# Applies Grade 1 transform to all data points
nooutliers$transformed <- predict(BNobjectall)

如果您试图确保每个因子水平内的正态性,则需要像您已经完成的那样进行子集化,并注意归一化转换可能会有所不同,因为最佳归一化转换在各组之间是不同的。如果您试图在因子级别上保持一致的转换,那么我的建议是使用数据不变的转换,例如对数或平方根转换,或使用上述方法。

于 2020-10-20T23:04:49.217 回答