1

我要编写一个函数来计算 PDF,建议我使用 if/elseif/else 语句。但是,每当我尝试这样做时,我都会收到错误消息,但我不确定我做错了什么?

这是函数应该计算的 PDF:

fx = 0.3 if (0<=x<1)
0.1 if (1<=x<2)
0.25 if (2<=x<3)
0.15 if (3<= x<4)
如果 (4<=x<5) 则为 0.2
否则为 0

这是我的代码:

    fx = function(x)
    { 
    if (0<=x<1) {
    pdf=0.3
    } elseif (1<=x<2) {
    pdf=0.1
    } elseif (2<=x<3) {
    pdf=0.25
    } elseif (3<=x<4) {
    pdf=0.15
    } elseif (4<=x<5) {
    pdf=0.2
    } else 
    pdf=0

    pdf
    }

我检查了我的'}',但它们似乎都放置得当。我尝试将“pdf”更改为“fx”,但这不起作用。我哪里错了?

4

3 回答 3

6
fx <- function(x) c(0, 0.3,0.1,0.25,0.15,0.20, 0)[findInterval(x, c(-Inf, 0:5, Inf))]

findInterval函数从其第二个参数定义的间隔序列中返回其第一个参数的位置,并可用于从向量中选择概率。支持域之外的值根据要求被选为 0 值。它在下限关闭的情况下特别有用,因为该cut函数的默认设置是关闭上限。

于 2013-04-17T21:25:36.897 回答
3

您的代码有两个问题

1/ 诸如 a <= x < b 之类的表达式在数学中是合法的,但在代码中是不合法的。在代码中你需要一个 <=x && x < b

2/ 你需要使用“else if”而不是“elseif”

此代码有效

fx = function(x)
{ 
if (0<=x && x<1) {
pdf=0.3    
} else if (1<=x && x<2) {
pdf=0.1
} else if (2<= x&& x<3) {
pdf=0.25
} else if (3<=x && x<4) {
pdf=0.15
} else if (4<= x&& x<5) {
pdf=0.2
} else 
pdf=0

pdf
}

此外,作为一种优化,您应该只需要反复测试 x < b,而不是 a。你不应该需要一个 pdf 变量。这导致以下代码,但我猜测上面发布的内置函数更有效。

fx = function(x)
{ 
if (x<0) 0
else if (x<1) 0.3
else if (x<2) 0.1
else if (x<3) 0.25
else if (x<4) 0.15
else if (x<5) 0.2
else 0
}
于 2013-04-17T21:35:33.800 回答
0

您可以使用stepfun创建一个阶梯函数(这就是您的 PDF)

fx <- stepfun(x = 0:5, y = c(0,0.3,0.1,0.25,0.15,0.20,0))

如果你想要一个矢量化版本,那么你可以使用Vectorize

vfx <- Vectorize(fx)

stepfun可以使用很好地绘制对象(有关示例,plot请参见https://stackoverflow.com/a/16072697/1385941 )

于 2013-04-18T00:53:19.713 回答