【问题标题】:How to find the maximum value of a function changing one constant value in R?如何找到改变R中一个常数值的函数的最大值?
【发布时间】:2019-07-22 12:31:46
【问题描述】:

我有以下线性化图:

ab 是带有数据的向量,c 是一个常数。任务是找到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)

【问题讨论】:

    标签: r linear-regression maximization


    【解决方案1】:

    这行得通:

    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) 
    

    【讨论】:

    • 为了安全起见,您应该在函数中添加stopifnot(all(is.finite(y)))。如果没有这个条件,您可以找到一个 c,其中除一个以外的所有 y 值都是 NaN,结果 r-squared 将为 1。
    • 您好,如何在function 中添加条件?我想要的规则是建立一个限制(c*(a/b)) &gt; 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多