6

Rを使用して区分的関数を定義したいのですが、Rコードが間違っています。どんな提案でも大歓迎です。

x<-seq(-5, 5, by=0.01)
  for (x in -5:5){
  if (-0.326 < x < 0.652) fx<- 0.632
  else if (-1.793<x<-1.304) fx<- 0.454  
  else if (1.630<x<2.119) fx<-0.227  
  else fx<- 0 }
4

6 に答える 6

17

これを試して:

x <- seq(-5, 5, 0.01)
fx <- (x > -0.326 & x <0.625) * 0.632 +
      (x > -1.793 & x < -1.304) * 0.454 +
      (x > 1.630 & x < 2.119) * 0.227
plot(x, fx)
于 2012-01-09T12:41:27.873 に答える
12

私はパーティーに少し遅れましたが、これを行う方法をさらにいくつか投稿することに抵抗できませんでした. 両方とも、実線で間隔を操作するために R 機能を利用します。

ベクトルでカットポイントと関数値を定義するcutsと、次のvalsようになります。

cuts <- c( -Inf, -1.793, -1.304, -0.326, 0.625, 1.630, 2.119 )
vals <- c(    0,  0.454,      0,  0.632,     0, 0.227,     0 )

次に、カットポイントfindIntervalの値を効率的に検索するために使用できます。x

fx <- vals[findInterval(x, c(-Inf, cuts))]

valsこの関数が定数値を検索するだけでなく、より手の込んだことを行う必要がある場合は、必要に応じて aを使用して、式や関数、または必要なものを に入れることができlistます。

または、この関数はステップ関数であるため、次を使用できますstepfun

f <- stepfun(cuts[-1], vals)
fx <- f(x)

次に、あまりにも優れたプロット方法を使用することもできstepfunます。

于 2012-10-03T22:18:47.520 に答える
11

または、 を使用できますifelse

fx <- ifelse(x > -0.326 & x <0.625, 0.632,
   ifelse(x > -1.793 & x < -1.304,  0.454,
   ifelse(x > 1.630 & x < 2.119, 0.227, 0)))
于 2012-01-09T12:17:31.193 に答える
2

条件を分けるといいかも

if((-1.793<x) & (x < 0.652)) ...

編集:これがすべてではないようです。別のアプローチがあります:

x<-seq(-5, 5, by=0.01)
fx <- function(x) {
    res <- rep(0, length(x))
    res[(-0.326 < x) & (x < 0.652)] <- 0.632
    res[(-1.793<x) & (x < (-1.304))] <- 0.454  
    res[(1.630<x) & (x <2.119)] <- 0.227  
    return(res)
}
fx(x)
于 2012-01-09T12:02:24.440 に答える
2

さらに別のオプション、今回はcut.

regions <- c(-Inf, -1.793, -1.304, -0.326, 0.652, 1.63, 2.119, Inf)
group <- cut(x, regions)
f_values <- c(0, 0.454, 0, 0.632, 0, 0.227, 0)
(fx <- f_values[group])
于 2012-01-09T12:53:51.960 に答える
1

さまざまなカットオフ ポイントがない限り、私はswitch. これは単純化されたカット値の例です。

xcuts<-1:10 #the values at which you change fx assignment
xx<- seq(1.5,10,5, by =10) #vector of fx values to be selected
switch(max(which(x>xcuts)), 
1= fx<-xx[1], 
2= fx<-xx[2], 
..."et cetera"... 
) 

x をループします。

于 2012-01-09T12:45:48.257 に答える