R语言生成n容量样本后如何对x每行执行optimise得到1000个结果
问题原因
你的代码仅返回1个优化结果,是因为optimise调用的似然函数直接对整个矩阵x的所有元素计算对数似然和,全局只做了1次优化,没有按单个样本拆分计算。
另外注意replicate(1000, rpois(n, 10))默认生成n行1000列的矩阵,每一列对应1个容量为n的独立泊松样本,如果你需要按行处理,调整遍历维度即可。
解决代码
方案1:按列遍历(匹配replicate默认输出结构,得到1000个样本的优化结果)
f2d <- function(n){ # 生成1000个容量为n的泊松样本,每列为1个样本 x <- replicate(1000, rpois(n, 10)) # 对每一列单独执行极大似然估计 res_list <- apply( X = x, MARGIN = 2, # 2表示按列遍历,需按行遍历则改为1 FUN = function(single_sample){ optimise( f = function(theta){ sum(dpois(single_sample, theta, log = TRUE)) }, interval = c(0,50), maximum = TRUE ) } ) return(res_list) } # 调用示例,n为单个样本的容量 optim_res <- f2d(n = 15)
返回的optim_res是长度为1000的列表,每个元素对应一个样本的optimise输出,包含maximum(最优参数值)和objective(最大对数似然值)两个字段。
如果需要把结果转为数据框方便后续分析,可以追加如下代码:
res_df <- do.call(rbind.data.frame, optim_res)
方案2:按行遍历
如果你明确需要对矩阵的每一行做优化,只需把apply的MARGIN参数改为1即可。如果要得到1000个结果,确保矩阵有1000行,生成矩阵时可做转置处理:
x <- t(replicate(1000, rpois(n, 10))) # 转置后为1000行n列,每行为1个样本
结果验证
泊松分布参数的极大似然估计解析解就是样本均值,你可以对比每个样本的均值和optimise返回的maximum值,二者几乎完全一致,可用于验证代码正确性。
内容的提问来源于stack exchange,提问作者Monj
相关产品推荐
相关产品推荐

