43

プロットする前にデータセットを構築しようとしています。関数ファクトリを使用することにしましたgammaplot.ff()。コードの最初のバージョンは次のようになります。

PowerUtility1d <- function(x, delta = 4) {
  return(((x+1)^(1 - delta)) / (1 - delta))
}
PowerUtility1d <- Vectorize(PowerUtility1d, "x")

# function factory allows multiparametrization of PowerUtility1d()
gammaplot.ff <- function(type, gamma) {
  ff <- switch(type, 
               original = function(x) PowerUtility1d(x/10, gamma),
               pnorm_wrong = function(x) PowerUtility1d(2*pnorm(x)-1, gamma),
               pnorm_right = function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma)
              )
  ff
}

gammaplot.df <- data.frame(type=numeric(), gamma=numeric(), 
                           x=numeric(), y=numeric())
gammaplot.gamma <- c(1.1, 1.3, 1.5, 2:7)
gammaplot.pts <- (-1e4:1e4)/1e3

# building the data set
for (gm in gammaplot.gamma) {
   for (tp in c("original", "pnorm_wrong", "pnorm_right")) {
     fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)    
     dataChunk <- cbind(tp, gm, gammaplot.pts, fpts)
     colnames(dataChunk) <- names(gammaplot.df)
     gammaplot.df <- rbind(gammaplot.df, dataChunk)
   }
}

# rbind()/cbind() cast all data to character, but x and y are numeric
gammaplot.df$x <- as.numeric(as.character(gammaplot.df$x))
gammaplot.df$y <- as.numeric(as.character(gammaplot.df$y))

データ フレーム全体に文字データが含まれていることが判明したため、手動で元に戻す必要があります (最初にそれを発見するのに時間がかかりました!)。SO検索は、変数が文字であるためにこれが発生することを示しています。これを回避するために (データ セットの構築中に文字データのパフォーマンスの問題を想像できます!)、コードを少し変更しました。

gammaplot.ff <- function(type, gamma) {
  ff <- switch(type, 
               function(x) PowerUtility1d(x/10, gamma),
               function(x) PowerUtility1d(2*pnorm(x)-1, gamma),
               function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma)
              )
  ff
}

for (gm in gammaplot.gamma) {
  for (tp in 1:3) {
    fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)    
    dataChunk <- cbind(tp, gm, gammaplot.pts, fpts)
    colnames(dataChunk) <- names(gammaplot.df)
    gammaplot.df <- rbind(gammaplot.df, dataChunk)
  }
}

これは私にとってはうまく機能しますが、欠点である自明の文字パラメーターを失いました。すべてのデータを暗黙的に文字に変換せずに、関数ファクトリの最初のバージョンを維持する方法はありますか?

同じ結果を達成する別の方法があれば、喜んで試してみたいと思います。

4

3 に答える 3

93

rbind.data.framecbind.data.frameの代わりにrbindとを使用できますcbind

于 2013-10-23T08:26:39.270 に答える