2017-03-15 23 views
0

私は、多くの場合、いくつかの統計モデルをテストするために乱数ベクトルの任意の数の列を作成するにはどうすればよいですか?

sample_size = 10^4 
my_data <- data.frame(x1 = runif(sample_size, 0,3), x2 = runif(sample_size, 0,3), x3 = runif(sample_size, 0,3), x4 = runif(sample_size, 0,3)) 

のようなものを記述する必要があります。例えば、my_dataので

error <- rnorm(sample_size, 0, 0.1) 
y <- with(my_data, 2*x1+0.1*(x2 + x3 + x4)) + error 
my_model <- lm(y ~ ., data = my_data) 

lmへの入力として使用され、それはデータ・フレーム(またはリスト)でなければなりません。

これを行うには、runifを4回呼び出すのが正しい方法か、より良い解決策があるのだろうかと思います。試しました

my_data <- matrix(4*runif(sample_size, 0,3), sample_size, 4, dimnames = list(NULL, paste0("x", 1:4))) 
my_data <- as.data.frame(my_data) 

しかし、私にはわかりにくいようです。

+0

'as.data.frame(replicate(4、runif(sample_size、0、3)))'。あなたはそれを行列として残す方が良いかもしれませんが。 – Gregor

+0

@Gregor 'replicate'は素晴らしいですが、私はそれを考えませんでした。私は 'my_data'が線形回帰のプレディクタを格納する必要があるので、データフレームである必要があります。これを明らかにするために質問を編集します。 – DeltaIV

+0

唯一の違いは、必要なコードが 'as.data.frame'でラップされているかどうかという点で、あなたの質問を複雑にする必要はありません。私はあなたの質問を "ランダムベクトルの任意の数の列を作成するにはどうすればいいですか?"そうである限り、質問は非具体的かつおそらく意見に基づいている。 – Gregor

答えて

1

これを行うにはいくつかの方法があります。あなたがncol列をしたいとしましょう、ここではいくつかの良い方法があります。

ncol = 4 
sample_size = 10 

replicate(ncol, runif(sample_size, 0, 3)) 
matrix(runif(sample_size * ncol, 0, 3), ncol = ncol) 
sapply(1:ncol, function(x) runif(sample_size, 0, 3)) 

は、これらは、必要に応じて、あなたが、当然のことながら、データフレームに変換することができます行列を作成します。違いは軽微です。 replicateは本質的にsapplyの素晴らしいラッパーです。直接matrixメソッドは少し遅くであるかもしれませんが、おそらく差は数ミリ秒です。

+0

これは非常にクールですが、私は列の名前も必要です。もし 'mat'があなたのメソッドの一つによって構築された行列であれば、' data_mat < - as.data.frame(mat、col.names = paste0( "x"、1:ncol)) 'のようなことをお勧めしますか? – DeltaIV

+0

hmmm、いいえ、それはうまくいかないとあなたはそれを示唆していません。列名を追加するにはどうすればよいですか? 'dimnames'を使うこともできますが、' matrix'でも使えます。 – DeltaIV

+0

データフレームに名前を付ける方法はたくさんあります。 'names(data)< - ...'または 'set.names()'を使うことができます。 – Gregor

関連する問題