我有一个包含5列的数据框。我想使用yeo-johnson变换将这些变量中的每一个变换为正态分布,因为一些变量具有负值。数据框如下:
df<-data.frame(a=rnorm(1:20,10,3),b=rnorm(20,32,2),c=rnorm(20,19,1),d=rnorm(20,60,6),e=rnorm(20,35,5))
每个变量在数据框的某处都有NA值,但也在前几行中有NA值,如下所示:
df[1:5,]<-NA
现在,我想估算每个变量的转换能力,我正在使用prePrecess
包中的caret
函数(因为它允许缺少值)。然后我使用predict
函数将转换后的值转换为数据框。
pall<-preProcess(df, method = "YeoJohnson", na.remove = FALSE)
transformed_df<-predict(pall,df,na.action=na.pass)
效果很好,但是我的回归模型预测了一些负值,这些负值在反向变换期间会导致问题,因为它会为负值产生NaN。为此,我尝试在变量'd'中添加一些常量,模型给出负值。
df$d<-df$d+30
当我再次对修改后的数据帧使用preProcess
函数时,该函数会删除列'd'并仅为4个变量提供幂lambda的估计值。我没有收到任何错误或任何警告,但是当我打印pall
的值时,我会收到以下信息:
> pall
Created from 8288 samples and 4 variables
Pre-processing:
- ignored (0)
- Yeo-Johnson transformation (4)
Lambda estimates for Yeo-Johnson transformation:
0.61, 0.93, 1.06, 0.17
这种行为可能会或可能不会与其他数据重现,因为我有许多不同的文件具有相似的数据,这种方式(添加常量)适用于其中一些但不是全部。我检查了每列的数字类,因此变量类也没有问题。我不明白为什么preProcess
函数会忽略通过添加常量修改的列。任何帮助将不胜感激!
类似的问题已经被问到here但尚未得到答复。