代码之家  ›  专栏  ›  技术社区  ›  Daniel Valencia C.

如何求一个函数在R中改变一个常量的最大值?

  •  0
  • Daniel Valencia C.  · 技术社区  · 5 年前

    我有以下线性化图:

    enter image description here

    a b 是包含数据的向量, c 是一个常数。任务是找到 最大化 R^2 对于线性回归

    a <- c(56.60, 37.56, 15.80, 27.65, 9.20, 5.05, 3.54)
    b <- c(23.18, 13.49, 10.45, 7.24, 5.44, 4.19, 3.38)
    c <- 1
    
    x <- log(a)
    y <- log((c*(a/b))-1)
    
    rsq <- function(x, y) summary(lm(y~x))$r.squared
    rsq(x, y)
    
    optimise(rsq, maximum = TRUE)
    
    0 回复  |  直到 5 年前
        1
  •  3
  •   jogo    5 年前

    a <- c(56.60, 37.56, 15.80, 27.65, 9.20, 5.05, 3.54)
    b <- c(23.18, 13.49, 10.45, 7.24, 5.44, 4.19, 3.38)
    
    rsq <- function(c) {
      x <- log(a)
      y <- log((c*(a/b))-1)
      stopifnot(all(is.finite(y)))  
      summary(lm(y ~ x))$r.squared
    }
    optimise(rsq, maximum = TRUE, interval=c(0.8, 3))
    

    .

    # > optimise(rsq, maximum = TRUE, interval=c(0.8, 3))
    # $maximum
    # [1] 1.082352
    # 
    # $objective
    # [1] 0.8093781
    

    plot(Vectorize(rsq), .8, 3)
    grid()
    

    为你能做的观察设置一个条件

    rsq <- function(c) {
      xy <- data.frame(a=a, y=(c*(a/b))-1)
      summary(lm(log(y) ~ log(a), data=subset(xy, y>0)))$r.squared
    }
    optimise(rsq, maximum = TRUE, interval=c(0.1, 3))
    

    ... 有趣的情节是:

    plot(Vectorize(rsq), .3, 1.5)
    grid()
    
    rsq(0.4)