1

行と列のグリッドの値データを表す R の 2 次元配列があります。次のようになります。

     [,1] [,2] [,3] [,4]
[1,]    1    1    2    1
[2,]    1    5    6    3
[3,]    2    3    2    1
[4,]    1    1    1    1

これらの値を「滑らか」にしたい。この概念実証の時点では、一般的な平滑化関数を使用しても問題ありません。私は現在、smooth.spline関数を使用しようとしています:

smooth.spline(x, y = NULL, w = NULL, df, spar = NULL,
              cv = FALSE, all.knots = FALSE, nknots = NULL,
              keep.data = TRUE, df.offset = 0, penalty = 1,
              control.spar = list())

(単純に)呼び出すことによって

smoothed <- smooth.spline(myarray)

これを実行すると、次のエラーが発生します。

Smooth.spline(a) のエラー: 少なくとも 4 つの一意の「x」値が必要です

私の配列には各次元に 4 つ以上の一意の値があるため、入力データを適切にフォーマットする方法がわからないと考えています。誰かが私にこの種のことへのいくつかの指針を与えることができますか? のような関数の例はsmooth、1 次元のベクトルで動作するように見えますが、2 次元の世界に外挿することはできないようです。私は R の初心者なので、用語の誤用をここで訂正してください。

4

3 に答える 3

8

平滑化は大きなトピックであり、多くの関数はR自体で、およびCRANなどの場所からの追加パッケージを介して利用できます。VenablesとRipleyによる人気のある本「 ModernAppliedStatisticswith S」は、セクション8.1にそれらの数をリストしています:(私は-私の第4版が機能していると思います)そして図8.1:

  • 多項式回帰:lm(y ~ poly(x))
  • 自然スプライン:lm(y ~ ns(x))
  • 平滑化スプライン:smooth.splines(x, y)
  • Lowess:(lowess(x, y)そしてより新しい/好ましい方法
  • ksmooth:ksmooth(x, y)
  • supsmu:spusmu(x, y)

本に付属するMASSパッケージをインストールすると、ファイルを介してこれを実行し、 scripts/ch08.R自分で実験することができます。

于 2010-01-23T01:02:41.147 に答える
8

垂直軸または水平軸で 1 次元の平滑化を行うには、次の apply を使用します。

apply(myarray,1,smooth.spline)

また

apply(myarray,2,smooth.spline)

私は 2 次元の平滑化に慣れていませんが、fields パッケージを使った簡単な実験はうまくいったようです。fieldsパッケージとその依存関係をインストールする必要があります。myMatrix上記のマトリックスはどこにありますか...(私はそれを再作成します):

# transform data into x,y and z
m = c(1,1,2,1,1,5,6,3,2,3,2,1,1,1,1,1)
myMatrix = matrix(m,4,4,T)
myMatrix
     [,1] [,2] [,3] [,4]
[1,]    1    1    2    1
[2,]    1    5    6    3
[3,]    2    3    2    1
[4,]    1    1    1    1
Z = as.vector(myMatrix)
XY=data.frame(x=as.numeric(gl(4,1,16),Y=as.numeric(gl(4,4,16))
t=Tps(XY,Z)
surface(t)

きれいなプロットを作成しました。

于 2010-01-23T00:32:46.290 に答える