簡體   English   中英

在R中,從兩組點中找到非線性線,然后找到這些點的交點

[英]In R, find non-linear lines from two sets of points and then find the intersection of those points

使用R,我想使用來自兩個向量的點估計兩條曲線,然后找到那些估計曲線相交的x和y坐標。

在玩家“t”和“p”的戰略環境中,我正在模擬兩個玩家的最佳回應,以回應對方在戰略環境(博弈論)中所選擇的內容。 問題是我沒有函數或線,我有兩組來自模擬的點,一組點對應於玩家對另一個玩家給定動作的最佳響應。 實際的數學對我(或matlab)來說太難解決了,這就是我使用這種模擬視覺方法的原因。 我想使用這些點來估計最佳響應函數(即創建非線性曲線),然后獲取兩條估計曲線並找到它們相交的位置,以便識別納什均衡(最佳響應曲線相交的位置)。

舉個例子,我正在使用兩個這樣的向量:

t=c(10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0)

p=c(12.3,12.3,12.3,12.3,12.3,12.3,12.4,12.4,12.4,12.5,12.5,12.5,12.6,12.6,12.7,12.7,12.8,12.8,12.9,12.9,13.0,13.1,13.1,13.2,13.3,13.4,13.5,13.4,13.5,13.6,13.6,13.7,13.8,13.8,13.9,13.9,13.9,14.0,14.0,14.0,14.0)

對於第一行,樣本由(t,a)組成,對於第二行,樣本由(a,p)組成,其中a是由給定的第三個向量

a = seq(10, 14, by = 0.1)

例如,對應於第一個矢量的樣本的第一個點是(10.0,10.0),第二個點是(10.0,10.1)。 對應於第二個向量的樣本的第一個點是(10.0,12.3),第二個點是(10.1,12.3)。

我最初嘗試做的是使用由lm模型生成的多項式來估計線條,但那些似乎並不總是有效:

plot(a,t, xlim=c(10,14), ylim=c(10,14), col="purple")
points(p,a, col="red")

fit4p <- lm(a~poly(p,3,raw=TRUE))
fit4t <- lm(t~poly(a,3,raw=TRUE))
lines(a, predict(fit4t, data.frame(x=a)), col="purple", xlim=c(10,14), ylim=c(10,14),type="l",xlab="p",ylab="t")
lines(p, predict(fit4p, data.frame(x=a)), col="green")

fit4pCurve <- function(x) coef(fit4p)[1] +x*coef(fit4p)[2]+x^2*coef(fit4p)[3]+x^3*coef(fit4p)[4] 
fit4tCurve <- function(x) coef(fit4t)[1] +x*coef(fit4t)[2]+x^2*coef(fit4t)[3]+x^3*coef(fit4t)[4]

a_opt1 = optimise(f=function(x) abs(fit4pCurve(x)-fit4tCurve(x)), c(10,14))$minimum
b_opt1 = as.numeric(fit4pCurve(a_opt1))

編輯:修復類型后,我得到正確的答案,但如果樣品沒有干凈地回來,它並不總是有效。

所以我的問題可以分解幾個方面。 首先,有沒有更好的方法來完成我想要做的事情。 我知道我所做的事情無論如何都不是完全准確的,但對於我的目的來說,它似乎是一個不錯的近似值。 其次,如果沒有更好的方法,我是否有辦法改進上面列出的方法。

重新啟動R會話,確保清除所有變量並復制/粘貼此代碼。 我在引用的變量中發現了一些錯誤。 另請注意, R區分大小寫。 我懷疑你一直在覆蓋變量。

plot(a,t, xlim=c(10,14), ylim=c(10,14), col="purple")
points(p,a, col="red")

fit4p <- lm(a~poly(p,3,raw=TRUE))
fit4t <- lm(t~poly(a,3,raw=TRUE))
lines(a, predict(fit4t, data.frame(x=a)), col="purple", xlim=c(T,P), ylim=c(10,14),type="l",xlab="p",ylab="t")
lines(p, predict(fit4p, data.frame(x=a)), col="green")

fit4pCurve <- function(x) coef(fit4p)[1] +x*coef(fit4p)[2]+x^2*coef(fit4p)[3]+x^3*coef(fit4p)[4] 
fit4tCurve <- function(x) coef(fit4t)[1] +x*coef(fit4t)[2]+x^2*coef(fit4t)[3]+x^3*coef(fit4t)[4]

a_opt = optimise(f=function(x) abs(fit4pCurve(x)-fit4tCurve(x)), c(T,P))$minimum
b_opt = as.numeric(fit4pCurve(a_opt))

正如您將看到的:

> a_opt
[1] 12.24213
> b_opt
[1] 10.03581

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM