1

R バージョン 2.14.1 プラットフォーム: i386-apple-darwin9.8.0/i386 (32 ビット)

目的:dens()ライブラリの 関数を使用lessRして、通常の密度曲線と一般的な密度曲線をヒストグラムに重ねてプロットします。

問題: egrnorm()またはを使用してデータをrbinom()生成すると、正常に動作しますが、によって生成されたデータに対して実行すると、次のsample()エラーが返されます。

Error in if (from == to) rep.int(from, length.out) else as.vector(c(from,  : 
  argument is of length zero

MWE:

library(lessR)
data <- data.frame(col=sample(20))
y <- data$col
dens(y)

質問:sample()問題の原因と、関数 によって生成された 20 行の値を含み、それらを の入力として使用する単一列のデータ フレームが必要な場合はどうすればよいdens()ですか?

更新 (2012 年 11 月 17 日): R をバージョン 2.15.2 とlessRバージョン 2.6 に更新しました (どちらも利用可能な最新のものです)。

@Roland から提供されたデータを使用すると、エラーは次のようになります。

Error in seq.default(x.min, x.max, length = 200) : 
  'from' must be of length 1 

なぜそれが起こるのか理解できsample()、単一の値を複数使用できるようにすると正しい結果が得られます。

4

2 に答える 2

3

はい、lessR の開発者としてバグを発見しました。何が起こったかというと、密度プロットを中央に配置するための > および < 条件がありましたが、= 条件はありませんでした。この = 条件は、結果が 1 から 20 までの連続した整数であるため、sample(20) の呼び出しからトリガーされました。明らかに有効なセットですが、私のコードで = 条件をトリガーしたものであり、以前にテストしたことのない条件です。> を >= に変更すると、バグが修正されました。修正は、12 月 10 日頃に次のバージョンをアップロードするときに CRAN に適用されます。メンテナーは CRAN の頻繁な更新を思いとどまらせているため、12 月まで更新を待つ必要があります。

今のところ、例を使用して密度プロットを取得したい場合は、次の R コードを実行してください。

y <- sample(20)
dy <- density(y)
plot(dy)

また、約 4 年前にこのプロジェクトを開始したとき、約 43 の異なる機能を備えたデータ分析用の体系的なシステムを作成する計画はありませんでした。そのため、関数の最初の命名スキームは、システムがわずかな関数から成長したため、あまり一般化できませんでした。そのため、将来変更されないシステムを徐々に進化させました。各関数は、Density などの完全な名前で参照することも、通常の 2 文字の省略形 (この場合は dn) で参照することもできます。一貫性を保つために、略語も小文字の 2 文字にすることにしました。目標は、Histogram または hs、ScatterPlot または sp、BoxPlot または bx などの標準的なデータ分析手順をほとんど作業せずに作成し、グラフに提供されたカラー テーマを使用することです。デフォルトの配色テーマは青ですが、設定機能で簡単に変更できます。

于 2012-11-18T17:21:19.433 に答える
2

現在のバージョンの はlessR機能を提供していないように見えますがdens、代わりに function がありますDensity

R のバージョンとパッケージを更新することを検討しますか? なぜ 32 ビット バージョンの R を使用しているのですか? Mac では、64 ビット バージョンを使用できるはずです。

densから関数を見ましたlessR_2.1.1set.seedエラーを再現できませんでした (コードを再現可能にするために を使用しなかったため)。代わりに私は得Error in seq(min.x, max.x, length = 200) : Object 'min.x' not foundましたy <- c(3, 4, 8, 1, 6, 14, 20, 5, 13, 17, 19, 10, 2, 12, 7, 9, 18, 11, 15, 16)

関数コードからの抜粋を次に示します。

d.gen <- suppressWarnings(density(x, bw, ...))

        mx <- mean(x)

        # min and max x coordinates for graph, make symmetric
        min.dev.x <- min(d.gen$x) - mx
        max.dev.x <- max(d.gen$x) - mx
        if (abs(min.dev.x) > abs(max.dev.x)) {
          min.x <- min(d.gen$x)
          max.x <- mx + abs(min.dev.x)
        }
        if (abs(max.dev.x) > abs(min.dev.x)) {
          min.x <- mx - abs(max.dev.x)
          max.x <- max(d.gen$x)
        }

min.xコードはandmax.xを定義していないことに注意してくださいabs(min.dev.x) == abs(max.dev.x)。これはバグです。もちろん、これは 2 番目の if 条件を に変更することで簡単に修正できますif (abs(max.dev.x) >= abs(min.dev.x)) {

他にもバグがあるかもしれませんが、アーカイブされたバージョンのユーティリティ パッケージから機能を修正する価値はありません。もちろん、新しいDensity関数でも同様のエラーが発生し、実際には同じバグが含まれています。

于 2012-11-17T14:47:34.027 に答える