如何在云图(使用R语言)中更改点的形状并添加回归线?

14

为了明确我的问题,我创建了一个简单的示例。第一步是创建一些数据:

gender <- factor(rep(c(1, 2), c(43, 41)), levels = c(1, 2),labels = c("male", "female"))
numberofdrugs <- rpois(84, 50) + 1
geneticvalue <- rpois(84,75)
death <- rpois(42,50) + 15
y <- data.frame(death, numberofdrugs, geneticvalue, gender)

这些是一些随机日期合并到一个data.frame中。从这些日期中,我想绘制一个云图,在这个图中我可以区分男性和女性,并且添加两个简单的回归线(一个用于女性,一个用于男性)。所以我已经开始了,但是我还没有达到我想要的点。请看下面我已经完成的部分:

require(lattice)
cloud(y$death~y$numberofdrugs*geneticvalue)

基本形式的云图

xmale <- subset(y, gender=="male")
xfemale <- subset(y, gender=="female")

death.lm.male <- lm(death~numberofdrugs+geneticvalue, data=xmale)
death.lm.female <- lm(death~numberofdrugs+geneticvalue, data=xfemale)

如何在使用云图命令时为男性和女性创建不同的点(例如,蓝色和粉色点而不是仅使用蓝色十字)?如何将两个估计模型添加到云图中?

非常感谢你的建议!谢谢你的想法!

2个回答

18

回答你问题的前半部分,“当使用云命令时如何为男性或女性制作不同的点(例如,蓝色和粉色点而不仅是蓝色十字)?”

 cloud( death ~ numberofdrugs*geneticvalue , groups=gender, data=y )

grouped cloud plot

可能的元答案可能涉及一些非3D可视化。也许您可以使用lattice或ggplot2将数据分成小多个部分?这可能会更易于理解,而且很可能更容易添加回归结果。

splom( ~ data.frame( death, numberofdrugs, geneticvalue ), groups=gender, data=y )

splom

默认的splom面板函数是panel.pairs,你可以很容易地修改它来添加回归线而不会遇到太大的麻烦。

ggplot2可以轻松地在绘图矩阵中进行回归,但我无法使颜色起作用。

pm <- plotmatrix( y[ , 1:3], mapping = aes(color=death) )
pm + geom_smooth(method="lm")

plotmatrix

最后,如果你真的想用回归平面来做云图,这里有一种使用scatterplot3d包的方法。请注意,我更改了数据以使其具有更有趣的结构:

numberofdrugs <- rpois( 84, 50 ) + 1
geneticvalue <- numberofdrugs + rpois( 84, 75 )
death <- geneticvalue + rpois( 42, 50 ) + 15
y <- data.frame( death, numberofdrugs, geneticvalue, gender )

library(scatterplot3d) 
pts <- as.numeric( as.factor(y$gender) ) + 4
s <-scatterplot3d( y$death, y$numberofdrugs, y$geneticvalue, pch=pts, type="p", highlight.3d=TRUE )
fit <- lm( y$death ~ y$numberofdrugs + y$geneticvalue )
s$plane3d(fit)

带有回归平面的scatterplot3d


到目前为止感谢gsk3!顺便问一下:您知道如何更改点的颜色吗? - MarkDollar
我喜欢你的回答gsk3,但我仍然对将回归(男性和女性各一个)可视化到云图中感兴趣。 - MarkDollar
我不确定它是否默认支持。请查看云图的面板函数,并尝试将其组合在一起:http://stat.ethz.ch/R-manual/R-devel/library/lattice/html/panel.cloud.html 或许可以使用覆盖的 panel.3dscatter 和 panel.3dwire 面板函数? - Ari B. Friedman
嗯,我不知道为什么它不能工作...很遗憾 :( 我会设置一个赏金,如果你能向我展示如何使其工作,我会给你100个积分!至少我只想知道如何将一个线性回归(应该是一个估计层)添加到云图中! - MarkDollar
我认为使用scatterplot3d,我找到了一个可行的解决方案。在"type"参数中有一些有趣的选项可以玩耍。 - Ari B. Friedman
很高兴能够帮忙。考虑在3D图形旁边使用splom/plotmatrix类型的想法之一。小多面板非常强大(请参见Tufte或Gelman),而3D图形很漂亮,但更难得出具体结论。因此,也许两者并排使用会是一个很好的补充。 - Ari B. Friedman

17

car包中使用rgl包(openGL实现)有一个漂亮的适合可视化:

require(car)
require(rgl)
scatter3d(death~numberofdrugs+geneticvalue, groups=y$gender, data=y, parallel=FALSE)

使用car包进行3D拟合


2
这是个好点子。我希望函数名称能在某种程度上提供更多关于它们正在做什么的信息。比如scatter3d、scatterplot3d和cloudplot,它们一个也没有给你任何关于所属包以及为什么与其他函数不同的线索。 - Ari B. Friedman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接