通过在 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
对于一组输入(见下文),当我运行以下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)
,我们将得到满足条件