我正在将某些回归任务从SAS转换为R.这些是针对时间序列横截面销售数据集运行的花园品种享乐价格回归。作为典型示例,请考虑名为销售的数据集,其中包括字段ParcelID,SaleYear,SalePrice以及一组属性特征Bdrms,Baths等(ParcelID,SaleYear)是表的关键字,以及假设它已被成功读入R数据帧。
我想用一系列年度假人来增加销售,例如d2000,d2001,... d2014基于SaleYear的值。在SAS / SQL中,我使用包含带有for循环的宏的select *语句来执行此操作,该循环使用case语句创建并命名每个虚拟对象。这会产生一个包含所需假人的新数据集。
显然R可以使用factor()和model.matrix()来更优雅地执行此操作,并且无疑还有很多其他方法。我的问题是,在我的R职业生涯的这个阶段,我无法使针对stackoverflow发布的类似问题的解决方案适应我的特定问题。
此外,我们的命名约定要求所有虚拟变量名称的格式为d _ *。
然后就是在回归调用中指定虚拟对象的问题。 SAS中的Proc reg允许以缩写形式(编号范围列表)在模型语句中指定具有整数后缀的索引系列的解释变量,例如, d_2000-d_2002而不是d_2000 d_2001 d_2002。我相信在R的lm()设施中有一个很好的方法可以做到这一点。但是,我不想只包括与SaleYear中所有不同值相对应的虚拟对象,而不是由R选择的参考类别。模型变体使用不同的年份进行开发和测试,因此我希望能够方便地指定范围每年的假人被包括在内。
非常感谢提前。我意识到这些是相当天真的问题,但我希望能够通过更多的R练习和一些建议来回答这些问题。互动变量将成为下一个挑战。
再次感谢。
答案 0 :(得分:2)
以下是使用ggplot2中创建economics
个虚拟对象的year
数据集的示例:
library(ggplot2)
head(economics)
str(economics)
# convert date to a year and make that a factor
year <- factor(as.POSIXlt(economics$date)$year + 1900)
lm(unemploy ~ pop + year - 1, economics)
如果您希望拦截并且有一年的时间,则忽略-1
。
答案 1 :(得分:0)
除了G.G的优雅方法外,还有其他方法可以处理范围。您可以使用paste
或sprintf
来构建名称或grep
或match
,所有这些选项在&#34; [&#34;调用以限制传递给data参数的列。在提供更具体的例子之后,可以得到更完整的答案。
paste0("d_20", sprintf("%02s", 0:12))
[1] "d_2000" "d_2001" "d_2002" "d_2003" "d_2004" "d_2005" "d_2006" "d_2007" "d_2008" "d_2009"
[11] "d_2010" "d_2011" "d_2012"