我想绘制变量的密度,其范围如下:
Min. :-1214813.0
1st Qu.: 1.0
Median : 40.0
Mean : 303.2
3rd Qu.: 166.0
Max. : 1623990.0
Run Code Online (Sandbox Code Playgroud)
密度的线性图导致在[0,1000]范围内的高柱,具有朝向正无穷大和负无穷大的两个非常长的尾部.因此,我想将变量转换为对数刻度,以便我可以看到平均值周围发生了什么.例如,我想的是:
log_values = c( -log10(-values[values<0]), log10(values[values>0]))
Run Code Online (Sandbox Code Playgroud)
这导致:
Min. 1st Qu. Median Mean 3rd Qu. Max.
-6.085 0.699 1.708 1.286 2.272 6.211
Run Code Online (Sandbox Code Playgroud)
这个问题的主要问题是它不包含这些0值.当然,我可以远离转移所有的值0用values[values>=0]+1,但这将数据引入一些失真.
将这个变量转换为对数尺度的可接受且科学可靠的方法是什么?
除了转换之外,您还可以操作直方图本身来了解数据。这给您带来的好处是绘图本身保持可读性,并且您可以立即了解中心的分布情况。假设我们模拟以下数据:
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
Run Code Online (Sandbox Code Playgroud)
然后你有几种不同的方法。要了解数据中心发生的情况,最简单的方法就是绘制数据中心。在这种情况下,假设我对第一和第三四分位数之间发生的事情感兴趣,我可以绘制:
hist(Data,
xlim=c(-30,30),
breaks=c(min(Data),seq(-30,30,by=5),max(Data))
main="Center of Data"
)
Run Code Online (Sandbox Code Playgroud)

如果您还想计算尾部,可以转换数据以折叠尾部并更改轴以反映这一点,如下所示:
axis.break()包中的内容plotrix在 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,seq(-30,30,by=5),40),
main="Untailed Data",
xaxt='n' # leave the X axis away
)
# Construct the X axis
axis(1,
at=c(-40,seq(-30,30,by=10),40),
labels=c(min(Data),seq(-30,30,by=10),max(Data))
)
# add axis breaks
axis.break(axis=1,breakpos=-35)
axis.break(axis=1,breakpos=35)
Run Code Online (Sandbox Code Playgroud)
这给你:

freq=TRUE请注意,您可以通过添加到该函数来获得原始频率hist()。