我问了一个关于 LOESS 错误和警告的先前问题:LOESS warnings/errors related to span in R。该问题与尝试对我的数据集运行 LOESS 回归时发生的此类警告有关。
警告信息:
1: 在 simpleLoess(y, x, w, span, degree = degree, parametric = parametric, : 在 -2703.9 处使用的伪逆
2:在 simpleLoess(y, x, w, span, degree = degree, parametric = 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
关于警告的问题已得到解答,建议我添加一些抖动以避免由于 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)
第一张图像没有抖动
在下一张图中,我以蓝色运行原始数据,并以红色运行使用默认抖动因子的抖动版本。这让我想知道哪条回归线更有效。非抖动线看起来更适合眼睛,但改变抖动因子似乎对回归线影响很小的事实让我认为抖动和非抖动回归之间存在显着差异跑。我试图弄清楚这里到底发生了什么。
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)
遵循 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)
但是,使用相同的代码删除非抖动版本会导致这种情况。
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 的示例代码时,我注意到非抖动版本没有出现与我的初始代码相同的原始错误/警告。我通过 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)
对于事情在哪里出错,我仍然有点茫然,但我怀疑提供的抖动和非抖动解决方案实际上并未将抖动样本与原始数据进行比较。
谢谢您的帮助。
更新
查看抖动和非抖动的代码,我注意到只运行了一条 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)
我已经尝试过多次运行代码。我发现通过控制抖动因子,我通常可以使抖动回归接近非抖动回归。我发现有时,即使数据点抖动,我也会遇到一些与抖动数据之前相同的错误。我有一种感觉,这可能与在特定情况下这些点的抖动方式有关。抖动有时可能会将点移动得足够远以避免警告,而其他时候抖动不会将点移得足够远。作为一个随机因素,这似乎很难控制。我将尝试不断增加抖动因子,以查看是否存在不会发生此错误的点,而不会将这些点移动得太远而不会显着影响线条。我稍后会更新。