这两个R函数之间的区别

这两个R函数之间的区别,r,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) G2 <- function(z, a, b,

我试图用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)
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)
对于类型2,分布函数如下所示

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

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

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

G1(-3:3, 2, 3)
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)

请问,我在写第二个函数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
  }
}

在函数调用中发送到
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
  }
}

在函数调用中发送到
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
  }
}

在函数调用中发送到
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
  }
}

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

> z <- -3:3
> b <- 3
> z < b | z == b
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> z < b || z == b
[1] TRUE
您需要处理这样一个事实,即
if
函数没有矢量化。正如其他海报所建议的,您可以使用以下内容定义您的函数:

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

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

> z <- -3:3
> b <- 3
> z < b | z == b
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> z < b || z == b
[1] TRUE
您需要处理这样一个事实,即
if
函数没有矢量化。正如其他海报所建议的,您可以使用以下内容定义您的函数:

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

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

> z <- -3:3
> b <- 3
> z < b | z == b
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> z < b || z == b
[1] TRUE
您需要处理这样一个事实,即
if
函数没有矢量化。正如其他海报所建议的,您可以使用以下内容定义您的函数:

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

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

> z <- -3:3
> b <- 3
> z < b | z == b
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> z < b || z == b
[1] TRUE
您需要处理这样一个事实,即
if
函数没有矢量化。正如其他海报所建议的,您可以使用以下内容定义您的函数:

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


G2但它仍然应该给出7个零而不是1。我已经用一个计算过的表达式更新了函数。现在你的调用将输出7个零。但它仍然应该给出7个零而不是1。我用一个计算过的表达式更新了函数。现在你的调用将输出7个零。但它仍然应该给出7个零而不是仅仅1。我已经用一个得到计算的表达式更新了函数。现在你的调用将输出7个零。但它仍然应该给出7个零而不是1。我已经用一个得到计算的表达式更新了函数。现在你的调用将输出7个零。请不要在多个站点上交叉发布相同的问题。对不起。但我是afra我不能同意你的观点。正如你所看到的,stat.stackexchange.com和stackoverflow.com的答案是不同的。答案的不同并不重要。问题是一样的。如果你觉得我犯了错误,请随时标记以引起版主的注意。请不要在多个网站上交叉发布同一个问题。抱歉。Bu恐怕我不能同意你的看法。正如你所看到的,stat.stackexchange.com和stackoverflow.com的答案是不同的。答案的不同并不重要。问题是一样的。如果你觉得我犯了错误,请随时标记以引起版主的注意。请不要在多个网站上交叉发布相同的问题s、 抱歉。但我恐怕不能同意你的看法。正如你所看到的,stat.stackexchange.com和stackoverflow.com的答案是不同的。答案的不同并不重要。问题是一样的。如果你觉得我犯了错误,请随时标记以引起版主的注意。请不要