找出两个线性拟合在R中相交的位置

Cod*_*Guy 7 intersection r lm

我有两个线性拟合,我从我的R脚本中的lm调用中获得.例如...

fit1 <- lm(y1 ~ x1)
fit2 <- lm(y2 ~ x2)
Run Code Online (Sandbox Code Playgroud)

我想找到这两条线(fit1fit2)相交的(x,y)点,如果它们相交的话.

Tom*_*mmy 11

这是一些高中几何学然后;-)

# First two models
df1 <- data.frame(x=1:50, y=1:50/2+rnorm(50)+10)
m1 <- lm(y~x, df1)

df2 <- data.frame(x=1:25, y=25:1*2+rnorm(25)-10)
m2 <- lm(y~x, df2)

# Plot them to show the intersection visually    
plot(df1)
points(df2)

# Now calculate it!    
a <- coef(m1)-coef(m2)
c(x=-a[[1]]/a[[2]], y=coef(m1)[[2]]*x + coef(m1)[[1]])
Run Code Online (Sandbox Code Playgroud)

或者,为了简化solve@Dwin 的基于解决方案:

cm <- rbind(coef(m1),coef(m2)) # Coefficient matrix
c(-solve(cbind(cm[,2],-1)) %*% cm[,1])
# [1] 12.68034 16.57181 
Run Code Online (Sandbox Code Playgroud)

  • -1表示“将OP带回学校”——这并不是真正有建设性的 (2认同)

G. *_*eck 7

避免几何的一种方法是将方程重新参数化为:

y1 = m1 * (x1 - x0) + y0
y2 = m2 * (x2 - x0) + y0
Run Code Online (Sandbox Code Playgroud)

在它们的交叉点方面(x0, y0),然后一次使用两者的拟合,nls以便返回值x0y0给出结果:

# test data
set.seed(123)
x1 <- 1:10
y1 <- -5 + x1 + rnorm(10)
x2 <- 1:10
y2 <- 5 - x1 + rnorm(10)
g <- rep(1:2, each = 10) # first 10 are from x1,y1 and second 10 are from x2,y2

xx <- c(x1, x2)
yy <- c(y1, y2)
nls(yy ~ ifelse(g == 1, m1 * (xx - x0) + y0, m2 * (xx - x0) + y0),
    start = c(m1 = -1, m2 = 1, y0 = 0, x0 = 0))
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,行xx<-...yy<-...是新的和nls线已经在这些领域和修正的条款已经被指定.