Chcę dołączyć kilka losowych replikacji szacunków modelowych (np. Model GRAC) w pytaniu. Kod używa różnych serii danych losowo. W tym procesie niektóre szacunki na GRACH dla niektórych losowych serii danych mogą nie osiągnąć konwergencji numerycznej. Dlatego muszę kodować pytanie / problem w taki sposób, że musi usunąć modele, które nie powiodło się konwergencji z zestawu pytań. Jak mogę to kodować, gdy używam badań R?

1
Akram 22 listopad 2020, 05:14

1 odpowiedź

Najlepsza odpowiedź

Podstawowy pomysł

Ogólnie rzecz biorąc przy użyciu losowych danych w wytwarzaniu ćwiczeń, istnieje szansa, że czasami coś pójdzie nie tak, np. Rozwiązanie nie wpada w pożądany zakres (tj. Staje się zbyt duży lub zbyt mały), lub rozwiązanie nie ma nawet istnieje z powodu matematycznej warstwy lub problemów numerycznych (jak wskazujesz) itp

Oczywiście najlepiej jest uniknąć takich problemów w procesie generującym dane, dzięki czemu nie występują w ogóle. Jednak nie zawsze jest to możliwe, aby to zrobić lub nie warte wysiłku, ponieważ problemy występują bardzo rzadko. W takich sytuacjach zazwyczaj używam pętli while(), aby ponownie wygenerować dane losowe, jeśli to konieczne. Ponieważ może to działać potencjalnie przez kilka iteracji, jednak ważne jest, aby prawdopodobnie był wystarczająco mały, że jest to potrzebne.

Pracował przykład

Pracowany przykład można znaleźć w czterokrotnie Ćwicz, który wysyła z pakietem. Losowo generuje czterokrotną tabelę prawdopodobieństwami, które powinny zostać zrekonstruowane z częściowych informacji w rzeczywistym ćwiczeniu. Aby ćwiczenia były dobrze zdefiniowane, wszystkie wpisy stołu muszą być (ściśle) między 0 a 1, a oni muszą podsumować do 1. Kod symulacyjny właściwie stara się zapewnić, że przypadki krawędzi mogą wystąpić. Zamiast pisząc więcej kodu, aby uniknąć tych przypadków krawędzi, proste {x0}} pętla próbuje je złapać i próbować nową tabelę w razie potrzeby:

ok <- FALSE
while(!ok) {
  [...generate probabilities...]
  tab <- cbind(c(prob1, prob3), c(prob2, prob4))
  [...compute solutions...]
  ok <- sum(tab) == 1 & all(tab > 0) & all(tab < 1)
}

Aplikacja do łapania błędów

Ten sam rodzaj strategii może być również wykorzystywany do innych problemów, takich jak te, które opisujesz. Możesz owinąć oszacowanie modelu do kodu takiego

fit <- try(mymodel(...), silent = TRUE)

A następnie użyj czegoś podobnego

ok <- !inherits(fit, "try-error")

Oprócz nie wytwarzania błędu, które możesz wymagać, powiedzmy, że wszystkie współczynniki są pozytywne (lub coś takiego). Wtedy zrobiłbyś:

ok <- !inherits(fit, "try-error") && all(coef(fit) > 0)

Analogicznie można sprawdzić konwergencję modelu itp.

2
Achim Zeileis 22 listopad 2020, 02:49