如何在SAS中绘制含对数关系的价格-克拉曲线及95%置信区间
解决SAS中绘制对数回归曲线及95%置信区间的问题
首先,先明确两个关键点:一是你提到要对price和carat都取对数,但当前代码里的模型只对price做了对数转换(通过link=log),没处理carat,这可能和你预期的对数-对数模型不符;二是effectplot里的moff参数是问题根源——它用于关闭模型偏移项,而你的模型没有偏移项,反而会阻止置信区间的计算。下面给你两种可行的解决方案:
方法1:调整proc genmod代码直接生成图形
这种方法最直接,只需要修正模型设定并调整effectplot参数即可:
/* 先创建两个变量的对数变换版本(满足你对二者取对数的需求) */ data diamonds; set diamonds; log_carat = log(Carat); /* 对克拉取对数 */ run; /* 拟合对数链接的模型并绘制带置信区间的曲线 */ proc genmod data=diamonds; /* 注意:如果Price是连续型金额数据,用dist=normal更合适;如果是计数型数据保留dist=poisson */ model Price = log_carat / dist=normal link=log; /* 去掉moff参数,用fit指定拟合曲线,clm开启均值的95%置信区间 */ effectplot fit(x=log_carat) / clm; run;
如果想直接用原始Carat做x轴(而不是对数后的log_carat),可以把x=log_carat换成x=Carat,SAS会自动根据模型映射到对数后的取值计算拟合值。
方法2:先预测再用proc sgplot绘图(更灵活)
如果你需要自定义图形样式(比如散点颜色、置信区间填充透明度等),先通过模型生成预测值和置信区间,再用proc sgplot绘制会更可控:
/* 步骤1:拟合对数-对数线性模型 */ proc reg data=diamonds; model log(Price) = log(Carat); /* 直接在模型里做对数变换,省去创建新变量的步骤 */ /* 输出预测的log(Price)及其95%置信区间 */ output out=pred_results p=pred_log_price lcl=lcl_log ucl=ucl_log; run; /* 步骤2:将对数转换的预测值/置信区间转回原始价格尺度 */ data pred_results; set pred_results; pred_price = exp(pred_log_price); lower_ci = exp(lcl_log); upper_ci = exp(ucl_log); run; /* 步骤3:绘制散点图+拟合曲线+置信区间带 */ proc sgplot data=diamonds; /* 原始数据散点 */ scatter x=Carat y=Price / markerattrs=(color=blue size=2); /* 对数拟合曲线 */ series x=Carat y=pred_price / data=pred_results lineattrs=(color=red thickness=2); /* 95%置信区间带,设置半透明填充 */ band x=Carat lower=lower_ci upper=upper_ci / data=pred_results fillattrs=(color=lightgray) filltransparency=0.7; run;
这种方法的优势在于你可以完全自定义图形的各个元素,比如调整线条粗细、填充颜色、散点样式等,适合需要做可视化优化的场景。
额外提示
- 如果你的
Price是连续型数值(比如钻石的价格是金额),用proc reg拟合线性模型(对数变换后)比proc genmod的poisson模型更合适,因为poisson分布适用于计数类数据。 - 若坚持用
proc genmod的poisson模型,确保你的Price是整数计数数据,否则模型假设可能不成立。
内容的提问来源于stack exchange,提问作者Mitch Pudil
相关产品推荐
相关产品推荐

