R中y轴的对数对数刻度

时间:2014-06-12 13:46:05

标签: r data-visualization weibull

我正在尝试为R中的删失数据创建一个Weibull概率图。为此,我需要y轴的对数对数刻度和x轴的对数刻度。

y轴是概率(范围0到1),x轴是“以天为单位的时间”。

我知道我可以在plot()函数中用log =“xy”创建对数轴。但是我需要y轴的对数对数刻度。

有办法吗?

提前谢谢!

数据示例: 数据$

              X cens survCount   medianRank
       136.5424    1        10   0.09090909
       181.9756    1         9   0.18181818
       192.4309    1         8   0.27272727
       216.6145    1         7   0.36363636
       224.3097    0         6   NA
       254.4997    0         5   NA
       285.1438    1         4   0.49090909
       289.3991    1         3   0.61818182
       295.9161    0         2   NA
       309.9522    0         1   NA

X:直至失败的时间
cens:binary,0如果被删失
survCount:失败/审查前存活的事物数量 medianRanks:累计失败概率

解释
所以X是我想要的log x轴,而且medianRanks是我想要的log-log y轴。

问题是你无法从数字<1开始计算对数的两倍,因为第一个对数将给出一个负数而你无法从负数计算对数。这就是我想要转换轴而不是值的原因。

到目前为止我做了什么:
到目前为止我的解决方法是将我的y值乘以一个数字(例如1000),这样我就没有任何小于1的值,然后计算这些值的log-log。然后我绘制它们,隐藏轴并使用axis()函数添加新轴。

data$medianRank <- data$medianRank*1000  
loglogY <- log(log(data$medianRank))  
logX <- log(data$X)  

plot(logX, loglogY, yaxt="n", xaxt="n")  

ylabels <- c(0.1, 0.2, 0.5, 0.7, 0.99)
yAt <- log(log(ylabels*1000))
axis(2, at=yAt, labels=ylabels)
xlabels <- c(100, 200, 300, 400)
xAt <- log(xlabels)
axis(1, at=xAt, labels=xlabels)

@ mike1886建议使用 ggplot2 包。我看了看它,我发现它非常有前景。当创建一个ggplot时,可以添加 coord_trans()来转换轴。有一些转换可用,但我找不到日志日志。幸运的是,还可以使用 scale 包中的 trans_new()函数编写自定义转换。
到目前为止,我的代码用于新的转换:

require(ggplot2)
require(scales)
loglog_trans <- function(){
  trans <- function(x){ log(log(x)) }
  inv <- function(x){ exp(exp(x)) }
  trans_new("loglog", trans, inv)
}

wpp <- ggplot(data2, aes(ftime, medianRank)) + geom_point()
wpp
wpp + coord_trans("log10", "loglog")

但它没有用。

  

if(zero_range(range)){:缺少值需要TRUE / FALSE时出错   另外:警告信息:   在log(log(x))中:生成NaNs

2 个答案:

答案 0 :(得分:1)

你可以尝试在R中使用ggplot2(这是一个非常好的完整的绘图包)。例如,考虑查看页面:http://www.cookbook-r.com/Graphs/Axes_(ggplot2)/#axis-transformations-log-sqrt-etc

这将允许您对轴进行任何操作。 例如,

m <- qplot(rating, log10(votes), data=subset(movies, votes > 1000), na.rm = TRUE)
m + scale_y_log10() + scale_x_log10()

答案 1 :(得分:1)

我怀疑你被期望绘制“补充日志-log”,这可能意味着你被要求绘制否定日志的日志。我承认这并不是这些情节通常如何出现的原因。我通常在关于生存分析的文本中看到的是一个上升趋势,人们应该看到log(-log(生存))的大致平行线(正斜率)与符合预期危险假设的时间相对应。

 dat <- read.table(text="             X cens survCoun
        136.5424    1        10   0.09090909
        181.9756    1         9   0.18181818
        192.4309    1         8   0.27272727
        216.6145    1         7   0.36363636
        224.3097    0         6   NA
        254.4997    0         5   NA
        285.1438    1         4   0.49090909
        289.3991    1         3   0.61818182
        295.9161    0         2   NA
        309.9522    0         1   NA", header=TRUE)

 with( dat, plot( log(X), log( - log(medianRank) ) ) )

enter image description here

所以请考虑一下我将survCount / 10作为时间上存活的比例= X:

png(); with( dat, plot( log(X), 
                        log( - log(survCount/max(survCount) ) ) 
                       ) )
dev.off()

enter image description here