2017-04-10 119 views
1

我需要使用拟合模型来预测新值y的相应x值。使用拟合模型预测Y值的X值

从一个新的x值预测y价值的通常情况下是通过使用predict功能简单,但我无法弄清楚如何做反向。

对于具有多个x解决方案的情况,我希望获得x值范围内的所有解决方案,即1-10。并且新的y将始终在用于拟合模型的y值的范围内。

查看下面的示例代码,我需要找到新的x值(new_x)。

x = seq(1:10) 
y = c(60,30,40,45,35,20,10,15,25,10) 

fit = lm(y ~ poly(x, 3, raw=T)) 

plot(x, y) 
lines(sort(x), predict(fit)[order(x)], col='red') 

example plot

new_y = 30 
new_x = predict(fit, data.frame(y=new_y)) #This line does not work as intended. 

编辑1:反转配件

拟合反演关系不会产生相同的模式,因为我们得到了一个不同的模型/拟合线。

rev_fit = lm(x ~ poly(y, 3, raw=T)) 

plot(x, y) 
lines(sort(x), predict(fit)[order(x)], col='red') 
lines(predict(rev_fit)[order(y)], sort(y), col='blue', lty=2) 

example plot 2

+0

让我告诉你例子。如果你有y = 2x + 3那么对于x = 1 y是5,所以对于y = 13 x等于=(y-3)/ 2 –

+0

对于简单的情况,可以手动计算。但我正在寻找R中可能错过的实现函数。我真正的模型涉及样本负二项分布,所以理想情况下我不想自己解决这个问题。 (当然,除非这是唯一的方法。) – cylim

+0

难道你不能只是用另一种方式建立你的模型吗?拟合x到y?或者我错过了什么。 – PinkFluffyUnicorn

回答

3

正如在this answer你应该能够使用approx()您的任务暗示。例如。像这样:

xval <- approx(x = fit$fitted.values, y = x, xout = 30)$y 

points(xval, 30, col = "blue", lwd = 5) 

为您提供:

enter image description here

+1

感谢您的回答。我刚刚看到了几分钟前提到的链接,实际上它是迄今为止我能找到的最佳解决方案,并且可以用于更复杂的模型。 – cylim

+1

只需添加,'样条函数也可用于非线性插值,作为线性“近似”函数的替代。 – cylim