Никогда не заканчивая 'для' l oop предотвращает рендеринг моего ноутбука RStudio в файл .md - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь вычислить статистику Колмогорова-Смирнова c в R. У меня есть следующая выборка, которая явно исходит из случайной величины, следующей за длиннохвостым распределением.

Ссылка для скачивания

https://drive.google.com/file/d/1hIgqikX7p343zdyc-Goq34THUpsZA63n/view?usp=sharing

Как вы, возможно, знаете, статистика Колмогорова-Смирнова c требует расчета эмпирическая кумулятивная функция распределения и предполагаемая кумулятивная функция распределения. Для обоих расчетов я использую следующий подход: сначала я создаю вектор такой же длины, что и длина образца, и , затем я изменяю каждый из компонентов вектора так, чтобы он содержал эмпирический файл cdf ( или предполагаемый cdf) соответствующего наблюдения образца .

Для иллюстрации я покажу вам код, который я написал для расчета эмпирического cdf.

Я предполагаю, что данные были прочитаны и сохранены в фрейме данных, который называется data.

ecdf = vector ("цифра c", длина (data $ logueos))

для (я в 1: длина (данные $ logueos)) {

ecdf [i] = сумма (данные $ logueos <= данные $ logueos [i]) / длина (данные $ logueos) <p>}

Код, который я написал для вычисления предполагаемого cdf, аналогичен предыдущему; единственное отличие состоит в том, что я устанавливаю каждый компонент вектора pcdf равным формуле $ P (X <= t) $, где t - соответствующее наблюдение выборки - в соответствии с предполагаемым распределением. </p>

Проблема в том, что это 'for' l oop никогда не заканчивается. Если я принудительно завершаю его, нажимая кнопку остановки RStudio, это работает: оно делает векторное хранилище тем, что я хочу сохранить. Но если я нажму Ctrl + Shift + k для рендеринга моего блокнота и его предварительного просмотра, загрузка застревает при попытке выполнить первый обнаруженный фрагмент, содержащий один из этих циклов.

1 Ответ

0 голосов
/ 13 января 2020

Прежде всего, ваш l oop не бесконечен. В конечном итоге он будет sh.

Вы начнете инициализировать вектор с таким количеством элементов, как число наблюдения (1.245.888, что много итераций). Этот вектор полон нулей .

То, что делает ваш l oop, повторяется при изменении каждого нуля с помощью исчисления sum (data$logueos <= data$logueos[i])/length(data$logueos). Убедитесь, что когда вы остановите выполнение, первыми значениями вашего вектора будут значения от 0 до 1, в то время как последние значения будут равны 0 с (поскольку l oop еще не прибыл туда). Итак, вам придется ждать больше времени.

Чтобы ускорить выполнение, вы можете рассмотреть l oop распараллеливание (потому что стандартные циклы go последовательно, один за другим и, если это слишком долго, параллелизация делает это быстрее. Например, выполнение 4 на 4, в зависимости от возможностей вашего компьютера). Здесь вы найдете некоторую информацию об этом: https://nceas.github.io/oss-lessons/parallel-computing-in-r/parallel-computing-in-r.html

Тогда мое предложение для вас:

if(!require(foreach)){install.packages("foreach")}; require(foreach)
registerDoParallel(detectCores() - 1)

ecdf = vector("numeric", length(data$logueos))

foreach (i=1:length(data$logueos)) %do% {
  print(i)
  ecdf[i] = sum (data$logueos <= data$logueos[i])/length(data$logueos)
}
  • Первая строка будет загружена и Загрузите библиотеку foreach, необходимую для распараллеливания.
  • detectCores() - 1 будет использовать все процессоры, которые есть у вашего компьютера, кроме одного (чтобы не заморозить ваш компьютер) для вычисления этого l oop. Вы увидите, что это будет быстрее!
  • registerDoParallel - это функция, которая сообщает foreach, сколько ядер используется.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...