我正在尝试使用黄土拟合模型,并且我遇到诸如"在3处使用伪逆","邻域半径1"和"倒数条件数0"之类的错误.这是一个MWE:
x = 1:19
y = c(NA,71.5,53.1,53.9,55.9,54.9,60.5,NA,NA,NA
,NA,NA,178.0,180.9,180.9,NA,NA,192.5,194.7)
fit = loess(formula = y ~ x,
control = loess.control(surface = "direct"),
span = 0.3, degree = 1)
x2 = seq(0,20,.1)
library(ggplot2)
qplot(x=x2
,y=predict(fit, newdata=data.frame(x=x2))
,geom="line")
Run Code Online (Sandbox Code Playgroud)
我意识到我可以通过选择更大的跨度值来修复这些错误.但是,我正在尝试自动化这种拟合,因为我有大约100,000个时间序列(每个长度大约20个)与此类似.有没有办法可以自动选择一个可以防止这些错误的跨度值,同时仍能提供相当灵活的数据拟合?或者,任何人都可以解释这些错误的含义吗?我在loess()和simpleLoess()函数中做了一些讨论,但是在调用C代码时我放弃了.
比较fit$fitted到y.您会注意到回归出现问题.选择足够的带宽,否则它只是插入数据.由于数据点太少,线性函数在小带宽上表现得像常数,并触发共线性.因此,您会看到错误警告pseudoinverses,奇点.如果你使用degree=0或,你不会看到这样的错误ksmooth.一个可理解的,数据驱动的选择span是用于交叉验证,您可以在Cross Validated中询问 .
> fit$fitted
[1] 71.5 53.1 53.9 55.9 54.9 60.5 178.0 180.9 180.9 192.5 194.7
> y
[1] NA 71.5 53.1 53.9 55.9 54.9 60.5 NA NA NA NA NA 178.0
[14] 180.9 180.9 NA NA 192.5 194.7
Run Code Online (Sandbox Code Playgroud)
您会看到过度拟合(完美拟合),因为在您的模型中,参数数量与有效样本数量一样多.
fit
#Call:
#loess(formula = y ~ x, span = 0.3, degree = 1, control = loess.control(surface = "direct"))
#Number of Observations: 11
#Equivalent Number of Parameters: 11
#Residual Standard Error: Inf
Run Code Online (Sandbox Code Playgroud)
或者,您也可以使用自动化geom_smooth.(再次设置geom_smooth(span=0.3)投掷警告)
ggplot(data=data.frame(x, y), aes(x, y)) +
geom_point() + geom_smooth()
Run Code Online (Sandbox Code Playgroud)
