2017-03-14 4 views
-1

私は単純な関数se <- 0.11 * (x^2) - 0.002 * xを持っています。私は2つの出力変数を生成したいse.mse.st - それぞれが特定の間隔でxためのランダムrenerated値で100回の繰り返しからの結果を格納:ループで関数を格納する - R

se.m <- 0.11 * (x^2) - 0.002 * x  # if x[0,1] 

または

se.st <- 0.11 * (x^2) - 0.002 * x  # if x(1,5] 

私はこのコードを書かれています

my.mat <- matrix(0,100,2) 
x <- runif(n = 1, min = 0, max = 5) 

fuchs <- function(n){ 
    x.m <- runif(n = 1, min = 0, max = 1) 
    x.st <- runif(n = 1, min = 1, max = 5) 
    for(i in 1:n){ 
    print(x.m[i] <- runif(n = 1, min = 0, max = 1)) 
    se.m <- 0.11 * (x.m^2) - 0.002 * x.m 
    print(x.st[i] <- runif(n = 1, min = 1, max = 5)) 
    se.st <- 0.11 * (x.st^2) - 0.002 * x.st 
    } 
    return(list(se.m, se.st)) 
} 
fuchs(100) 

出力を2列に保存するにはどうすればよいですか?私はmatrixコマンドを使用して試してみましたが、私は、データが長すぎるというエラーが出ます:マトリックス中

my.mat < - マトリックス(my.mat、se.m) エラー(my.mat、 se.m):データが長すぎます

また、リストコマンドは出力を出力しません。

私はあなたが推測できるようにRには新しく、建設的なコメント/批評を非常に賛美します。

+0

2番目の質問に対するもう1つの答えは、関数 'fuchs()'の中の 'cbind(se.m、se.st)'です。 – nadizan

答えて

0

1)問題はインデックスにあるようです。元のコードで

fuchs <- function(n){ 
x.m=se.m=x.st=se.st=NULL 
    for(i in 1:n){ 
    print(x.m[i] <- runif(n = 1, min = 0, max = 1)) 
    se.m[i] <- 0.11 * (x.m[i]^2) - 0.002 * x.m[i] 
    print(x.st[i] <- runif(n = 1, min = 1, max = 5)) 
    se.st[i] <- 0.11 * (x.st[i]^2) - 0.002 * x.st[i] 
    } 
    return(list(se.m, se.st)) 
} 
fuchs(100) 

、あなたは変数に、単一の乱数を設定x.mx.st、その後forサイクルで値を追加。最後の反復では、方程式はベクトル全体に作用します。 (X^2)* 0.11 - - 0.11 *(X^2) - - 0.002 * X
se.st <

se.m < 0.002 * X:se.mse.st式が同一であることに注意してください

2)結果を行列に出力するには、jogoのコメントに記載されているコードを使用するか、data.frameを使用します。コードのトラブルシューティングを改善するために、それぞれxの値も返すことをお勧めします。

return(data.frame(x.m = x.m, se.m = se.m, x.st = x.st, se.st = se.st)) 

3)runif関数は、あなたの場合に極値ない均一な分布から番号を生成します。機能のヘルプからのテキスト:

runifは、デフォルト引数のためmax = minまたはmax-minminに比べて小さい場合を除き、極端な値のいずれかを生成し、特にありませんではないでしょう。

1

なぜループするのか分かりません。使用するすべての関数はベクトル化されています。

x.m <- runif(100, 0, 1) 

#ensure 1 is not included 
repeat { 
    x.st <- runif(100, 1, 5) 
    if (!any((x.st - 1) < .Machine$double.eps)) break 
} 

cbind(0.11 * (x.m^2) - 0.002 * x.m, 
     0.11 * (x.st^2) - 0.002 * x.st) 

最も困難な問題は、半開きの間隔からのサンプリングです。それはfloating point imprecisionの考慮につながります。その結果、間隔の限界付近でファジー範囲を除外する必要があります。しかしながら、下限の限界がサンプリングされる確率は非常に低く、実質的にゼロである。したがって、私はこの事件の治療に気をつけません。

関連する問題