抖动对LOESS的影响

时间:2016-08-15 02:30:13

标签: r plot loess

我之前提出过有关LOESS错误和警告的问题:LOESS warnings/errors related to span in 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 =   参数,:倒数条件数0

     

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

有关警告的问题得到了解答,我建议添加一些抖动以避免由于x轴具有一些重复相对较大数量的值而导致黄土发现数值困难的算法问题。次。

在运行LOESS回归时,抖动数据避免了先前的错误和警告,但是线的结果在某一点上完全不同。无论抖动有多小,结果仍然与非抖动结果不同。

以下是有问题的数据集的示例:

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)

第一张图片没有抖动

Without Jittering

在下一个图表中,我使用蓝色运行原始数据,使用默认因子红色运行抖动版本。这让我想知道哪条回归线更有效。非抖动线看起来更适合眼睛,但是改变抖动因子似乎对回归线有这么小的影响这一事实使我认为抖动和非抖动回归之间存在显着差异。跑。我想弄清楚到底发生了什么。

Analysis <- read.csv(file.choose(), header = T)
table(Analysis$Period)
Analysis$Period <- jitter(Analysis$Period)
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=2)
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)

使用默认值抖动 Jittered at default

按照Hack-R的示例答案,结果如下:

Analysis <- read.csv(file.choose(), header = T)
plot(Value ~ Period, Analysis)
a               <- order(Analysis$Period)
no_jitter       <- Analysis$Period
Analysis$Period <- jitter(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(no_jitter[a], pred$fit[a], col="blue", 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)

exact instructions

使用相同的代码删除非抖动版本会产生这种结果。

Analysis <- read.csv(file.choose(), header = T)
plot(Value ~ Period, Analysis)
a               <- order(Analysis$Period)
Analysis$Period <- jitter(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)

Hack-R graph minus jitter

为了回应Hack-R的示例代码,我注意到非抖动版本没有提出与初始代码相同的原始错误/警告。我通过Hack-R运行示例代码,然后添加了原始代码以获得这些结果。

Hack-R代码,最后添加了原始代码:

Analysis <- read.csv(file.choose(), header = T)
plot(Value ~ Period, Analysis)
a               <- order(Analysis$Period)
no_jitter       <- Analysis$Period
Analysis$Period <- jitter(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(no_jitter[a], pred$fit[a], col="blue", 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)
Analysis2 <- read.csv(file.choose(), header = T)
points(Value ~ Period, Analysis2)
b <- order(Analysis2$Period)
Analysis2.lo <- loess(Value ~ Period, Analysis2, weights = Total1)
pred2 <- predict(Analysis2.lo, se = TRUE)
lines(Analysis2$Period[b], pred2$fit[a], col="orange", lwd=3)
lines(Analysis2$Period[b], pred2$fit[a] - qt(0.975,    pred$df)*pred$se[b],lty=3)
lines(Analysis2$Period[b], pred$fit[a] + qt(0.975, pred$df)*pred$se[b],lty=3)

Triple comparison check

我仍然对于出现问题的地方有点不知所措,但我怀疑提供的抖动和非抖动解决方案实际上并没有将抖动的样本与原始数据进行比较。

感谢您的帮助。

更新

查看抖动和非抖动的代码,我注意到只运行了一条LOESS线,并且只运行了沿LOESS线的一组预测值。这两个都出现以引用原始值。如果完全是这种情况,我不明白为什么不会有与原始回归相同的警告。为了确保逐行完成的工作是明确的,我列出了下面的代码以及我自己对相信正在进行的评论。我确定我在这里错过了一些东西。

#define "Analysis" as the CSV file
Analysis <- read.csv(file.choose(), header = T)

#plot initial points
plot(Value ~ Period, Analysis)

#order points
a               <- order(Analysis$Period)

#define the period values from "Analysis" without any alterations and define as "no_jitter"
no_jitter       <- Analysis$Period

#create jittered values for the period values from "Analysis" and define them as Analysis$Period
Analysis$Period <- jitter(Analysis$Period)

#define the LOESS (for the original data set) 
Analysis.lo     <- loess(Value ~ Period, Analysis, weights = Total1)

#predict values along LOESS curve (for the original data set)
pred            <- predict(Analysis.lo, se = TRUE)

#plot loess line for jittered values (but the pred function is referencing [a] which is the ordered Period values before they were jittered)
lines(Analysis$Period[a], pred$fit[a], col="red", lwd=3)

#plot loess line for non-jittered values (which are still referencing the original values ordered in [a])
lines(no_jitter[a], pred$fit[a], col="blue", lwd=3)

#confidence intervals for jittered values (same referencing issues as above)
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) 

我尝试过多次运行代码。我发现通过控制抖动因子,我通常可以使抖动回归接近非抖动回归。我发现有时,即使数据点抖动,我也会在抖动数据之前得到一些相同的错误。我有一种感觉,这可能与点在特定情况下如何抖动有关。抖动可能会将点移动到足够远的距离以避免警告,而其他时候抖动不会使点足够远。作为一个随机因素,这似乎很难控制。我将尝试不断增加抖动因子,看看是否有一个点没有发生这个错误而没有将点移动得太远而不会显着影响线。我稍后会更新。

0 个答案:

没有答案