这两个R函数之间的区别

时间:2015-01-14 23:13:59

标签: r

我试图用$ R $来说明三种极值分布。

对于类型1,分配函数如下。

$$ G(z)= \ exp \ left \ { - \ exp \ left [ - \ left(\ frac {z-b} {a} \ right)\ right] \ right \},z \ in \ mathbb R. $$

在$ R $中,我写了以下几行。

G1 <- function(z, a, b){
  x = (b-z)/a
  y = exp(-exp(x))
  y
}

G1(-3:3, 2, 3)

我得到了我想要的东西,即有限的数字序列。

 [1] 1.89e-09 5.12e-06 6.18e-04 1.13e-02 6.60e-02 1.92e-01 3.68e-01

对于类型2,分布函数如下。

$$ G(z)= \ left \ {\ begin {array} {ll} 0,&amp; z \ leq b,\\ [10pt] \ exp \ left [ - \ left(\ frac {z-b} {a} \ right)^ { - \ alpha} \ right],&amp; ž&GT; b。 \ end {array} \ right。 $$

在$ R $中,我写了以下几行。

G2 <- function(z, a, b, alpha){
  if(z<b||z==b){
    0
  } else {
    x = -((z-b)/a)^{-alpha}
    y = exp(x)
    y
  }
}

G2(-3:3, 2, 3, 4)

但是,这次我只有一个号码。

[1] 0

在编写第二个功能G2时,我在哪里犯了错误?我希望有一个有限的序列而不是一个数字。谢谢!

2 个答案:

答案 0 :(得分:2)

这最终是因为||返回长度为一的逻辑向量。如果向其提供矢量,它将忽略除第一个元素之外的所有内容。如果您一步一步地运行代码,您可以看到会发生什么:

> z <- -3:3
> b <- 3
> z < b | z == b
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> z < b || z == b
[1] TRUE

因此,代码仅评估if(true)并返回0。但是,如果您将||替换为|,它仍然无法正常工作;现在您将收到错误消息:

[1] 0
Warning message:
In if (z < b | z == b) { :
  the condition has length > 1 and only the first element will be used

并且您需要处理if函数未向量化的事实。正如其他海报所建议的那样,您可以使用以下内容定义您的函数:

G2 <- function(z, a, b, alpha) ifelse(z <= b, 0, exp(-((z-b)/a)^-alpha))

答案 1 :(得分:1)

您在G2的函数调用中发送的数据是您的罪魁祸首。

您说明z是否小于或等于b,输出为0.调用G2时,您将z设置为-3 ,-2 ... 2,3,所有这些都小于或等于3(你的b值)。

当我跑步时,我得到一个系列:

> G2(-3:3, 2, -4, 4)
[1] 1.125352e-07 3.678794e-01 8.207548e-01 9.394131e-01 9.747249e-01 9.877302e-01
[7] 9.933583e-01

您可以通过在if语句中放置表达式来强制输出7个零:

G2 <- function(z, a, b, alpha){
  if(z<b||z==b){
    temp <- 0 * z
    temp
  } else {
    x = -((z-b)/a)^{-alpha}
    y = exp(x)
    y
  }
}

现在您的通话将输出7个零。

> G2(-3:3, 2, 3, 4)
[1] 0 0 0 0 0 0 0