R:具有多个条件和分类曲面图的公式
R: Formula with multiple Conditions and Categorized Surface Plot
我想在 R 中为线性回归模型制作 3D 图:我想显示线性模型的回归平面的表面。
我有 2 个连续变量(比如 AGE、HEIGHT)和 2 个因素(SEX、ALLERGIC)。我想显示 LM w.r.t 的预测值。以每个因素的指定水平为条件的 2 个连续变量,例如
ILLNESS = AGE|{SEX==MALE + ALLERGIC==YES} + HEIGHT|{SEX==MALE + ALLERGIC==YES} +
AGE|{SEX==MALE + ALLERGIC==YES}*HEIGHT|{SEX==MALE + ALLERGIC==YES}
这是我想到的结果:
第一个问题:有没有什么很酷的功能,可以很简单的做到这一点?
第二个问题:如果没有,我如何编写公式,我可以在其中以 >1 因子水平为条件?
首先,让我们制作一些样本输入数据来进行测试。
set.seed(15)
dd <- data.frame(
sex = sample(c("M","F"), 200, replace=T),
allergic = sample(c("YES","NO"), 200, replace=T),
age = runif(200, 18,65),
height = rnorm(200, 6, 2)
)
expit <- function(x) exp(x)/(exp(x)+1)
dd <- transform(dd,
illness=expit(-1+(sex=="M")*.8-0.025*age*ifelse(sex=="M",-1,1)+.16*height*ifelse(allergic=="YES",-1,1)+rnorm(200))>.5
)
现在我们定义要预测的一组值
gg<-expand.grid(sex=c("M","F"), allergic=c("YES","NO"))
vv<-expand.grid(age=18:65, height=3:9)
然后我们拟合模型,并使用预测函数计算我们希望绘制的表面上每个点的响应。
mm <- glm(illness~sex+allergic+age+height, dd, family=binomial)
pd<-do.call(rbind, Map(function(sex, allergic) {
nd <- cbind(vv, sex=sex, allergic=allergic)
cbind(nd, pred=predict(mm, nd, type="response"))
}, sex=gg$sex, allergic=gg$allergic))
最后,我们可以使用lattice来绘制数据
library(lattice)
wireframe(pred~age+height|sex+allergic, pd, drape=TRUE)
这给了我们
我想在 R 中为线性回归模型制作 3D 图:我想显示线性模型的回归平面的表面。 我有 2 个连续变量(比如 AGE、HEIGHT)和 2 个因素(SEX、ALLERGIC)。我想显示 LM w.r.t 的预测值。以每个因素的指定水平为条件的 2 个连续变量,例如
ILLNESS = AGE|{SEX==MALE + ALLERGIC==YES} + HEIGHT|{SEX==MALE + ALLERGIC==YES} +
AGE|{SEX==MALE + ALLERGIC==YES}*HEIGHT|{SEX==MALE + ALLERGIC==YES}
这是我想到的结果:
第一个问题:有没有什么很酷的功能,可以很简单的做到这一点?
第二个问题:如果没有,我如何编写公式,我可以在其中以 >1 因子水平为条件?
首先,让我们制作一些样本输入数据来进行测试。
set.seed(15)
dd <- data.frame(
sex = sample(c("M","F"), 200, replace=T),
allergic = sample(c("YES","NO"), 200, replace=T),
age = runif(200, 18,65),
height = rnorm(200, 6, 2)
)
expit <- function(x) exp(x)/(exp(x)+1)
dd <- transform(dd,
illness=expit(-1+(sex=="M")*.8-0.025*age*ifelse(sex=="M",-1,1)+.16*height*ifelse(allergic=="YES",-1,1)+rnorm(200))>.5
)
现在我们定义要预测的一组值
gg<-expand.grid(sex=c("M","F"), allergic=c("YES","NO"))
vv<-expand.grid(age=18:65, height=3:9)
然后我们拟合模型,并使用预测函数计算我们希望绘制的表面上每个点的响应。
mm <- glm(illness~sex+allergic+age+height, dd, family=binomial)
pd<-do.call(rbind, Map(function(sex, allergic) {
nd <- cbind(vv, sex=sex, allergic=allergic)
cbind(nd, pred=predict(mm, nd, type="response"))
}, sex=gg$sex, allergic=gg$allergic))
最后,我们可以使用lattice来绘制数据
library(lattice)
wireframe(pred~age+height|sex+allergic, pd, drape=TRUE)
这给了我们