【问题标题】:In R, find non-linear lines from two sets of points and then find the intersection of those points在R中,从两组点中找到非线性线,然后找到这些点的交点
【发布时间】:2019-06-02 05:14:36
【问题描述】:

使用 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,清除会话中的所有对象,然后复制/粘贴已编辑的代码。我认为您只是在覆盖对象。 =)
  • 我发现了导致我出现问题的错字......在最后一行我有 a_opt 当它应该是 a_opt1 时,这给我带来了问题。很高兴知道代码确实有效。如果您有任何改进建议,我会全力以赴!
  • 在下面查看我的答案....您再次对其进行了编辑并将小写的p 变量改回了大写的P。它可能只在您的会话中有效,因为还有一个剩余的大写字母P。如果您在 RStudio 中,建议您进入 Tools &gt; Global Options 并取消选中 Restore .RData into workspace at startup 并将 Save workspace to .RData on exit 设置为 Never。同时取消选中HistoryR Sessions 下的选项。这可确保您每次重新启动 R 时都有一个干净的工作区,并有助于避免这些类型的问题。

标签: r intersection non-linear-regression game-theory


【解决方案1】:

重新启动您的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多