2

我尝试编写一些函数来使用非中心参数计算 anova 功率和样本大小。

R中有一些非常好的功能,但我的功能是从生物统计学书籍中学习和重现思路......

尽管涉及数学,但我的“nc”和“fpower”函数运行良好,正如预期的那样:

nc <- function(diff,n,sd) {
  nonc <- (diff^2/2)*(n/sd^2)
  return(nonc)
}

fpower <- function(k,n,diff,sd,alpha=0.05) {
  nonc <- nc(diff,n,sd)
  dfn <- k - 1
  dfd <- k*(n-1)
  f1 <- qf(1-alpha,dfn,dfd)
  f2 <- pf(f1,dfn,dfd,nonc)
  return(1-f2)
}

但是,我的“fsample”只是没有按预期工作。返回 2,即序列中的第一个 n。

fsample <- function(k,diff,sd,alpha=0.05,power=0.9){
  for(n in 2:5000){
    if ( fpower(k,n,sd,alpha) >= power) break
  }
  return(n)
}

但是,如果我“手动”在控制台中运行此代码,它会按预期工作!并返回正确的 n 值。

怎么了?

4

1 回答 1

3

您没有将diff参数传递给fpower,因此参数不是您认为的顺序。 fsample应该:

fsample <- function(k,diff,sd,alpha=0.05,power=0.9){
  for(n in 2:5000){
    if ( fpower(k,n,diff,sd,alpha) >= power) break
  }
  return(n)
}

请注意,如果您在调用时命名了参数,这不会成为问题,fpower因为您会收到有关diff丢失且没有默认值的错误:

# this will error
fsample <- function(k,diff,sd,alpha=0.05,power=0.9){
  for(n in 2:5000){
    if ( fpower(k=k,n=n,sd=sd,alpha=alpha) >= power) break
  }
  return(n)
}

此外,您可能希望避免为数据对象赋予与函数相同的名称(例如diffsdpower也是函数),否则您可能会感到困惑。

于 2012-09-18T19:05:26.627 回答