R中模型公式含log(x)时调用predict()应传原始x还是log(x)?
写法2是正确的,调用predict()时应当传入原始carat值,不需要提前做log转换。
核心原因
R的lm模型对象会完整保存拟合时传入的公式定义,包括公式中对变量的所有转换规则。你的模型公式为log(price) ~ log(carat),相当于已经明确告诉模型:
- 响应变量需要对原始
price列做log转换后参与拟合 - 预测变量需要对原始
carat列做log转换后参与拟合
调用predict()时,只要传入的新数据列名和训练数据的原始列名(这里是carat)完全匹配,模型会自动套用公式里的转换逻辑,对传入的原始carat值做log计算再代入模型方程,不需要手动提前转换。
你可以做个简单验证:取训练集中
carat = 1的样本,传入carat=1得到的预测值,和手动计算coef(log_log_model)[1] + coef(log_log_model)[2]*log(1)的结果完全一致;如果传入carat=log(1)=0,模型会计算coef(log_log_model)[1] + coef(log_log_model)[2]*log(0),直接得到无意义的负无穷结果,就能验证传值逻辑的对错。
写法1的错误点
如果你提前把3做log转换,传入carat = log(3),模型会把这个传入值当成原始的carat取值,再自动执行一次公式里的log转换,最终代入模型的预测变量实际变成了log(log(3)),相当于做了两次对数转换,预测结果会完全偏离正确值。
补充说明
两个写法里最后用exp()把预测结果从log(price)尺度转回原始price尺度的操作是正确的,因为模型拟合的是log转换后的响应变量,直接输出的预测值是对数尺度下的结果,需要反变换回原始尺度。
内容的提问来源于stack exchange,提问作者A1122

