0

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

y 轴是概率(范围 0 到 1),x 轴是“天数”。

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

有没有办法做到这一点?

先感谢您!

数据示例: data$

              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
:二进制,如果被审查
则为0

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

问题是你不能从 <1 的数字计算两倍的对数,因为第一个对数会给出一个负数,而你不能从负数计算对数。这就是为什么我要转换轴而不是值的原因。

到目前为止我所做的:到目前为止
,我的解决方法是将我的 y 值乘以一个数字(例如 1000),这样我就没有任何小于 1 的值,然后计算这些值的对数对数。然后我绘制它们,隐藏轴并使用 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()来转换轴。有一些可用的转换,但我找不到对数日志的转换。幸运的是,还可以使用scales包中的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)) 中:产生了 NaN

4

2 回答 2

1

我怀疑您被期望绘制“互补对数-log”,这可能意味着您被要求绘制对数的对数。我承认这并不完全是这样的情节通常出现的方式。我通常在有关生存分析的文本中看到的是上升趋势,当满足可能的危险假设时,应该看到 log(-log(survival)) 与时间的大致平行线(斜率为正)。

 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) ) ) )

在此处输入图像描述

因此,考虑一下我将 survCount/10 视为在 time= X 时存活的比例:

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

在此处输入图像描述

于 2014-06-12T17:55:22.440 回答
1

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

这将允许你对轴做任何你想做的事情。例如,

m <- qplot(rating, log10(votes), data=subset(movies, votes > 1000), na.rm = TRUE)
m + scale_y_log10() + scale_x_log10()
于 2014-06-12T13:58:45.147 回答