14

R で( を使用して) ワイブル プロットを表示する R パッケージを構築しgraphics::plotています。プロットには、対数変換されたx軸とワイブル変換されたy軸があります (より適切な説明がないため)。したがって、2 パラメーターのワイブル分布は、このプロット上で直線として表すことができます。

x軸の対数変換は、log="x"パラメータをplot()またはに追加するのと同じくらい簡単curve()です。グラフィックス関連のすべてのプロットが軸変換されたプロットで機能するように、y軸変換をエレガントな方法で提供するにはどうすればよいですか? 必要なものを示すために、次のサンプル コードを実行します。

## initialisation ##
beta     <- 2;eta <- 1000
ticks    <- c(seq(0.01,0.09,0.01),(1:9)/10,seq(0.91,0.99,0.01))
F0inv    <- function (p) log(qweibull(p, 1, 1))
    # this is the transformation function
F0       <- function (q) exp(-exp(q))
    # this is the inverse of the transformation function
weibull  <- function(x)pweibull(x,beta,eta)
    # the curve of this function represents the weibull distribution 
    # as a straight line on weibull paper
weibull2 <- function(x)F0inv(weibull(x))

最初に、通常の変換されていないプロットをbeta=2使用したワイブル分布の例:eta=1000

## untransformed axes ##
curve(weibull ,xlim=c(100,1e4),ylim=c(0.01,0.99))
abline(h=ticks,col="lightgray")

プロット1

このプロットは、ワイブル解析には役に立ちません。これは、関数を使用してデータを変換し、プロットのyF0inv()軸を変更する、現在実装されているソリューションです。すべてのy軸関連データで使用する必要があることに注意してください。F0inv()

## transformed axis with F0inv() ##
curve(weibull2,xlim=c(100,1e4),ylim=F0inv(c(0.01,0.99)),log="x",axes=F)
axis(1);axis(2,at=F0inv(ticks),labels=ticks)
abline(h=F0inv(ticks),col="lightgray")

プロット2

これは機能しますが、これはあまりユーザーフレンドリーではありません: ユーザーが注釈を追加したいときは、常に次を使用する必要がありますF0inv():

text(300,F0inv(0.4),"at 40%")

私の問題は および scales を使用して解決できることがわかりましたがggplot2、他の多くのコードを書き直す必要があるため、どうしても必要な場合を除き、グラフィック パッケージに変更したくありません。

## with ggplot2 and scales ##
library(ggplot2)
library(scales)
weibull_trans <- function()trans_new("weibull", F0inv, F0)
qplot(c(100,1e4),xlim=c(100,1e4),ylim=c(0.01,0.99),
    stat="function",geom="line",fun=weibull) + 
    coord_trans(x="log10",y = "weibull") 

プロット3

対数変換を適用するコードを動的に独自のものに置き換えることができれば、問題は解決すると思います。

「R軸変換」、「Rユーザー座標」、「R軸スケーリング」をグーグルで検索して、有用な結果なしでより多くの情報を見つけようとしました。私が見つけたほとんどすべてが対数スケールを扱っていました。

パラメータがplot()どのように機能するかを調べようとしましたが、関連するコードは C で記述されています。これは私の強みではありません。log="x"plot.window

4

1 に答える 1

1

基本グラフィックスでは可能ではないように見えますが、この関数を必要に応じて実行して、より簡単に呼び出すことができます。

F0inv    <- function (p) log(qweibull(p, 1, 1))
## this is the transformation function
F0       <- function (q) exp(-exp(q))

weibullplot <- function(eta, beta,
                        ticks=c(seq(0.01,0.09,0.01),(1:9)/10,seq(0.91,0.99,0.01)),
                        ...) {
  ## the curve of this function represents the weibull distribution 
  ## as a straight line on weibull paper
  weibull2 <- function(x)
    F0inv(pweibull(x, beta, eta))
  curve(weibull2, xlim=c(100, 1e4), ylim=F0inv(c(0.01, 0.99)), log="x", axes=FALSE)
  axis(1);
  axis(2, at=F0inv(ticks), labels=ticks)
  abline(h=F0inv(ticks),col="lightgray")
}

weibullplot(eta=1000, beta=2)
于 2014-07-12T02:25:19.360 に答える