我是否更容易使用predict
从更复杂的回归框架中获取预测。
举例来说:
NN<-1e4
data<-data.table(trt=sample(paste("Treatment",1:3),NN,T),
qtl=sample(paste0("Q",1:2),NN,T),
grp=sample(4,NN,T),
cat=sample(paste("Category",LETTERS[1:3]),NN,T),
val=rnorm(NN,10)^2)
data[,out:=140+5*(trt=="Treatment 2")+3*(trt=="Treatment 3")+
8*(qtl=="Q2")-4*(trt=="Treatment 2"&qtl=="Q2")+
7*(trt=="Treatment 3"&qtl=="Q2")-4*(grp==2)+
6*(grp==3)-10*(grp==4)-6*(cat=="Category B")+
2*(cat=="Category C")-1.8*val+rnorm(NN,10)>0]
llog<-glm(out~trt*qtl+as.factor(grp)+cat+val,data=data,family=binomial(link="logit"))
现在,我希望通过out
,按trt
qtl = 1 概率退出此预测>,所有其他预测因子保持样本平均值。
我想说这是一个3 x 2矩阵(或表等)的行,其中行对应trt
,列为qtl
这尤其复杂,因为存在因子变量 - &#34;保持在样本平均值&#34;意味着我们需要插入每组观察的百分比,而且我不确定如何以干净的方式这样做。
当然,实现这一目标的很长的方法如下:
1)为&#34;其他预测因子设置一个样本平均值向量&#34;:
oth.avg<-c(1,unlist(data[,lapply(list(grp==2,grp==3,grp==4,cat=="Category B",
cat=="Category C",val),mean)]))
2)乘以相应的系数
x.beta.oth<-sum(llog$coefficients[c(1,5:10)]*oth.avg)
3)设置&#34; matrices&#34;适用于trt
,qtl
和trt
x qtl
条款:
(我说&#34; matrices&#34;因为它们是从概念上得出的
基础矩阵,但指定它们更简洁
在一个方面)
main.coef<-llog$coefficients[c(2:4,11:12)]
trt.mat<-rep(c(0,main.coef[1:2]),2)
qtl.mat<-rep(c(0,main.coef[3]),each=3)
tq.mat<-c(rep(0,3),rbind(rep(0,1),matrix(main.coef[4:5],ncol=1)))
(在这个小例子中指定它们是过分的,但是当表格是4x4时,简约性开始显示出来。
4)添加所有内容以获得预测的潜在指数
lat.pred<-trt.mat+qtl.mat+tq.mat+x.beta.oth
5)最后,通过逻辑公式将这些变换为预测概率:p /(1 + p)
pred.prob<-matrix(exp(lat.pred)/(1+exp(lat.pred)),ncol=2,
dimnames=list(paste("Treatment",1:3),c("Q1","Q2")))
Q1 Q2
Treatment 1 3.515452e-28 6.000161e-22
Treatment 2 1.989195e-24 1.519577e-27
Treatment 3 3.380796e-26 1.633097e-20
我错过了什么吗?我不知道我可以在predict
中输入什么来获得此输出...