求解R函数的输入值

问题描述

在我附加的R函数中,我想知道如何求解mdes(假设它是未知的),如果其他所有已知的情况,该值当前是输入值之一?

如果其他所有已知的知识,是否还可以求解mdespower(均为当前输入值)?

foo <- function(A = 200,As = 15,B = 100,Bs = 10,iccmax = 0.15,mdes = .25,SD = 1.2,power = 80)
{
  tail <- 2
  alpha <- 5
  inv_d <- function(mdes) {
    c(mean_dif = 1,Vmax = 2/mdes^2)
  }
  SDr <- 1/SD
  pars <- inv_d(mdes)
  mean_dif <- pars[[1]]
  Vmax <- pars[[2]]
  zbeta <- qnorm((power/100))
  zalpha <- qnorm(1-(alpha/(100*tail)))
  maxvarmean_difhat <- (mean_dif / (zbeta + zalpha))**2
  ntreat <- sqrt((A/As)*((1-iccmax)/iccmax))
  ncont <- sqrt((B/Bs)*((1-iccmax)/iccmax))
  costpertreatcluster <- A + (As*ntreat)
  costperconcluster <- B + (Bs*ncont)
  gtreat <- (sqrt(A*iccmax) + sqrt(As*(1-iccmax)))**2
  gcon <- (sqrt(B*iccmax) + sqrt(Bs*(1-iccmax)))**2
  pratio <- sqrt(gtreat/gcon)
  budgetratio <- 99999
  budgetratio <- ifelse( ((pratio <= SD) & (pratio >= SDr)),pratio**2,ifelse((pratio > SD),pratio*SD,pratio*SDr))
  fraction <- budgetratio/(1 + budgetratio)
  mmvnumer <- 99999
  mmvnumer <- ifelse( ((pratio <= SD) & (pratio >= SDr)),gcon*Vmax*(1+(pratio**2)),gcon*Vmax*(((pratio*SD)+1)**2/((SD**2)+1)),gcon*Vmax*(((pratio*SDr)+1)**2/((SDr**2) + 1))) )
  budget <- mmvnumer/maxvarmean_difhat
  treatbudget <- fraction*budget
  conbudget <- (1-fraction)*budget
  ktreat <- treatbudget/costpertreatcluster
  kcont <- conbudget/costperconcluster
  ktreatrup <- ceiling(ktreat)
  kcontrup <- ceiling(kcont)
  ktreatplus <- ifelse(pmin(ktreatrup,kcontrup) < 8,ktreatrup + 3,ktreatrup + 2)
  kcontplus <- ifelse(pmin(ktreatrup,kcontrup + 3,kcontrup + 2)
  budgetplus <- (ktreatplus*costpertreatcluster) + (kcontplus*costperconcluster)
  
  return(c(ncont = ncont,kcont = kcontplus,ntreat = ntreat,ktreat = ktreatplus,budget = budgetplus))
}
#--------------------------------------------------------------------------------
# EXAMPLE OF USE:
foo()

       ncont        kcont       ntreat       ktreat       budget 
    7.527727    73.000000     8.692270    62.000000 33279.051347

解决方法

将一个变量的函数定义为

p0 = foo()
fn1 = function(x) sum((foo(mdes=x) - p0)^2)

并找到最小值0,该最小值对应于您的mdes = 0.25输入!

optimize(fn1,c(0.0,1.0))
## $minimum
## [1] 0.2497695
## $objective
## [1] 0

对于两个变量,这更加困难,因为该函数具有许多局部最小值,并且在某些区域之外定义不明确。应用optim()将需要精心选择的起点。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...