You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从lm对象计算变量临界点:解决ceoten最大化log(salary)报错问题

解答

(1) 报错原因

你的model2包含多个自变量:log(sales)、comten、ceoten及ceoten的平方项。mosaic::makeFun()生成的函数需要所有自变量的取值才能计算预测值,但调用optimize时仅指定了ceoten的区间,未给log(sales)、comten传入固定值,函数无法确定这些变量的取值来计算log(salary),因此抛出参数缺失的报错。

而第一个示例的模型仅包含study_hours一个自变量(含平方项),生成的函数只需这一个变量的值,因此optimize可正常运行。

(2) 替代方法

方法1:固定其他自变量取值(如均值)后求最优ceoten

先计算其他自变量的均值,在生成的函数中固定这些值后再调用optimize:

library(mosaic)

# 计算其他自变量的均值
mean_log_sales <- mean(log(ceosalary$sales), na.rm = TRUE)
mean_comten <- mean(ceosalary$comten, na.rm = TRUE)

# 生成模型函数并固定其他参数
model_fun <- mosaic::makeFun(model2)
optimize(
  f = function(x) model_fun(log(sales) = mean_log_sales, comten = mean_comten, ceoten = x),
  interval = range(ceosalary$ceoten, na.rm = TRUE),
  maximum = TRUE
)

方法2:利用二次函数解析解直接计算

模型中ceoten的项是二次形式(β1*ceoten + β2*ceoten²),对于二次函数y = a*x² + b*x + c,极值点为x = -b/(2a),直接提取系数计算即可:

# 提取模型中ceoten相关项的系数
coefs <- coef(model2)
b <- coefs["ceoten"]
a <- coefs["I(ceoten^2)"]

# 计算最优ceoten值
optimal_ceoten <- -b/(2*a)
optimal_ceoten

注:该结果对应其他自变量取均值时的最优值,和方法1结果一致;若需其他自变量取特定值,优先选择方法1。


内容的提问来源于stack exchange,提问作者J.K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:55:57