簡體   English   中英

如何在R中定義分段函數

[英]How to define a piecewise function in R

我想用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 }

試試這個:

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)

我參加派對有點晚了,但我無法抗拒發布更多方法。 兩者都利用R功能來處理實線上的間隔。

如果在向量cutsvals定義切割點和函數值,如下所示:

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 )

然后,您可以使用findIntervalfindInterval中有效地查找x的值:

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

如果這個函數需要做更高級的東西,而不僅僅是查找一個常量值,你可以在vals放置表達式或函數或任何你想要的東西,如果你想要的話可​​能使用一個list

或者,由於此功能是步進功能,您可以使用stepfun

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

然后你也可以使用stepfun的漂亮的繪圖方法。

或者你可以使用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)))

也許你分開條件

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)

還有另一種選擇,這次使用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])

除非你有不同的截止點,否則我會使用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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM