LOESS предупреждения / ошибки, связанные с пролетом в R

Я запускаю регрессию LOESS в R и сталкивался с предупреждениями с некоторыми из моих небольших наборов данных.

Предупреждающие сообщения:

1: в SimpleLoess(y, x, w, span, градус = градус, параметрический = параметрический,: псевдообратная используется при -2703,9

2: в SimpleLoess(y, x, w, span, градус = градус, параметрический = параметрический,: радиус окрестности 796.09

3: в SimpleLoess(y, x, w, span, градус = градус, параметрический = параметрический,: номер взаимного условия 0

4: В simpleLoess(y, x, w, span, степень = градус, параметрический = параметрический,: есть и другие близкие особенности. 6.1623e+005

Эти ошибки обсуждаются в другом посте здесь: Понимание ошибок лесса в R.

Похоже, что эти предупреждения связаны с диапазоном, установленным для регрессии LOESS. Я пытаюсь применить аналогичную методологию, которая была сделана с другими наборами данных, где параметры для приемлемого диапазона сглаживания были между 0,3 и 0,6. В некоторых случаях я могу настроить диапазон, чтобы избежать этих проблем, но в других наборах данных диапазон должен был быть превышен за допустимые уровни, чтобы избежать ошибок / предупреждений.

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

Вот пример набора данных, который имеет проблемы:

Period  Value   Total1  Total2
-2950   0.104938272 32.4    3.4  
-2715   0.054347826 46  2.5  
-2715   0.128378378 37  4.75  
-2715   0.188679245 39.75   7.5  
-3500   0.245014245 39  9.555555556  
-3500   0.163120567 105.75  17.25  
-3500   0.086956522 28.75   2.5  
-4350   0.171038825 31.76666667 5.433333333  
-3650   0.143798024 30.36666667 4.366666667  
-4350   0.235588972 26.6    6.266666667  
-3500   0.228840125 79.75   18.25  
-4933   0.154931973 70  10.8452381  
-4350   0.021428571 35  0.75  
-3500   0.0625  28  1.75  
-2715   0.160714286 28  4.5  
-2715   0.110047847 52.25   5.75  
-3500   0.176923077 32.5    5.75  
-3500   0.226277372 34.25   7.75  
-2715   0.132625995 188.5   25

А вот данные без разрывов строк

Period  Value   Total1  Total2
-2950   0.104938272 32.4    3.4
-2715   0.054347826 46  2.5
-2715   0.128378378 37  4.75
-2715   0.188679245 39.75   7.5
-3500   0.245014245 39  9.555555556
-3500   0.163120567 105.75  17.25
-3500   0.086956522 28.75   2.5
-4350   0.171038825 31.76666667 5.433333333
-3650   0.143798024 30.36666667 4.366666667
-4350   0.235588972 26.6    6.266666667
-3500   0.228840125 79.75   18.25
-4933   0.154931973 70  10.8452381
-4350   0.021428571 35  0.75
-3500   0.0625  28  1.75
-2715   0.160714286 28  4.5
-2715   0.110047847 52.25   5.75
-3500   0.176923077 32.5    5.75
-3500   0.226277372 34.25   7.75
-2715   0.132625995 188.5   25

Вот код, который я использую:

Analysis <- read.csv(file.choose(), header = T)
plot(Value ~ Period, Analysis)
a <- order(Analysis$Period)
Analysis.lo <- loess(Value ~ Period, Analysis, weights = Total1)
pred <- predict(Analysis.lo, se = TRUE)
lines(Analysis$Period[a], pred$fit[a], col="red", lwd=3)
lines(Analysis$Period[a], pred$fit[a] - qt(0.975, pred$df)*pred$se[a],lty=2)
lines(Analysis$Period[a], pred$fit[a] + qt(0.975,pred$df)*pred$se[a],lty=2)

Спасибо за вашу помощь, и, пожалуйста, дайте мне знать, если какая-либо дополнительная информация необходима.

1 ответ

Решение

Предупреждения выдаются, потому что алгоритм для loess находит численные трудности, в связи с тем, что Period имеет несколько значений, которые повторяются относительно большое количество раз, как вы можете видеть из своего графика, а также с помощью:

table(Analysis$Period)

В этом отношении, Period на самом деле ведет себя как дискретная переменная (фактор), а не как непрерывная переменная, как это требуется для правильного сглаживания. Добавление некоторого дрожания удаляет предупреждения:

Analysis <- read.table(header = T,text="Period  Value   Total1  Total2
-2950   0.104938272 32.4    3.4
-2715   0.054347826 46  2.5
-2715   0.128378378 37  4.75
-2715   0.188679245 39.75   7.5
-3500   0.245014245 39  9.555555556
-3500   0.163120567 105.75  17.25
-3500   0.086956522 28.75   2.5
-4350   0.171038825 31.76666667 5.433333333
-3650   0.143798024 30.36666667 4.366666667
-4350   0.235588972 26.6    6.266666667
-3500   0.228840125 79.75   18.25
-4933   0.154931973 70  10.8452381
-4350   0.021428571 35  0.75
-3500   0.0625  28  1.75
-2715   0.160714286 28  4.5
-2715   0.110047847 52.25   5.75
-3500   0.176923077 32.5    5.75
-3500   0.226277372 34.25   7.75
-2715   0.132625995 188.5   25")

table(Analysis$Period)    
Analysis$Period <- jitter(Analysis$Period, factor=0.2)

plot(Value ~ Period, Analysis)
a <- order(Analysis$Period)
Analysis.lo <- loess(Value ~ Period, Analysis, weights = Total1)
pred <- predict(Analysis.lo, se = TRUE)
lines(Analysis$Period[a], pred$fit[a], col="red", lwd=3)
lines(Analysis$Period[a], pred$fit[a] - qt(0.975, pred$df)*pred$se[a],lty=2)
lines(Analysis$Period[a], pred$fit[a] + qt(0.975,pred$df)*pred$se[a],lty=2)

Увеличение span параметр имеет эффект "раздавливания", вдоль Period ось, груды повторяющихся значений, где они встречаются; с небольшими наборами данных вам нужно много раздавливания, чтобы компенсировать накопление повторяющихся Periods.

С практической точки зрения я бы все еще доверял регрессии, возможно, после проверки графического вывода. Но я бы точно не увеличил span чтобы добиться сдавливания: гораздо лучше использовать небольшое количество jitter для этой цели; span должны быть продиктованы другими соображениями, такими как общее распространение вашего Period данные и т. д.

Другие вопросы по тегам