7

グラフを作成するためのdata.frameを作成しようとしています。2つの入力として使用したい関数と2つのベクトルがあります。これは少し単純化されていますが、基本的に私が持っているのは次のとおりです。

relGPA <- seq(-1.5,1.5,.2)
avgGPA <- c(-2,0,2)

f <- function(relGPA, avgGPA) 1/(1+exp(sum(relGPA*pred.model$coef[1],avgGPA*pred.model$coef[2])))

必要なのは、avgGPA値用に3列、relGPA値用に16行で、結果の値がセルに含まれるdata.frameだけです。

これがいかに基本的であるかをお詫び申し上げますが、私はあなたの助けなしにこれを実現しようとしたことを保証します。sapplyとmapplyのmanページの例に従ってみましたが、Rには少し慣れていないので、何をしようとしているのかわかりません。

ありがとう!

4

1 に答える 1

4

提供された情報ではテストできませんが、これは機能するはずです。

expGPA  <- outer(relGPA, avgGPA, FUN=f) # See below for way to make this "work"

組み合わせを生成したい場合のもう 1 つの便利な関数はexpand.grid、次のとおりです。これにより、「長い形式」が得られます。

expGPA2 <-expand.grid(relGPA, avgGPA)
expGPA2$fn <- apply(expGPA2, 1, f)

長い形式は、ラティスと ggplot が高レベルのプロットの入力形式として期待するものです。

編集: djhurio によって指摘され、Vectorize戦略を使用して Sam Swift によって (解決された) 関数に列参照を渡すためのより具体的な方法を構築する必要がある場合があります。の場合applysum関数は上記のようにすぐに機能しますが、除算演算子は機能しないため、複数の引数を持つより複雑な関数に一般化できる別の例を次に示します。x(残念ながら) 列名は引数に引き継がれないため、プログラマーが必要とするのは、「apply()」関数の適切な引数の列番号だけです。

> expGPA2$fn <- apply(expGPA2, 1, function(x) x[1]/x[2])
> str(expGPA2)
'data.frame':   48 obs. of  3 variables:
 $ Var1: num  -1.5 -1.3 -1.1 -0.9 -0.7 ...
 $ Var2: num  -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 ...
 $ fn  : num  0.75 0.65 0.55 0.45 0.35 ...
 - attr(*, "out.attrs")=List of 2
  ..$ dim     : int  16 3
  ..$ dimnames:List of 2
  .. ..$ Var1: chr  "Var1=-1.5" "Var1=-1.3" "Var1=-1.1" "Var1=-0.9" ...
  .. ..$ Var2: chr  "Var2=-2" "Var2= 0" "Var2= 2"

Edit2: (2013-01-05) 1 年後にこれを見て、SamSwift の関数は、本体に の代わりに "+" を使用することでベクトル化できることに気付きましたsum

 1/(1+exp( relGPA*pred.model$coef[1] + avgGPA*pred.model$coef[2]) # all vectorized fns
于 2011-03-25T22:20:28.210 に答える