裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

プログラムの使い方が間違っているのではないか?

2012年01月25日 | 裏 RjpWiki

npパッケージのnpcmstestでbwsで具体的にbandwidthを指定すると「仮引数 ”bws” が複数の実引数にマッチしました」というエラーがでてしまいます

ななみ? (2012-01-21 (土) 21:55:03)

はじめまして。npパッケージでモデルの検定をしています。

model <- lm(Y ~ X, y = TRUE, x = TRUE)
X <- data.frame(X)
npcmstest(model = model, xdat = X, ydat = Y, bws = 1)

のようにバンド幅を指定すると

「仮引数 ”bws” が複数の実引数にマッチしました」

というエラーがでてしまいます。
どなたか、これに対する解決方法をご存じでしたらお教え頂きますようお願い致します。

  • 再現できる最小のサンプルデータがないと答えるのが難しいと思う。bwsが一意でないエラーに見えるけど、サンプルがないと何とも言えない。 -- 2012-01-23 (月) 15:58:06

少なくとも「サンプルがないと何とも言えない」というのは,この場合たぶんまとはずれ。事前に,X <- rnorm(10); Y <- rnorm(10) とでも定義しておくだけで問題は再現する。

問題の核心は,確かに npcmstest では,... 引数で指定できるものとして,bws と bwscaling があり,このような状況では bws を指定すると件のエラーメッセージが出るのは必至。

にもかかわらずこれが問題にならない・なっていないのは,そもそもこのような使い方はないのか,単なる放置されたバグなのか,判断にこまるところ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ダメ出し:自分で

2012年01月25日 | ブログラミング

この一つ前の記事で。

二重の for は効率が悪い。outer を使うのがよい。

system.time({
x <- seq(-0.5, 3, length = 1000)
y <- seq(-2.5, 2.5, length = 1000)
z <- matrix(0, 1000, 1000)
for (i in 1:1000) {
    for (j in 1:1000) {
        z[i, j] <- (x[i] ^ 2 + y[j] ^ 2 - 2 * x[i]) ^ 3 - 4 * x[i] ^ 2 * y[j] ^ 2
    }
}
contour(x, y, z, drawlabels = FALSE, levels = c(0, 1, 2, 5, 10, 20, 30, 50))
})

#   ユーザ   システム       経過 
#    11.962      0.119     12.111

10 倍速だ。

system.time({
x <- seq(-0.5, 3, length = 1000)
y <- seq(-2.5, 2.5, length = 1000)
z <- outer(x, y, function(xi, yj) (xi ^ 2 + yj ^ 2 - 2 * xi) ^ 3 - 4 * xi ^ 2 * yj ^ 2)
contour(x, y, z, drawlabels = FALSE, levels = c(0, 1, 2, 5, 10, 20, 30, 50))
})
#   ユーザ   システム       経過 
#     0.923      0.037      0.956


下記のような cxxfunction を使うのと遜色ない実行速度

library(inline)
src <- '
    Rcpp::NumericVector x(X);
    Rcpp::NumericVector y(Y);
    int nx = x.size();
    int ny = y.size();
    Rcpp::NumericMatrix z(nx, ny);
    for (int i = 0; i < nx; i++) {
        for (int j = 0; j < ny; j++) {
            z(i, j) = pow(x(i) * x(i) + y(j) * y(j) - 2 * x(i), 3) - 4 * x(i) * x(i) * y(j) * y(j);
        }
    }
    return wrap(z);
'
calcZ <- cxxfunction(signature(X="numeric", Y="numeric"), src, plugin="Rcpp")
x <- seq(-0.5, 3, length = 1000)
y <- seq(-2.5, 2.5, length = 1000)
z <- calcZ(x, y)
contour(x, y, z, drawlabels = FALSE, levels = c(0, 1, 2, 5, 10, 20, 30, 50))

もっとも,これを以下のようにするとちょっとだけ速くなる。ループ内で不変な計算はループの外でやることと,何回も同じ計算をするときには一回計算して変数に代入しておくこと。

src <- '
    Rcpp::NumericVector x(X);
    Rcpp::NumericVector y(Y);
    int nx = x.size();
    int ny = y.size();
    Rcpp::NumericMatrix z(nx, ny);
    for (int i = 0; i < nx; i++) {
        double xi2 = x(i) * x(i);
        for (int j = 0; j < ny; j++) {
            double yj2 = y(j) * y(j);
            z(i, j) = pow(xi2 + yj2 - 2 * x(i), 3) - 4 * xi2 * yj2;
        }
    }
    return wrap(z);
'

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村