我正在为该函数编写对数似然曲面:
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。
那我该怎么做才能改善当前代码? 如果我需要更改功能,谁能建议使用功能? (我想也许我可以使用重心坐标,但是我认为这是我最后要做的事情。)
答案 0 :(得分:4)
outer
函数无法正常使用。 outer
接受两个数字参数X
和Y
以及一个应用了前两个参数的函数参数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
,因此,原始约束测试确实在该网格上始终失败。
话虽如此,为什么不使用函数中的约束来确定给定O
和A
的{{1}}?
B
看起来不错吗?至少打算这样使用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
需要向量化。