R调用deltaMethod构建边际效应数据框报错如何解决
报错原因
car::deltaMethod 单次仅支持计算单个参数组合下的估计值,你直接传入长度为111的向量Nitrogen_rate = 0:110作为表达式参数,会触发函数内部长度不匹配的报错。
另外你之前写的Delta方法表达式存在错误:你拟合的是二次回归 y = β0 + β1*N + β2*N²,施氮的边际效应是产量对施氮量的导数 dy/dN = β1 + 2*β2*N,你之前写的β1*N + β2*N²是施氮量为N时的产量预测值,不是边际效应。
正确实现代码
# 加载deltaMethod所在的car包 library(car) # 原模型拟合代码 yields<-rnorm(50, mean=2000, sd=10) nitrogen<-rnorm(50, 110, sd=5) nitrogen_square <- nitrogen^2 reg<-lm(yields~nitrogen+nitrogen_square) # 设定基础参数 Nitrogen_avg <- 110 Nitrogen_rate <- 0:110 # 计算平均施氮水平下的边际效应 avg_me <- deltaMethod(reg, "nitrogen + 2*nitrogen_square*110", vcov(reg)) avg_me_est <- avg_me$Estimate avg_me_se <- avg_me$SE # 遍历0-110所有施氮水平,逐个计算对应边际效应 rate_me_res <- lapply(Nitrogen_rate, function(n_val){ # 动态拼接当前施氮值对应的表达式 expr <- paste0("nitrogen + 2*nitrogen_square*", n_val) me_res <- deltaMethod(reg, expr, vcov(reg)) data.frame( rate_me_est = me_res$Estimate, rate_me_se = me_res$SE ) }) rate_me_df <- do.call(rbind, rate_me_res) # 组装目标数据框 result_df <- data.frame( avg_nitrogen = Nitrogen_avg, nitrogen_rate = Nitrogen_rate, me_at_avg = avg_me_est, me_at_rate = rate_me_df$rate_me_est, me_diff_vs_avg = avg_me_est - rate_me_df$rate_me_est, me_at_avg_se = avg_me_se, me_at_rate_se = rate_me_df$rate_me_se ) # 查看结果前几行 head(result_df)
如果你需要计算的是不同施氮水平下产量预测值和平均施氮水平产量的差值,而非边际效应差值,只需要把代码里
deltaMethod的表达式替换为对应产量预测公式即可,批量计算的逻辑不变。
内容的提问来源于stack exchange,提问作者Erin
相关产品推荐
相关产品推荐

