R:找到产生最大R平方值的表达式的系数?

时间:2016-01-11 22:39:49

标签: r regression

我们说我已将数据输入到数据框中,如下所示:

df = data.frame(x = c(1,2,3,4,5,10,15,25,50), 
                y = c(.57,.75,.82,0.87,.89,.95,.97,.98,.99))
df

我想表达一下:

  

y =((x / a)^ b)/(1+(x / a)^ b)

其中a和b是未知参数。

我通过猜测a和b的值来绘制点并绘制拟合线:

library(ggplot2)
graph <- ggplot(df, aes(x=x, y=y))
graph <- graph + geom_point()

a = 0.50
b = 1.00
guesstimate <- function(x){((x/a)^b)/(1+(x/a)^b)}
graph <- graph + stat_function(fun = guesstimate)
graph

但是,我想找到a和b的值,它创建一个产生最高R ^ 2平方值的表达式;即尽可能最好的数学拟合数据。

问题: 如果没有手动猜测a和b的值并用肉眼检查最合适,那么有没有办法让R找到最好的&#39; a和b值一起提供R平方值,这证实了所选择的a和b值确实是最佳拟合值?

2 个答案:

答案 0 :(得分:2)

您可以使用nls(非线性最小二乘)函数:

m1 = nls(y ~ (x/a)^b/(1+(x/a)^b), list(a=1, b=1), data=df)

summary(m1)
Formula: y ~ (x/a)^b/(1 + (x/a)^b)

Parameters:
  Estimate Std. Error t value Pr(>|t|)    
  a 0.779291   0.009444   82.51 1.01e-11 ***
  b 1.145174   0.012733   89.94 5.53e-12 ***
  ---
  Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.003086 on 7 degrees of freedom

Number of iterations to convergence: 4 
Achieved convergence tolerance: 5.949e-08
ggplot(df, aes(x,y)) + 
  geom_point() +
  geom_line(data=data.frame(x=seq(1,50,0.1), y=predict(m1, newdata=list(x=seq(1,50,0.1)))), 
            aes(x,y), colour="red")

enter image description here

nls不提供r平方值,因为正如this thread on R-help中所讨论的,r平方对于非线性模型不一定有意义。但是,nls确实找到了最小化残差平方和的参数值,因此从这个意义上说,这些参数最适合给定的数据和模型。这并不意味着没有其他模型规格可以提供更好的贴合度,但在这种情况下,模型拟合几乎是完美的。

答案 1 :(得分:1)

即使不是很明显,也可以在这里使用线性模型,只需使用基本代数。实际上,从time_get开始,稍微操纵一下,你就可以到达:

1/y = (1+(x/a)^b)/(x/a)^b

基本上是变量log(1/y - 1) = -b*log(x) + b*log(a) Y = log(1/y - 1)中的线性模型。在这里,您可以使用X = log(x)

lm

df2<-data.frame(Y = log(1/df$y - 1), X = log(df$x)) coeffs<-lm(Y ~ X, data=df2)$coefficients a <- exp(-model[1]/model[2]) # 0.7491387 b <- -model[2] #1.116111 获得的相似。