У меня есть следующая функция, которая извлекает некоторые данные из дистрибутива хи-квадрат и сравнивает распределение X с известным распределением хи-квадрат с использованием максимального правдоподобия. Эта процедура моделируется nSims
раз. (Я сравнить эти результаты с результатами теста перестановок, но этот код исключается.)«оптимизировать» не найти переменные внутри вызова функции
chi2c <- function(xdf=2, yObs=100, xObs=100, nSims=1000, nPerm=500, alpha=0.05){
simResults <- sapply(1:nSims, function(x){
# Draw variables
x <- rchisq(xObs, df=xdf)
# Other variables not relevant here
# [[snip]]
# Permutation test
# [[snip]]
# Calculate the statistics necessary for maximum likelihood
n <<- length(x)
sumlx <<- sum(log(x))
sumx <<- sum(x)
# Calculate the maximum likelihood estimate
dfhat <- optimize(f=c2ll, interval=c(1, 10), maximum=TRUE)$maximum
# Calculate the test statistic: -2 times the log likelihood ratio
llr <- -2 * (c2ll(2) - c2ll(dfhat))
# Compare the test statistic to its asymptotic dist: chi-squared
lReject <- llr > qchisq(1 - alpha, df=1)
# Provide the results
# [[snip]]
})
# Calcuate means across simulations
rowMeans(simResults)
}
Эта функция вызывает c2ll
, хи-квадрат функции правдоподобия
c2ll <- function(dfHat){
-n * log(gamma(dfHat/2)) - n * (dfHat/2) * log(2) +
(dfHat/2 - 1) * sumlx - sumx/2
}
Эта функция делает только то, что я хотел бы и точен, но я не понимаю, почему мне нужно установить статистику максимального правдоподобия (n
, sumlx
и sumx
) во всем мире, чтобы заставить его работать; optimize
не находит их, если я только устанавливаю их внутри функции, используя <-
. Я попытался установить их внутри optimize
, но это тоже не сработало. Спасибо за вашу помощь.
Charlie
Я немного смущен.Кажется, что он ведет себя так, как можно было бы ожидать: если c2ll определяется глобально, тогда лексическая область потребует, чтобы все переменные сначала выполнялись в c2ll, а затем глобально. Было бы меньше путаницы, если бы вы определили c2ll как имеющую все свои входы в качестве параметров функции. –