[R] Add Significance Codes to Data Frame
Marc Schwartz
marc_schwartz at me.com
Wed Jul 14 21:50:26 CEST 2010
On Jul 14, 2010, at 2:16 PM, darckeen wrote:
>
> I was hoping that there might be some way to attach significance code like
> the ones from summary.lm to a dataframe. Anyone know how to do something
> like that. Here is the function i'd like to add that functionality to:
>
>
> add1.coef <- function(model,scope,test="F",p.value=1,order.by.p=FALSE)
> {
> num <- length(model$coefficients)
> add <- add1(model,scope,test=test)
> sub <- subset(add,add$'Pr(F)'<=p.value)
> est <- sapply(rownames(sub), function(x) update(model,paste("~ .
> +",x))$coefficients[num+1])
> ret <- data.frame(est,sub$'Pr(F)')
>
> colnames(ret) <- c("Estimate","Pr(F)")
> rownames(ret) <- rownames(sub)
> ret <- format(ret,digits=1,nsmall=1,scientific=F)
>
> if (order.by.p) { ret <- ret[order(ret$'Pr(F)'),]}
> return(ret)
> }
>
> fscope <- as.formula(paste("dep.sign.up ~ ", paste(names(lr)[2:10],
> collapse= "+")))
> rslt <- add1.coef(lm(dep.sign.up ~ 1,
> data=lr),fscope,p.value=1,order.by.p=FALSE)
>
> Estimate Pr(F)
> r1.pop.total 0.02 0.09
> r1.pop.household 0.05 0.09
> r1.pop.female 0.03 0.09
> r1.pop.pct.female 14594.39 0.35
> r1.pop.male 0.04 0.08
> r1.pop.pct.male -13827.51 0.37
> r1.pop.density 0.06 0.09
> r1.age.0.4.pct 14581.65 0.39
> r1.age.5.14.pct 2849.15 0.76
Review the code for print.summary.lm(), in which you will find the use of printCoefmat(), in which you will find the use of symnum().
Using lm.D9 from example(lm):
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
weight <- c(ctl, trt)
lm.D9 <- lm(weight ~ group)
> printCoefmat(coef(summary(lm.D9)))
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.03200 0.22022 22.8501 9.547e-15 ***
groupTrt -0.37100 0.31143 -1.1913 0.249
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
pv <- coef(summary(lm.D9))[, "Pr(>|t|)"]
> pv
(Intercept) groupTrt
9.547128e-15 2.490232e-01
Signif <- symnum(pv, corr = FALSE, na = FALSE,
cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
symbols = c("***", "**", "*", ".", " "))
> Signif
(Intercept) groupTrt
***
attr(,"legend")
[1] 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Note that 'Signif' is:
> str(Signif)
Class 'noquote' atomic [1:2] ***
..- attr(*, "legend")= chr "0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
So you will need to coerce it to a vector before cbind()ing to a data frame:
> as.vector(Signif)
[1] "***" " "
HTH,
Marc Schwartz
More information about the R-help
mailing list