这两个 R 函数之间的区别
Difference between these two R functions
我正在尝试说明 $R$ 中的三种极值分布。
对于类型一,分布函数如下。
$$
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
对于类型二,分布函数如下
$$
G(z) = \left\{ \begin{array}{ll} 0, & z \leq b, \\[10pt] \exp\left[ -\left( \frac{z-b}{a} \right )^{-\alpha} \right], & z>b. \结束{数组} \对。
$$
在 $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哪里写错了?我想要一个有限序列而不是只有一个数字。谢谢!
您在 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
这最终是因为||
returns 一个长度为一的逻辑向量。如果你向它提供一个向量,它会忽略除第一个元素之外的所有内容。如果您 运行 您的代码一次一个步骤,您可以看到会发生什么:
> 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)
和 returns 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))
我正在尝试说明 $R$ 中的三种极值分布。
对于类型一,分布函数如下。
$$ 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
对于类型二,分布函数如下
$$ G(z) = \left\{ \begin{array}{ll} 0, & z \leq b, \\[10pt] \exp\left[ -\left( \frac{z-b}{a} \right )^{-\alpha} \right], & z>b. \结束{数组} \对。 $$
在 $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哪里写错了?我想要一个有限序列而不是只有一个数字。谢谢!
您在 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
这最终是因为||
returns 一个长度为一的逻辑向量。如果你向它提供一个向量,它会忽略除第一个元素之外的所有内容。如果您 运行 您的代码一次一个步骤,您可以看到会发生什么:
> 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)
和 returns 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))