如何在R中绘制具有3个输入变量的3-D图?

时间:2018-11-15 20:01:22

标签: r plot

我正在为该函数编写对数似然曲面:

ln [Pr(Y_A = 186,Y_B = 38,Y_ {AB} = 13,Y_O = 284)] = ln(G + 186 * ln(A ^ 2 + 2 * A * O)+ 38 * ln(B ^ 2 + 2 * B * O)+ 13 * ln(2 * A * B)+ 284 * ln( O ^ 2))

受A + B + O = 1约束

A = seq(0.0001, .9999,length=50)
B = A
O = A
G = 1.129675e-06   
f = function(A,B,O){F = ifelse(A+B+O==1,
                    G+186*log(A*A+2*A*O)+38*log(B*B+2*B*O)+13*log(2*A*B)+284*log(O*O), O)}
Z <- outer(A, B, O, f)
png()
persp(A,B,Z, theta=60, phi=30 )
dev.off()

错误告诉我没有对象“ O”。

Error in get(as.character(FUN), mode = "function", envir = envir)

我的意思是在A + B + O = 1的约束下输入A,B和O,然后绘制对数似然曲面,让A:x轴,B:y轴,对数似然度:z轴。

无法摆脱“ O”,导致指令命令该函数的参数应为三维向量:A,B,O。

那我该怎么做才能改善当前代码? 如果我需要更改功能,谁能建议使用功能? (我想也许我可以使用重心坐标,但是我认为这是我最后要做的事情。)

1 个答案:

答案 0 :(得分:4)

outer函数无法正常使用。 outer接受两个数字参数XY以及一个应用了前两个参数的函数参数FUN。参见?outer。因此,根本就没有对象O。而是

中的错误消息
Z <- outer(A, B, O, f)
#Error in get(as.character(FUN), mode = "function", envir = envir) : 
#   object 'O' of mode 'function' was not found

表示未找到函数 O。确实没有这种功能。

您的f定义也有一些问题。首先,它不返回任何内容。它将结果另存为F,但从不返回。其次,即使返回了F,输出也不会总是满足您的约束。当您的约束不满足时,它仅输出O的值。最后,比较A+B+O==1是一个不好的测试,因为即使您希望由于浮点精度(试图运行TRUE)也无法将其评估为3 - 2.9 == 0.1。基于网格的评估使情况变得更糟。如果您坚持对abs(A+B+O-1) < epsilon使用三个参数,则可能应该测试f。即我本来希望像这样:

f <- function(A, B, O){
  G <- 1.129675e-06
  epsilon <- 1e-3
  ifelse(abs(A+B+O-1) < epsilon,
         G+186*log(A*A+2*A*O)+38*log(B*B+2*B*O)+13*log(2*A*B)+284*log(O*O),
         NA)
}

然后您可以执行以下操作:

dat <- expand.grid(A = A, B = B, O = O) # All combinations of A, B, O
dat$Z <- f(dat$A, dat$B, dat$O) # Apply function
head(dat)
#           A     B     O  Z
#1 0.00010000 1e-04 1e-04 NA
#2 0.02050408 1e-04 1e-04 NA
#3 0.04090816 1e-04 1e-04 NA
#4 0.06131224 1e-04 1e-04 NA
#5 0.08171633 1e-04 1e-04 NA
#6 0.10212041 1e-04 1e-04 NA

但是我不明白您是如何从中得出Z作为A和B的函数的。您需要进行子集删除NA,这似乎在计算上非常浪费。另请注意,any(dat$A + dat$B + dat$O == 1)返回FALSE,因此,原始约束测试确实在该网格上始终失败。

话虽如此,为什么不使用函数中的约束来确定给定OA的{​​{1}}?

B

enter image description here

看起来不错吗?至少打算这样使用A <- seq(0.0001, .9999,length=50) B <- A f <- function(A, B){ G <- 1.129675e-06 O <- 1 - A - B out <- G+186*log(A*A+2*A*O)+38*log(B*B+2*B*O)+13*log(2*A*B)+284*log(O*O) return(out) } Z <- outer(A, B, f) #Warning messages: #1: In log(A * A + 2 * A * O) : NaNs produced #2: In log(B * B + 2 * B * O) : NaNs produced Z[is.infinite(Z)] <- NA persp(A, B, Z, theta=60, phi=30, zlim = range(Z, na.rm = TRUE)) persp

当然,您可以修改outer,以避免出现警告消息。请记住,f需要向量化。