2014-04-01 41 views
0

如何写一个函数返回“拒绝”当zscore> = qnorm(1-alpha/2)10个模拟alpha = 0.05和样本大小为10.我写了下面的代码,但我没有获取相关输出。 “zscore”是检验统计量,t是平均值和标准偏差6/n的正态分布。 sims对应于要执行的模拟的数量。该函数应该模仿Monte Carlo评估。如何编写一个拒绝R中Z分数的函数?

testsk=function(n,alph,sims){ 
    t=numeric(sims) 
for (i in 1:sims) { 
    x=rnorm(n) 
t[i]=skewness(x) 
zscore=t/(6/n) 
return(zscore) 
} 
if(zscore>=qnorm(1-alph/2)){ 
print("REJECT") 
} 
} 


testsk(10,0.05,10) 

谢谢!

+1

你有太多的'}'。得到一个真正的代码编辑器来避免这种错误(例如:rstudio)。 – Jealie

+0

我不清楚你想达到什么目的。我可以看到你试图从一个标准的正态分布中重复获取'n'个样本集,并且计算每个集合的偏度,将集合'i'的偏度存储在't [i]'中。但是什么是Z分数?它应该是一个矢量还是一个标量,你怎么定义它?在任何情况下,我都看不出像你现在这样从'for for'循环的中间返回它是有意义的。 – TooTone

回答

1

按照你的编辑,我相信你想做的事就是看有多少次了sims试验根据从正态分布获得的样本计算的偏度将被拒绝,因为在alph水平上的显着性检验也偏斜。

你有几个编码问题

  1. 您想为每一个审判做Z值测试,但测试是外循环。
  2. z分数是使用向量t计算得出的,但是您想使用标量t[i]来计算z分数。
  3. 循环内部有一个return语句,它将导致函数在循环的第一次迭代中终止,返回z分数。对于没有2.的原因,z分数是矢量,但其倒数第二个值都为零,因为您只运行一次迭代,因此该函数的典型输出如下

    0.003623371 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000

在下面的代码

library(e1071) 
testsk=function(n,alph,sims) { 
    t=numeric(sims) 
    for (i in 1:sims) { 
     x=rnorm(n) 
     t[i]=skewness(x) 
     zscore=t[i]/(6/n) 
     if(zscore>=qnorm(1-alph/2)){ 
      print("REJECT") 
     } 
    } 
} 

然而,这STIL一些患有修复这些眼前的问题结果问题:

  1. 但从
    • 打印出“拒绝”编程点给出即时的反馈,但也不是很可扩展性。如果你有sims=1000,你最好还是拒收数量nr。如果你仍然想打印出“拒绝”nr次你可以这样做:)
    • 此外,代码可能更简单,并写入更多的R风格,矢量化,而不是使用循环。这也会有更多更快的优势。因为R是一种解释型语言,所以矢量化会产生巨大的差异,因为数字处理可能会在引擎盖下发生,而R不必一遍又一遍地遍历您的for循环。
  2. 也许更严重的是,有一些统计问题:
    • 6/n是偏度(wikipedia)的方差的估计,但你想要的标准偏差,所以你需要采取的平方根6/n。
    • 如果z分数大于1-alph/2 th分位数,则代码拒绝,但如果z分数小于alph/2 th分位数,它也应拒绝。因为它代表你的拒绝区域是alph/2而不是alph
    • 也可能有其他问题,但在我看来,这些是主要的问题。 (我假设你知道,6/n是只有方差大样本的一个很好的估计。)

一种程序,它是沿着正确的线路如下

library(e1071) 
testsk=function(n,alph,sims) { 
    # Generate random numbers in a matrix, each trial is a row 
    X=matrix(rnorm(sims*n), ncol=n) 
    # Get skewnesses, 1 means apply to rows 
    skews=apply(X,1,skewness) 
    # Calculate z score vector and rejection vector 
    zscore=skews/sqrt(6/n) 
    reject=!(qnorm(alph/2) < zscore & zscore < qnorm(1-alph/2)) 
    # Return the number of rejections 
    sum(reject) 
} 

您应该可以对其进行修改以适合您的目的,但如有必要,我可以澄清。

0

您错误地循环了sims。你能解释你想做什么吗?

testsk <- function(n,alph,sims) { 
    t <- numeric(sims) 
    for (i in seq_along(sims)) { 
    x <- rnorm(n) 
    t[i] <- skewness(x) 
    } 
    zscore <- t/(6/n) 
    if (any(zscore>=qnorm(1-alph/2))) { 
    print("REJECT") 
    } 
    return(zscore) 
} 

testsk(10,0.05,10) 
+0

我不确定'seq_along(模拟人生)'。变量'sims'是一个标量,原来的'1:sims'似乎更好。 – TooTone

1

不知道什么是你想实现,但在这里是一种方法可以做到这一点

testsk <- function(n, alph, sims){ 
    for (i in 1:sims){ 
    x <- rnorm(n) 
    zscore <- skewness(x)/(6/n) 
    cat(paste0("Simulation #", i,":"), ifelse(zscore >= qnorm(1 - alph/2), "REJECT", "Don't REJECT"), "\n") 
    } 
} 

n <- 10 
alph <- .05 
sims <- 10 
testsk(n, alph, sims) 

#Simulation #1: Don't REJECT 
#Simulation #2: REJECT 
#Simulation #3: Don't REJECT 
#Simulation #4: Don't REJECT 
#Simulation #5: Don't REJECT 
#Simulation #6: Don't REJECT 
#Simulation #7: Don't REJECT 
#Simulation #8: Don't REJECT 
#Simulation #9: Don't REJECT 
#Simulation #10: Don't REJECT 
相关问题