0

mapply 関数を使用して等高線図を作成しようとしています。私はRの初心者です.mapplyに関する他の投稿を読みましたが、mapply関数の本質をまだ理解していません. 次の問題で立ち往生しています。

値を返す関数 px (2 つの引数を受け取る) があります。そして、draw.graph 関数を使用して等高線図を作成しようとしています。この関数は、2 つのシーケンス (n1,n2) を引数として受け取ります。しかし、contour() の z は行列ではないというエラーが表示され続けました。

browser() を使用しようとしましたが、mapply() を実行した後、マトリックスを取得できないことに気付きました。だから私の質問は、このコンテキストでmapply関数を使用して行列を取得するにはどうすればよいですか??? 可能であれば、誰かが私のコードで犯した間違いを指摘できますか? 次のエラーが発生し続けました。

 Error in contour.default(n1, n2, y) : no proper 'z' matrix specified

    # This function returns a value only    
        px <- function(mu.a, mu.b)
            {
                   #Note that x is just a vector in this context. specified
                   # outside the function. Since it is very long, I want specify it here.           
                    n1 <- dnorm(x, mean = mu.a, sd = 0.3)
                n2 <- dnorm(x, mean = mu.b, sd = 0.3)

                pxd<- 0.7 * n1 + (1-0.7) * n2

                return
                {
                    prod(pxd)
                }   
            } 
            #I am trying to generate a contour plot below of the function px.q3 with
           # arguments n1,n2, which will be sequences
            draw.graph <- function(n1,n2)
            {   

                y <- mapply(px,n1,n2)
                browser()
                contour(n1,n2,y)
            }
            draw.graph(seq(1.0,1.6,0.01),seq(2.4,3,0.01))

My aim of the draw.graph function is to get a contour plot as a function mu.a(i.e. n1) and mu.b(i.e. n2) <- 2 sequences. 
4

2 に答える 2

3

この関数に x の値を渡さないでください...グローバルを使用していると思いますか??? いたずら!

このようにpxを楽しくすることができます

px <- function(mu.a, mu.b, x)
        { etc..

その後、 MoreArgsオプションを使用して x を指定できます。

y2 <- mapply(FUN=px,n1,n2, MoreArgs=list(x), SIMPLIFY = T)

y2 はベクトルであり、再形成する必要がある行列ではありません

dim(y2)=c(length(n2), length(n1))
于 2012-11-26T19:28:51.427 に答える
1

ここでは、mapply()を使用する代わりに、 outer ()を使用できます。これは、断片的に行う代わりに、すべての組み合わせを実行します。NB Vectorize()を使用して、 mu.amu.bをベクトルとして受け入れるベクトル化された関数を作成し、 xはすべての組み合わせに対して固定されていることに注意してください。

これは間違いなく機能します (つまり、機能する Fig を生成します) が、そのように見えるはずかどうかはわかりませんか???

x1 = seq(0, 1,.1)
n1=seq(1.0,1.6,0.01)
n2=seq(2.4,3,0.01)

#question 3 - as a function mu.a, mu.b
px.q3 <- function(mu.a, mu.b, x=x1)
{
  n1 <- dnorm(x, mean = mu.a, sd = 0.3)
  n2 <- dnorm(x, mean = mu.b, sd = 0.3)
  #p(x_d)
  pxd<- 0.7 * n1 + (1-0.7) * n2

  return
  {
  prod(pxd)
  }   
}

vectorised.px.q3=Vectorize(px.q3)
y= outer(n1,n2, FUN=vectorised.px.q3)
contour(n1,n2,y)
于 2012-11-26T23:55:42.617 に答える