我想绘制变量的密度,其范围如下:
Min. :-1214813.0 1st Qu.: 1.0 Median : 40.0 Mean : 303.2 3rd Qu.: 166.0 Max. : 1623990.0
密度的线性图导致在[0,1000]范围内的高柱,具有朝向正无穷大和负无穷大的两个非常长的尾部.
因此,我想将变量转换为对数刻度,以便我可以看到平均值周围发生了什么.
例如,我想的是:
log_values = c( -log10(-values[values<0]),log10(values[values>0]))
这导致:
Min. 1st Qu. Median Mean 3rd Qu. Max. -6.085 0.699 1.708 1.286 2.272 6.211
这个问题的主要问题是它不包含0值.
当然,我可以使用值[值> = 0] 1将所有值从0移开,但这会在数据中引入一些失真.
将这个变量转换为对数尺度的可接受且科学可靠的方法是什么?
解决方法
除了转换之外,您还可以操纵直方图本身来了解您的数据.这为您提供了这样的优势:图表本身可以读取,您可以立即了解中心的分布情况.假设我们模拟以下数据:
Data <- c(rnorm(1000,5,10),sample(-10000:10000,10)) > summary(Data) Min. 1st Qu. Median Mean 3rd Qu. Max. -9669.000 -2.119 5.332 85.430 12.460 9870.000
然后你有几种不同的方法.最容易看到数据中心的内容,只是绘制数据的中心.在这种情况下,假设我对第一个和第三个四分位数之间发生的事情感兴趣,我可以绘制:
hist(Data,xlim=c(-30,30),breaks=c(min(Data),seq(-30,30,by=5),max(Data)) main="Center of Data" )
如果您还想计算尾部,您可以转换数据以折叠尾部并更改轴以反映它,如下所示:
>您将感兴趣范围之外的所有值分配到该范围之外的值
>绘制直方图,将一个箱中的所有极值合并
>使用正确的标签构造X轴
>您使用包plotrix中的axis.break()在X轴上添加一些断点,表示不连续的轴
为此你可以使用类似下面的代码:
require(plotrix) # rearrange data plotdata <- Data id <- plotdata < -30 | plotdata > 30 plotdata[id] <- sign(plotdata[id])*35 # plot histogram hist(plotdata,xlim=c(-40,40),breaks=c(-40,main="Untailed Data",xaxt='n' # leave the X axis away ) # Construct the X axis axis(1,at=c(-40,by=10),labels=c(min(Data),max(Data)) ) # add axis breaks axis.break(axis=1,breakpos=-35) axis.break(axis=1,breakpos=35)
这给你: