Использование «sapply» в функции с условными аргументами - PullRequest
1 голос
/ 20 марта 2020

Рассмотрим следующие функции: -

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)
}

Мой интерес в основном к второй функции, которая имеет условный аргумент. Функция работает нормально с sigma2, являющимся NULL, или ей задается: -

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

Однако всякий раз, когда я пытаюсь использовать sapply с sigma2, являющимся 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 Ответ

1 голос
/ 20 марта 2020

Проблема в том, что вы не можете оценить qt(1-alpha, n-1, lower.tail=TRUE, log.p=FALSE) для n = 1, поскольку вы фактически запрашиваете квантиль распределения T с 0 df.

Я не знаю, какова цель этих функций (поэтому, возможно, следующий вывод все еще неправильный), но если вы измените 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

Создано в 2020-03-20 пакетом Представ (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...