在带有条件参数的函数中使用“ sapply”

时间:2020-03-20 15:20:01

标签: r

请考虑以下功能:-

abc<-function(n,alpha, sigma2=NULL){
  if(!is.null(sigma2)){

      return(qnorm(1-alpha, mean=0, sd=1, lower.tail=TRUE, log.p=FALSE)) 
  }
  else
  {

      return(qt(1-alpha, n-1, lower.tail=TRUE, log.p=FALSE)) 
  }

}

abc1<-function(n, k, alpha, sigma2=NULL){

  c1<-abc(n, alpha, sigma2)
  Q<-matrix(10, nrow=k, ncol=1)
  i=0
  for(j in 1:k)
  {
    if(Q[j,1]>c1)
      i=i+1

  }
  return(i/k)
}

我的兴趣主要在于具有条件参数的第二个函数。 sigma2NULL或给出以下命令时,该函数均能正常工作:-

> abc1(10,10, 0.01, 1)
[1] 1
> abc1(10,10, 0.01)
[1] 1

但是,每当我尝试使用sapplysigma2且其他参数固定为某个值的NULL时,都会出现如下错误:-

n1<-1:100
> sapply(n1, abc1, k=10,alpha=0.01)
Error in if (Q[j, 1] > c1) i = i + 1 : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In qt(1 - alpha, n - 1, lower.tail = TRUE, log.p = FALSE) : NaNs produced

我不知道我在哪里犯错。谁能告诉我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是您无法为qt(1-alpha, n-1, lower.tail=TRUE, log.p=FALSE)评估n = 1,因为您实际上是在要求0 df的T分布的分位数。

我不知道这些功能的目的是什么(所以也许下面的输出仍然是错误的),但是如果您更改n1 <- 2:100,那么它应该可以工作,即

# Function definition
abc <- function(n, alpha, sigma2 = NULL) {
  if (!is.null(sigma2)) {
    return(qnorm(1 - alpha, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE))
  }
  else {
    return(qt(1 - alpha, n - 1, lower.tail = TRUE, log.p = FALSE))
  }
}

abc1 <- function(n, k, alpha, sigma2 = NULL) {
  c1 <- abc(n, alpha, sigma2)
  Q <- matrix(10, nrow = k, ncol = 1)
  i <- 0
  for (j in 1:k)
  {
    if (Q[j, 1] > c1) {
      i <- i + 1
    }
  }
  return(i / k)
}

# Note that it starts from 2
n1 <- 2:100

sapply(n1, abc1, k = 10, alpha = 0.01)
#>  [1] 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#> [39] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#> [77] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

reprex package(v0.3.0)于2020-03-20创建

相关问题