【问题标题】:Question about graphing piecewise functions in r关于在r中绘制分段函数的问题
【发布时间】:2021-12-29 19:32:06
【问题描述】:

问题是,如果 f(x) = exp(-|x|)/2, -∞

导出分位数函数 F 逆 (p) 并将其从 0.01 绘制到 0.99。

所以,我计算了 F 逆 p 并尝试使用代码绘制曲线

QF<-function(p){
  if (0<p&p<=0.5){
    log(2*p)}
  else if (0.5<p&p<1){
    -log(2*(1-p))}
}
curve(QF, from=0.01, to=0.99, , xlab="x", ylab="f(x)")

但是曲线看起来不像它应该的样子。它只绘制函数 log(2p) 的第一部分而不是第二个条件。

有什么建议吗?

【问题讨论】:

    标签: r function statistics


    【解决方案1】:

    在 R 中,if 语句只能响应单个 TRUEFALSEif 语句中的表达式 0 &lt; p &amp; p &lt;= 0.5 求值为 TRUEFALSEvector,其长度与数字 vector p 的长度相同。 if 语句默认使用向量的第一个元素,但会发出警告

    #> the condition has length > 1 and only the first element will be used
    

    由于 curve 函数必须找到数百个 y 值,它会将 x 值的向量传递给函数 QF,从 from = 0.01 开始。因此,该向量中的第一个数字将介于 0 和 0.5 之间,从而触发 if 语句分支到 log(2*p) 表达式用于所有 p

    相反,您需要使用矢量化函数ifelse,它会适当地计算两个分支并为curve 返回一个矢量以用作y 坐标。

    QF <- function(p){
      f_x <- ifelse(test = p <= 0.5, 
                    yes  = log(2*p),
                    no   = -log(2*(1-p)))
      
      # Remove values outside the range [0, 1]
      f_x[p < 0 | p > 1] <- NA
      
      return(f_x)
    }
    
    curve(QF, from = 0.01, to = 0.99, xlab = "x", ylab = "f(x)")
    

    另一种方法是将子集直接写入结果向量:

    QF <- function(p){
    
      f_x <- numeric(length(p))
      f_x[p <  0.5] <-  log(2 * p[p < 0.5])
      f_x[p >= 0.5] <- -log(2 * (1 - p[p >= 0.5]))
      f_x[p <  0.0] <- NA
      f_x[p >  1.0] <- NA
      
      return(f_x)
    }
    

    结果相同。

    reprex package 创建于 2021-11-18 (v2.0.0)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2016-07-31
      相关资源
      最近更新 更多