为f(x)黄土函数寻找x

时间:2016-11-11 14:54:03

标签: r loess

我有几个使用类似数据的黄土模型......

set.seed(123)

y<-(runif(100,-20,20))
z<-seq(-12.75,12,.25)*rnorm(100,1,3)
x<-seq(1,100,1)
df<-data.frame(cbind(y,x,z))
model <- loess(y ~ x, data = df)
model2<-loess(z~x,data=df)

我想要完成的事情(没有任何运气)是确定平滑线条做两件事的地方:

1)我想确定线的交叉线y = 0

的x值

2)我想确定2条黄土线相互交叉的x值。

我一直在寻找类似的问题和解决这些问题的方法已经很久没有成功了。任何帮助将不胜感激。

ggplot(df,aes(x=x,y=y))+
  geom_point()+
  geom_smooth(method="loess",se=F)+
  geom_smooth(aes(y=z),method="loess",se=F)

1 个答案:

答案 0 :(得分:2)

您可以使用predict获取任何x的y值,然后进行优化以找到解决所需y值的特定x值。

例如,要找到模型的零交叉,我们可以优化以找到其拟合值的平方最小值

zero1 <- optimize(function(x, m) predict(m, x)^2, range(x), model) 
# 
# $minimum
# [1] 67.89191

请注意,这只会找到一个本地最小值。如果你的模型多次过零,你需要在每个零点的范围内解决这个问题(通过改变optimize的第二个参数,它指定要在其中搜索的范围)。

完全相同的方法可以找到模型相交的位置。在这种情况下,您可以最小化两个模型之间差异的平方:

intersection <- optimize(function(x, m1, m2) (predict(m1, x) - predict(m2, x))^2,
              range(x), model, model2)  
# $minimum
# [1] 45.65295