2016-11-11 90 views
1

我一直在使用類似的數據夫婦黃土模型來....尋找X(X)黃土功能

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的什麼值(S)做的線交叉y = 0的

2)欲識別在什麼值(S)的X中的2條黃土線相互交叉。

我一直在尋找類似的問題和對這些問題的解決方案太久沒有成功。任何幫助將不勝感激。

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

在'model $ fitted'值之間進行插值是否能給您足夠的細節? – Miff

+0

@Miff不,我不這麼認爲。最終,我想報告並繪製(ggplot2)這些行跨越0的位置處的x值和相互截取的位置處的x值。 – Jdan

回答

2

您可以使用predict得到的y值任何x,然後優化,以找到解決你想要的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 
+0

該功能按照您的描述工作,所以感謝您的建議。我遇到的唯一問題是我需要對其進行細化,以便我可以提取出兩個模型的線相交或單線穿過零的所有值。我試圖自動化這個,所以我可以同時爲_geom.vline_生成大約200多個模型的地塊。對於某些模型,該線可能會跨越0十次。因此,必須重新定義範圍十幾次,每個情節似乎是及時的。有什麼想法嗎? – Jdan

+1

通過查看函數的符號在一個值和連續值之間的變化,您可以找到自動找到零交叉點的位置。就像'which(sign(x [-1])!= sign(x [-length(x)]))'應該這樣做 – dww