【问题标题】:LOESS warnings/errors related to span in R与 R 中的 span 相关的 LOESS 警告/错误
【发布时间】:2016-08-10 04:46:45
【问题描述】:

我在 R 中运行 LOESS 回归,并在我的一些较小的数据集上遇到了警告。

警告信息:

1: 在 simpleLoess(y, x, w, span, degree = degree, parametric = 参数,:伪逆使用在-2703.9

2: 在 simpleLoess(y, x, w, span, degree = degree, parametric = 参数,:邻域半径 796.09

3: 在 simpleLoess(y, x, w, span, degree = degree, parametric = parametric, : 倒数条件数 0

4: 在 simpleLoess(y, x, w, span, degree = degree, parametric = parametric, : 还有其他近奇点。 6.1623e+005

这里的另一篇文章讨论了这些错误: Understanding loess errors in 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)

感谢您的帮助,如果需要任何其他信息,请告诉我。

【问题讨论】:

  • 产生错误的代码在哪里?
  • 目前您在问我们为什么您会收到来自您未描述的程序的警告。

标签: r loess


【解决方案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 数据的整体传播等。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2018-12-21
  • 2022-12-15
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多