在uniroot()中确保间隔?

时间:2018-06-20 01:17:33

标签: r function optimization solver

我想知道当uniroot()介于q0之间时我是否可以使2工作?

当前,uniroot()仅适用于q > = 3

PsS 。我更改了间隔限制,并在extendInt = "downX"中使用了uniroot(),但都无效。

这是我的R代码:

f <- function(x, alpha = .05, q = 2, df1 = 3, df2 = 108){
 alpha - suppressWarnings(pf(q, df1, df2, x, lower.tail = FALSE))
}

curve(f)

sapply(c(.05, .95), 
function(i) uniroot(f, interval = c(0, 2e2), alpha = i, q = 2, df1 = 3, df2 = 108)[[1]])

1 个答案:

答案 0 :(得分:0)

您的问题是,对于您指定的值(alpha = 0.05,q = 2,df1 = 3,df2 = 108),累积分布函数似乎无法达到您希望的任何值非中心参数(您的x)。

f <- function(x, alpha = .05, q = 2, df1 = 3, df2 = 108){
  alpha - suppressWarnings(pf(q, df1, df2, x, 
                              lower.tail = FALSE))
}

通过查看曲线,您可以最轻松地看到这一点:

png("c1.png")
curve(f(x,alpha=0.05,q=2,df1=3,df2=108),
      from=1e-8,to=2e2,log="x")
dev.off()

enter image description here

(曲线从x=0开始为负值,然后逐渐减小...)

蛮力探索变化的alpha,ncp,q ...

library(ggplot2)
dd <- expand.grid(alpha=seq(0.025,0.975,by=0.025),
                  q=seq(2,4.75,by=0.25),
                  x=emdbook::lseq(1e-2,2e2,length.out=51))
dd$z <- c(plyr::aaply(dd,1,
            function(z) with(z,f(alpha=alpha,q=q,x=x))))
ggplot(dd,aes(x,alpha,z=z))+geom_raster(aes(fill=z))+
  facet_wrap(~q,labeller=label_both)+
  scale_x_log10(expand=c(0,0))+
  scale_y_continuous(expand=c(0,0))+
  geom_contour(breaks=0,colour="red")+
  geom_hline(yintercept=c(0.05,0.95),
             colour="magenta",lty=2)
ggsave("c2.png")

红色曲线是零等高线:水平虚线是您要沿着其寻找根的横断面。您可以看到,对于低q来说,样线不会与轮廓相交。

从统计意义上讲,这不是我所想的...

enter image description here