【问题标题】:In r, get output values in power curve for 'a' and 'b' values在 r 中,获取“a”和“b”值的功率曲线中的输出值
【发布时间】:2013-10-15 07:08:07
【问题描述】:

对于这个基本问题,我深表歉意,但无论出于何种原因,我都陷入了困境。我希望从 y = a*x^b 的“a”和“b”的功率曲线中获得输出值。假设我有这个数据集:

 x       y       log10(x)         log10(y)
 7      240     0.84509804      2.380211242
45      610     1.653212514     2.785329835
14      340     1.146128036     2.531478917
30      500     1.477121255     2.698970004
24      450     1.380211242     2.653212514
57      690     1.755874856     2.838849091

它会在 excel 中生成此图表:

使用 excel 示例,我将如何获取 r 中 a=2.465 和 b=0.2401 的输出值。

【问题讨论】:

  • 使用函数nls
  • 您的图表没有绘制上面的数字。发布正确的图表,或展示您如何获得此图表。
  • 我试过 nls 但我得到了这个错误:nls(x ~ A * y ^ B,start = list(A = 0, B = 0)) nlsModel(formula, mf, start, wts) 中的错误:初始参数估计时的奇异梯度矩阵
  • 使用对数变换线性化和估计nls 的初始参数值。可能将其包装在 selfStart 模型中。

标签: r regression


【解决方案1】:

您的数据:

DF <- read.table(text="x       y       log10(x)         log10(y)
7      240     0.84509804      2.380211242
45      610     1.653212514     2.785329835
14      340     1.146128036     2.531478917
30      500     1.477121255     2.698970004
24      450     1.380211242     2.653212514
57      690     1.755874856     2.838849091", header=TRUE)

创建自启动模型: (免责声明:函数名称不代表我的政治态度,仅符合自启动函数的命名方案。)

SSpower <- selfStart(~ A*x^B,
                     function(mCall, data, LHS)
                     {
                       xy <- sortedXyData(mCall[["x"]], LHS, data)
                       if(nrow(xy) < 3) {
                         stop("Too few distinct x values to fit a power function")
                       }
                       z <- xy[["y"]]
                       xy[["logx"]] <- log(xy[["x"]])     
                       xy[["logy"]] <- log(xy[["y"]])  
                       aux <- coef(lm(logy ~ logx, xy))
                       pars <- c(exp(aux[[1]]), aux[[2]])
                       setNames(pars,
                                mCall[c("A", "B")])
                     }, c("A", "B"))

使用自启动模型进行拟合:

fit <- nls(y ~ SSpower(x, A, B), data=DF)

剧情:

plot(y~x, data=DF)
lines(x=1:60, y=predict(fit, newdat=list(x=1:60)))

【讨论】:

  • 谢谢罗兰。然而,我遇到了一个新问题。我已将此函数放在一个循环中(它循环 1000 次),当我尝试使用 nls 函数时,我得到:“nls 错误(y ~ SSpower[[j]][[i]](x, :迭代次数超过最大值 50 另外:警告消息:在 nls(y ~ SSpower[[j]][[i]](x, : 没有为某些参数指定起始值。初始化 'A', 'B' 到'1.'. 考虑指定 'start' 或使用 selfStart 模型”
【解决方案2】:

看看以下内容(让您的问题下次可重现。这可能也有助于您指出确切的问题):

x  <-  c(7, 45, 14, 30, 24, 57)
y  <-  c(240, 610, 340, 500, 450, 690)

logx  <-  log10(x)
logy  <-  log10(y)

lm.000  <-  lm(logy ~ logx)
summary(lm.000)

coef(lm.000)[1]
coef(lm.000)[2]

plot(x, y)
curve(x^coef(lm.000)[2]*10^coef(lm.000)[1], add=TRUE, lwd=2)

【讨论】:

    【解决方案3】:

    data 是你的数据集:

    y=data[,3]
    x= data[,4]
    
    nls(x ~ A * y ^ B)
    Nonlinear regression model
      model: x ~ A * y^B
       data: parent.frame()
         A      B 
    2.4635 0.2421 
     residual sum-of-squares: 0.0008733
    
    Number of iterations to convergence: 5 
    Achieved convergence tolerance: 6.774e-06
    

    【讨论】:

    • 我对这些值不感兴趣,而是对确定这些值感兴趣。这些值将在一个模型中循环,该模型在每个循环中检索不同的“a”和“b”值,然后根据“a”和“b”的不同输出计算不同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2021-06-24
    • 2021-01-17
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多