对于一组输入(请参见下文),当我运行以下R代码时,我得到了存储在abcdee
中的两个答案。现在假设我希望ncp
(即ncp
)中两个答案之间的差为abs(ncp[2] - ncp[1])
。
在这种情况下,是否可以代替求解最小的1.4
(当前输入中是df
)?
df
答案 0 :(得分:1)
由于您将所有其余部分都设为常数,因此我们可以编写一个函数ncp
,该函数只接受参数df
ncp=function(df){
sapply(c(alpha[1], alpha[2]), # Root finding
function(x) uniroot(f, c(-q, q+15), alpha = x, q = q, df = df)[[1]]/sqrt(30))
}
ncp(29)
[1] 0.1592547 0.9280011
之后,您可以编写一个函数,该函数采用ncp值的绝对差,我们将减去
m=function(df,y=0){
abs(abs(diff(ncp(df)))-y)
}
简而言之,m(df,0)
给出了与零相比的绝对差。而m(df,0.4)
将是ncp值的绝对差-0.4。我们的目标是使该绝对值差和y最小。我会详细说明。
使用相应的y值最小化m函数:
例如,让我们尝试找到一个df
,其中所有其余部分(alpha和q)保持恒定,以使ncp值的绝对差为1:
(a=optimise(m,c(1,100000),y=1))#default for minimization ie maximum=FALSE
$`minimum`
[1] 4.415955
$objective
[1] 3.798379e-08
目标值为0,因此自最小化以来我们确实找到了正确的df值。
ncp(a$minimum)
[1] 0.03385211 1.03385215
从上面的ncp值中,yu可以知道两个值之间的差确实是1。因此df = 4.415955将为我们提供上述alpha和q值的ncp绝对差为1
b=ncp(a$minimum)
abs(b[2]-b[1])
[1] 1
所以我也可以这样做:
m(a$minimum)
[1] 1
我倾向于认为现在很清楚y代表m
的含义。
现在找到0.4的差,我们就做同样的事情:
optimise(m,c(1,1000000),y=0.4,maximum = F)
$`minimum`
[1] 1e+06
$objective
[1] 0.315684
关于这一点,我们看到目标值不为零,因此我们没有收敛。即使我们要扩大范围,目标也不会改变。这意味着最小的差是objective(0.315684) +0.4 =0.715684
。这是具有此alpha和q的ncp值的最小绝对差。即
m(Inf)
[1] 0.7156824
所以我们不能有0.4的绝对差,但是如果改变alpha和q,我们的绝对差将是0.4
对于y
这样的m(Inf)<y<m(1)
的所有值,我们都会得到一个满足条件的df