costebk08
costebk08

Reputation: 1359

Extracting coefficients from a regression 1 model with 1 predictor

I currently have the following regression model:

> print(summary(step1))

Call:
lm(formula = model1, data = newdat1)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.53654 -0.02423 -0.02423 -0.02423  1.71962 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.3962     0.0532   7.446 2.76e-12 ***
i2            0.6281     0.0339  18.528  < 2e-16 ***

I would like just the following returned as a data frame:

            Estimate Std. Error t value Pr(>|t|)
i2            0.6281     0.0339  18.528  < 2e-16

I currently have the following code:

> results1<-as.data.frame(summary(step1)$coefficients[-1,drop=FALSE])

Which yields:

> results1
  summary(step1)$coefficients[-1, drop = FALSE]
1                                  6.280769e-01
2                                  5.320108e-02
3                                  3.389873e-02
4                                  7.446350e+00
5                                  1.852804e+01
6                                  2.764836e-12
7                                  2.339089e-45

Thus is not what I want; however, it does work when there's more than 1 predictor.

Upvotes: 2

Views: 210

Answers (2)

andybega
andybega

Reputation: 1437

summary(step1)$coefficients is a matrix. When you take out the first element with [-1, drop=FALSE] it is converted to a vector, which is why you get 7 numbers instead of the row you want.

> set.seed(123)
> x <- rnorm(100)
> y <- -1 + 0.2*x + rnorm(100)
> step1 <- lm(y ~ x)
> class(summary(step1)$coefficients)
[1] "matrix"
> class(summary(step1)$coefficients[-1, drop=FALSE])
[1] "numeric"

The solution is to change the subsetting with [ so that you specify you wan to keep all columns (see ?`[`):

> summary(step1)$coefficients[-1, , drop=FALSE]
   Estimate Std. Error  t value  Pr(>|t|)
 x 0.1475284  0.1068786 1.380336 0.1706238

Upvotes: 2

Ben Bolker
Ben Bolker

Reputation: 226192

It would be nice if you gave a reproducible example. I think you're looking for

cc <- coef(summary(step1))[2,,drop=FALSE]
as.data.frame(cc)

Using accessors such as coef(summary(.)) rather than summary(.)$coefficients is both prettier and more robust (there is no guarantee that the internal structure of summary() will stay the same -- although admittedly it's unlikely that this basic a part of R will change any time soon, especially as many users probably have used constructions like $coefficients).

Indexing the row by name, i.e.

coef(summary(step1))["i2",,drop=FALSE]

would probably be even better.

Upvotes: 4

Related Questions