我正在尝试为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
答案 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) ) ) )
所以请考虑一下我将survCount / 10作为时间上存活的比例= X:
png(); with( dat, plot( log(X),
log( - log(survCount/max(survCount) ) )
) )
dev.off()