Среднее количество образцов с использованием процедуры CUSUM Пейдж? - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь воспроизвести результаты Таблицы 1 со страницы 12, используя уравнение, приведенное на странице 13. Чтобы получить доступ к журнальной статье, нажмите https://arxiv.org/pdf/math/0605322.pdf. Соответствующее уравнение приведено ниже.

enter image description here

Мой r code приведен ниже.Я правильно запрограммирован?

mytest=function(n,s,c1){
  t = sum(s)
  k=which.max(s[19:n]>=c1)
  if(k==1 && s[19]<c1) 
    return(c(n,0)) 
  else 
    return(c(k,1))
}


for (n in c(100,200,400)){

for (i in c(-0.5, -1.0)){
a1=0
c1 = 20
asn1=0
for (m in 1:1000){
  g=c(dnorm(n,0,1))
  f=c(dnorm(n,i,1))
  s = log(g/f)
  test=mytest(n,s,c1)
  a1=a1+test[2]
  asn1=asn1+test[1]
}

}
out <- list(power= a1/m, asn=asn1/m)
return(out)
}

Но я получаю следующие ошибки.

Error in if (k == 1 && s[19] < c1) return(c(n, 0)) else return(c(k, 1)) : 
  missing value where TRUE/FALSE needed

1 Ответ

0 голосов
/ 11 марта 2019

При первом вызове mytest у вас есть n=100, i=-0.5, что дает s=NaN.Следовательно, вы получаете сообщение об ошибке if(k==1 && s[19]<c1), если s[19]=NaN.

Вот обходной путь, но вы должны убедиться, что он делает то, что вы ожидаете / хотите:

mytest=function(n,s,c1){

  if(is.na(s)) return(c(c1,1))  # skips if NaN

  t = sum(s)
  k=which.max(s[19:n]>=c1)

  if(k==1 && s[19]<c1) 
    return(c(n,0)) 
  else 
    return(c(k,1))
}
...