【问题标题】:Finding x for f(x) loess function为 f(x) loess 函数找到 x
【发布时间】:2016-11-11 14:54:03
【问题描述】:

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

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) 我想确定 x 的哪些值与 y=0 相交

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)

【问题讨论】:

  • model$fitted 值之间进行插值是否能提供足够的细节?
  • @Miff 不,我不这么认为。最终,我想报告并绘制(ggplot2)这些线与 0 交叉的 x 值以及相互截距的位置。

标签: r loess


【解决方案1】:

您可以使用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

【讨论】:

  • 该功能如您所描述的那样工作,所以感谢您的建议。我遇到的唯一问题是我需要对其进行改进,以便我可以提取出两个模型的线相交或单条线与零相交的所有值。我正在尝试将其自动化,这样我就可以使用 geom.vline 一次为大约 200 多个模型生成绘图。对于某些型号,这条线可能会跨越 0 次。因此,必须为每个地块重新定义十多次范围似乎是及时的。有什么想法吗?
  • 您可以通过查看函数符号在一个值和连续值之间变化的位置来自动找到零交叉的位置。 which(sign(x[-1]) != sign(x[-length(x)])) 之类的东西应该这样做
猜你喜欢
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多