我使用R中的effects
包来生成效果很好的图。当我的模型中的一个预测变量是一个因子时,该图使用因子标签作为轴刻度标签。在某些情况下,这并不理想,因为可以缩短因子名称以便于在Anova显示器中键入和查看,但我想要一个更易读的标签。
我尝试将transform.x
参数用于plot
,但文档说这只适用于“数字预测器”,实际上它似乎不起作用(对显示没有影响)标签)。
我特别不想更改因子级别名称本身(即更改数据),因为我还有其他理由希望它们成为现实。我只想影响情节显示,而不是模型本身。
我想要的是能够指定预测变量的因子水平与字符串之间的映射,以用作这些因子水平的轴刻度标签。我怎样才能做到这一点?
这是一个简单的例子:
library(effects)
A = rnorm(100)
B = rnorm(100)
C = factor(rep(c("This", "That"), 50))
model = lm(A~B*C)
plot(effect("B:C", model), x.var="C")
产生这个情节:
effect plot http://snag.gy/5mTkJ.jpg
我希望能够将x轴刻度标签“This”和“That”更改为我想要的任何内容,而无需更改向量C中的实际因子级别名称。
答案 0 :(得分:3)
不幸的是,没有直接的方法。看看绘图功能:getAnywhere("plot.eff")
。
这是一种解决方法:
首先创建效果对象:
ef <- effect("B:C", model)
修改C
中ef
的级别:
ef$variables$C$levels <- c("foo", "bar")
levels(ef$x$C) <- c("foo", "bar")
简介:
plot(ef, x.var = "C")
答案 1 :(得分:1)
这不是答案,而是解释为什么在不改变因子水平的情况下更改轴标签很困难。
您可以看到eff
个对象(类eff
)的S3方法图。
获取eff
类型对象的代码源绘图函数
你可以这样做:
getS3method('plot','eff')
情节基本上是xyplot
(格子散点图)。
相关部分是:
levs <- levels(x[, 1])
plot <- xyplot(....,scales = list(x = list(at = 1:length(levs),
labels = levs, rot = rotx),..)
标签被硬编码为因子的级别。
希望这个功能可以通过这样的东西轻松增强(也许你可以联系包维护者)
levs <- arg.levels ## new levels arguments given as an argument
if(is.null(levs))
levs <- levels(x[, 1])
问题是xyplot
有很多次调用,所以你必须多次更改scale参数......