代码之家  ›  专栏  ›  技术社区  ›  rnorouzian

uniroot()是否混淆了r中的输入值?

  •  1
  • rnorouzian  · 技术社区  · 7 年前

    我想知道,为什么当我直接提供 q ( 看见 f2 ) uniroot() 非常好,但当我提供 Q 作为其他输入值的函数 单根() ( 看见 f1 )失败?

    在代码中,所有 ...1 后缀(例如, F1 )与我间接提供 Q . 所有的一切 ...2 后缀(例如, F2 )与我直接提供 Q .

    我的目标是解决 df2 这样的话 y = .15 (正确答案是 ~ 336.3956 )( )

    alpha = c(.025, .975); df1 = 3; q = 48.05649 ; peta = .3 # input values
    
    f1 <- function(alpha, q, df1, df2, ncp){    # Objective function (`q` indirectly)
      alpha - suppressWarnings(pf(q = (peta / df1) / ((1 - peta)/df2), df1, df2, 
      ncp, lower.tail = FALSE))
    }
    
    f2 <- function(alpha, q, df1, df2, ncp){    # Objective function (`q` directly)
      alpha - suppressWarnings(pf(q = q, df1, df2, ncp, lower.tail = FALSE))
    }
    
    ncp1 <- function(df2){                    # root finding
     b <- sapply(c(alpha[1], alpha[2]),     
              function(x) uniroot(f1, c(0, 1e7), alpha = x, q = peta, df1 = df1, df2 = df2)[[1]])
    
      b / (b + (df2 + 4))
    }
    
    ncp2 <- function(df2){                    # root finding
      b <- sapply(c(alpha[1], alpha[2]),     
              function(x) uniroot(f2, c(0, 1e7), alpha = x, q = q, df1 = df1, df2 = df2)[[1]])
    
     b / (b + (df2 + 4))
    }
    
    
    m1 <- function(df2, y){              # A Utility function
      abs(abs(diff(ncp1(df2))) - y)
    }
    
    m2 <- function(df2, y){              # A Utility function
     abs(abs(diff(ncp2(df2))) - y)
    }
    
    optimize(m1, c(1, 1e7), y = .15)[[1]] # Incorrect answer: 1e+07
    
    optimize(m2, c(1, 1e7), y = .15)[[1]] # Correct answer: 336.3956
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Maurits Evers    7 年前

    ncp1

    你有 q = peta 然后传给 f1 但实际上并没有被利用,因为 pf q 作为 (peta / df1) / ((1 - peta)/df2) .

    ncp2

    你有 Q=PETA 然后传给 f2 然后反过来 酚醛树脂 .

    所以底线是你用不同的值 Q 在里面 酚醛树脂 . 如果您是活动警告,您将看到 F1 作为 NCP1 未能达到收敛。

    推荐文章