2013-02-26 295 views
-2

我有我想要適合點(6,72)(211,183)(808,360)(200,440)的公式y = x /(a + b * x)。我把它們放在R中使用R線性迴歸

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

現在我想擬合上面定義的函數來適應這些點,找到a和b。 如何獲得a和b(使用R)?並且,我如何獲得R中的公式?

+7

這不是線性迴歸。你可以使用'nls(y〜x /(a + b * x),...'(你必須提供起始值)或'glm(y〜x,family = gaussian(link =「inverse」)) )'。見相關(但比這更難):http://stackoverflow.com/questions/15073246/how-to-put-a-complicated-equation-into-ar-formula/15076688#15076688 – 2013-02-26 13:11:05

回答

2

獲取數據,並繪製它:

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) 

結果:

enter image description here

+4

很好的答案,但OP的模型是**不是**'x /(a + b + x)',它是'x /(a + b * x)' - 雖然沒有過度參數化,但是將2參數模型擬合爲4數據點有點冒險... – 2013-02-26 14:12:38

+0

@BenBolker - 該死!這就是你在午夜回答的問題,無論如何我在研究舊的答案時學到了一些東西,所以這不是完全的損失。 ... – thelatemail 2013-02-26 22:12:48

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炸掉置信區間),所以一定要小心......