【问题标题】:R linear regression [closed]R线性回归
【发布时间】:2013-02-11 22:36:19
【问题描述】:

我有公式 y = x / (a+b*x) 我想拟合点 (6,72) (211,183) (808,360) (200,440)。我把它们放在 R 中使用

x <- c(6,211,808,200)
y <- c(72,183,360,440)

现在我想拟合上面定义的函数来拟合这些点,并找到 a 和 b。 我如何获得 a 和 b(使用 R)?还有,我如何获得 R 中的公式?

【问题讨论】:

  • 这不是线性回归。您可以使用nls(y~x/(a+b*x), ...(您必须提供起始值)或glm(y~x,family=gaussian(link="inverse"))。查看相关(但比这更难):stackoverflow.com/questions/15073246/…

标签: r


【解决方案1】:

获取数据并绘制它:

x <- c(6,211,808,200)
y <- c(72,183,360,440)
plot(x,y,pch=19)

定义函数,得到你的系数

f <- function(x,a,b) {x/(a+b*x)}
fit <- nls(y ~ f(x,a,b), start=c(a=1,b=1))
co <- coef(fit)
# co will contain your coefficients for a and b
#          a           b 
#0.070221853 0.002796513 

然后策划:

curve(f(x, a=co["a"], b=co["b"]), add = TRUE, col="green", lwd=2)

结果:

【讨论】:

  • 非常好的答案,但是 OP 的模型是 not x/(a+b+x),它是 x/(a+b*x)——虽然将 2 参数模型拟合到 4 个数据,但它没有过度参数化点有点冒险......
  • @BenBolker - 该死!这就是你在午夜回答的结果。无论如何,我在研究旧答案时学到了一些东西,所以这并不是完全的损失。为新答案编辑...
【解决方案2】:

构造数据:

x <- c(6,211,808,200)
y <- c(72,183,360,440)
d <- data.frame(x,y)

绘制数据:虽然稀疏,但它们并不疯狂(它们确实显示了一些增加/饱和模式的证据)

plot(y~x,data=d)

拟合模型:

## y = x/(a+b*x)
## 1/y = a/x + b
m1 <- glm(y~I(1/x),family=gaussian(link="inverse"),data=d)

您可以在ggplot中绘制结果

library("ggplot2")
qplot(x,y,data=d)+theme_bw()+
    geom_smooth(method="glm",family=gaussian(link="inverse"),
                formula=y~I(1/x),se=FALSE)

这个模型的置信区间有点疯狂(因为1/y 的置信区间包括零,此时y 的置信区间会爆炸),所以要小心...

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2011-10-14
    • 2018-04-28
    • 2023-03-11
    • 2021-07-02
    相关资源
    最近更新 更多