通过在 R 中设置条件来查找输出?

Finding the output by setting a criteria in R?

对于一组输入(见下文),当我运行以下R代码时,我得到两个答案存储在ncp中。现在假设我希望 ncp(即 abs(ncp[2] - ncp[1]))中的两个答案之间的差异为 1.4

在这种情况下,是否可以改为求解尽可能小的 df(目前 df 在输入中)?

alpha = c(.025, .975);  df = 29;  q = 3   # The input

f <- function(ncp, alpha, q, df){     # Notice `ncp` is the unknown
 alpha - suppressWarnings(pt(q, df, ncp, lower.tail = FALSE)) # The function
 }

ncp <- sapply(c(alpha[1], alpha[2]),     # Root finding: finds `ncp`
     function(x) uniroot(f, c(-q, q+15), alpha = x, q = q, df = df)[[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

objective 值为 0,所以我们确实找到了正确的 df 值,因为我们正在最小化。

ncp(a$minimum)
[1] 0.03385211 1.03385215

从上面的 ncp 值,yu 可以看出这两个值之间的差异确实是 1。因此 df=4.415955 将给我们 ncp 绝对差异 1 与上述 alpha 和 q 值

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,所以没有收敛。即使我们要增加范围,objective 也不会改变。这意味着最小的差异是 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