Я полагаю, что после вашего редактирования вы хотите увидеть, сколько раз за sims
испытаний асимметрия, рассчитанная на основе выборки размером n
, взятой из нормального распределения, будет отклонена как слишком искаженная критерием значимости на уровне alph
.
У вас есть несколько проблем с кодированием
- Вы хотите выполнить тест z-счета для каждого испытания, но тест находится вне цикла.
- Показатель z рассчитывается с использованием вектора
t
, но вы хотите вычислить его с помощью скаляра t[i]
.
Внутри цикла есть оператор 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")
}
}
}
Однако этот стиль все еще страдает от некоторых проблем:
- From a programming point of view
- printing out "REJECT" gives immediate feedback but isn't very scalable. If you had
sims=1000
you would be better off returning the number of rejects, nr
. And if you still wanted to print out "REJECT" nr
times you could do so :)
- Также код мог бы быть проще и написан в стиле R, с векторизацией, а не с использованием циклов. Это также имело бы то преимущество, что было бы намного быстрее. Поскольку R является интерпретируемым языком, векторизация имеет огромное значение, потому что обработка чисел может происходить под капотом, и R не нужно снова и снова проходить цикл
for
.
- Perhaps more seriously, there are some statistical problems:
- 6/n is an estimate of the variance of the skewness (wikipedia), but you want the standard deviation so you need to take the square root of 6/n.
- Код отклоняется, если показатель z больше
1-alph/2
го квантиля, но он также должен отклоняться, если показатель z меньше alph/2
го квантиля. В нынешнем виде ваш регион отклонения 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)
}
Вы должны быть в состоянии изменить его в соответствии с вашими целями, но я могу уточнить, если необходимо.
person
TooTone
schedule
01.04.2014
n
выборок из стандартного нормального распределения и вычислять асимметрию каждого набора, сохраняя асимметрию набораi
вt[i]
. Но что такое z-оценка? Это должна быть векторная или скалярная величина, и как вы ее определяете? В любом случае я не вижу смыслаreturn
делать это из середины вашегоfor
цикла, как вы это делаете сейчас. - person TooTone   schedule 02.04.2014