Non-Linear Minimization (nlm) in R with error: incorrect number of dimensions
Non-Linear Minimization (nlm) in R with error: incorrect number of dimensions
我有这段代码可以计算负二项分布,
参数:
ce <- c(0, 1, 2, 3, 4, 5)
ce <- as.integer(ce)
comp <- c(257, 155, 64, 17, 5, 2)
comp <- as.integer(comp)
data.cells <- data.frame(ce, comp)
params <- c(5, 1.5) # vector of 2 params, x and κ.
dat <- data.cells
以及函数:
negbinll <- function(dat,params) {
if (missing(dat)||missing(params)) {
print('Plese add values for the model')
} else if (params[1]<0||params[2]<0) {
print('Plese make sure your parameters are >0')
} else {
p <- params[1]/(params[1]+params[2])
N <- params[1] + dat[,1] - 1
log.l <- sum(dat[2]*dnbinom(dat[,1], size = N, prob = p, log = TRUE))
return(log.l)
}
}
现在,这段代码的结果是
> negbinll(dat, params)
[1] -591.024
下一步是使用nlm
(非线性最小化)找到x和κ的最大似然估计,假设params = (x,κ)
nlm(negbinll, dat, p = params)
Error in dat[, 1] : incorrect number of dimensions
但是,如果我将初始函数中的 dat[1] 更改为 dat[1],则会出现错误:
数学函数的非数字参数
有什么建议吗?谢谢
dat
和 params
值在 negbinll
函数中不正确匹配。要调试它,请将 browser()
放入 negbinll
函数并调用 nlm
行代码。在调试模式下,您可以打印 dat
和 params
的值并查看它们是否正确匹配。
注意:调试后,从negbinll
函数中删除browser()
命令
negbinll <- function(dat,params) {
browser()
if (missing(dat)||missing(params)) {
print('Plese add values for the model')
} else if (params[1]<0||params[2]<0) {
print('Plese make sure your parameters are >0')
} else {
p <- params[1]/(params[1]+params[2])
N <- params[1] + dat[,1] - 1
log.l <- sum( dat[2] *dnbinom(dat[,1], size = N, prob = p, log = TRUE))
return(log.l)
}
}
Browse[2]> params
# ce comp
# 1 0 257
# 2 1 155
# 3 2 64
# 4 3 17
# 5 4 5
# 6 5 2
Browse[2]> dat
# [1] 5.0 1.5
我有这段代码可以计算负二项分布, 参数:
ce <- c(0, 1, 2, 3, 4, 5)
ce <- as.integer(ce)
comp <- c(257, 155, 64, 17, 5, 2)
comp <- as.integer(comp)
data.cells <- data.frame(ce, comp)
params <- c(5, 1.5) # vector of 2 params, x and κ.
dat <- data.cells
以及函数:
negbinll <- function(dat,params) {
if (missing(dat)||missing(params)) {
print('Plese add values for the model')
} else if (params[1]<0||params[2]<0) {
print('Plese make sure your parameters are >0')
} else {
p <- params[1]/(params[1]+params[2])
N <- params[1] + dat[,1] - 1
log.l <- sum(dat[2]*dnbinom(dat[,1], size = N, prob = p, log = TRUE))
return(log.l)
}
}
现在,这段代码的结果是
> negbinll(dat, params)
[1] -591.024
下一步是使用nlm
(非线性最小化)找到x和κ的最大似然估计,假设params = (x,κ)
nlm(negbinll, dat, p = params)
Error in dat[, 1] : incorrect number of dimensions
但是,如果我将初始函数中的 dat[1] 更改为 dat[1],则会出现错误: 数学函数的非数字参数
有什么建议吗?谢谢
dat
和 params
值在 negbinll
函数中不正确匹配。要调试它,请将 browser()
放入 negbinll
函数并调用 nlm
行代码。在调试模式下,您可以打印 dat
和 params
的值并查看它们是否正确匹配。
注意:调试后,从negbinll
函数中删除browser()
命令
negbinll <- function(dat,params) {
browser()
if (missing(dat)||missing(params)) {
print('Plese add values for the model')
} else if (params[1]<0||params[2]<0) {
print('Plese make sure your parameters are >0')
} else {
p <- params[1]/(params[1]+params[2])
N <- params[1] + dat[,1] - 1
log.l <- sum( dat[2] *dnbinom(dat[,1], size = N, prob = p, log = TRUE))
return(log.l)
}
}
Browse[2]> params
# ce comp
# 1 0 257
# 2 1 155
# 3 2 64
# 4 3 17
# 5 4 5
# 6 5 2
Browse[2]> dat
# [1] 5.0 1.5