Ошибка при использовании `loess.smooth`, но не` loess` или `lowess`

Мне нужно сгладить некоторые смоделированные данные, но иногда возникают проблемы, когда смоделированные ординаты, которые необходимо сглаживать, в основном имеют одно и то же значение. Вот небольшой воспроизводимый пример простейшего случая.

> x <- 0:50
> y <- rep(0,51)
> loess.smooth(x,y)
Error in simpleLoess(y, x, w, span, degree, FALSE, FALSE, normalize = FALSE,  : 
   NA/NaN/Inf in foreign function call (arg 1)

лёсс (y ~ x) , лёсс (x, y) , и их аналог в MATLAB дают ожидаемые результаты без ошибок в этом примере. Я использую здесь loess.smooth , потому что мне нужны оценки, полученные по заданному количеству точек. Согласно документации, я полагаю, что loess.smooth и loess используют одни и те же функции оценки, но первая является «вспомогательной функцией» для обработки точек оценки. Ошибка, похоже, исходит от функции C:

> traceback()
3: .C(R_loess_raw, as.double(pseudovalues), as.double(x), as.double(weights), 
   as.double(weights), as.integer(D), as.integer(N), as.double(span), 
   as.integer(degree), as.integer(nonparametric), as.integer(order.drop.sqr), 
   as.integer(sum.drop.sqr), as.double(span * cell), as.character(surf.stat), 
   temp = double(N), parameter = integer(7), a = integer(max.kd), 
   xi = double(max.kd), vert = double(2 * D), vval = double((D + 
       1) * max.kd), diagonal = double(N), trL = double(1), 
   delta1 = double(1), delta2 = double(1), as.integer(0L))
2: simpleLoess(y, x, w, span, degree, FALSE, FALSE, normalize = FALSE, 
   "none", "interpolate", control$cell, iterations, control$trace.hat)
1: loess.smooth(x, y)

loess также вызывает simpleLoess , но с другими аргументами. Конечно, если вы измените значения y в достаточной степени, чтобы они были отличными от нуля, loess.smooth будет работать без ошибок, но мне нужно, чтобы программа работала даже в самом крайнем случае.

Надеюсь, кто-нибудь сможет помочь мне с одним или всеми из следующих действий:

  1. Разберитесь, почему только loess.smooth , а не другие функции, вызывают эту ошибку, и найдите решение этой проблемы.
  2. Найдите обходной путь, используя лесс , но все еще оценивает оценку в указанном количестве точек, которые могут отличаться от вектора x. Например, я мог бы использовать только x <- seq (0,50,10) в сглаживании, но оценить оценку как x <- 0:50 . Насколько мне известно, использование предсказать с новым фреймом данных не поможет должным образом справиться с этой ситуацией, но, пожалуйста, дайте мне знать, если я что-то упускаю.
  3. Обработайте ошибку таким образом, чтобы программа не остановила переход к следующему набору смоделированных данных.

Заранее благодарим за помощь в решении этой проблемы. {вектор res; res.push_back (1); вектор :: iterator it = res.begin (); for (; it! = res.end (); it ++) {it = res.erase (это); ...

У меня есть этот код:

int main()
{
    vector<int> res;
    res.push_back(1);
    vector<int>::iterator it = res.begin();
    for( ; it != res.end(); it++)
    {
        it = res.erase(it);
        //if(it == res.end())
        //  return 0;
    }
}

"Итератор произвольного доступа, указывающий на новое местоположение элемента, который следует за последним элементом, удаленным вызовом функции, который является концом вектора, если операция удалила последний элемент. в последовательности. "

Этот код дает сбой, но если я использую if (it == res.end ()) , а затем возвращаюсь, он работает. Почему? Кэширует ли цикл for res.end () , поэтому оператор не равно не работает?

65
задан squareskittles 19 September 2019 в 14:04
поделиться