首页 > 解决方案 > 通过在 R 中设置标准来查找输出?

问题描述

对于一组输入(见下文),当我运行以下 R 代码时,我得到两个存储在ncp. ncp现在假设我希望(ie, 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]])    

标签: rfunctionmathlinear-algebraalgebra

解决方案


由于您将其余所有内容保持不变,因此我们可以编写一个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 将给我们 ncp 与上述 alpha 和 q 值的绝对差为 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 值的最小绝对差异。IE

m(Inf)
[1] 0.7156824

所以我们不能有 0.4 的绝对差,但是如果我们改变 alpha 和 q,我们会得到 0.4 的绝对差

对于所有y这样的值m(Inf)<y<m(1),我们将得到一个满足条件的df


推荐阅读