user14845
user14845

Reputation: 105

NA issues with Linear Regression

I want to regress y1 with x, then y2 with x and so on and save the slope,intercept,r2 values ,p values etc. to a vector such that the final vector should contain values for y1...n even if the value is NA.

The following is how my data looks

y1  y2  y3  y4  y5  x
NA  89  86  91  69  1
NA  86  NA  88  NA  2
NA  86  83  88  66  3
NA  100 NA  102 80  4

Using the following code, the slope values will not be calculated for those columns where all the values of y[,i] are NA but will still be calculated if one of the values is a NA.

slope<-0
for(i in 1:length(names(y))){
if (all(is.na(y[,i]))==FALSE) {
   m <- lm(y[,i] ~ time)
   slope <- c(slope, m$coefficients[2])
  }
}

However,I still cannot figure out a way by which I maintain the positional information of all y[,i] such that my final vector output would look something like this

slope
1   NA
2   9.362637e-01
3   8.461538e-01
4   3.450549e-01
5   6.593407e-01

ANy help will be much appreciated

Upvotes: 0

Views: 141

Answers (2)

G. Grothendieck
G. Grothendieck

Reputation: 270348

sapply over the non-x columns of DF returning the coefficients if there are any non-NAs in the dependent variable (y) and returning NAs otherwise:

t(sapply(DF[-6], function(y) if (any(!is.na(y))) coef(lm(y ~ x, DF)) else c(NA, NA)))

This gives the following where column 1 is the intercepts and column 2 is the slopes:

       [,1]      [,2]
y1       NA        NA
y2 82.00000  3.300000
y3 87.50000 -1.500000
y4 84.00000  3.300000
y5 63.85714  2.928571

If only the slopes are needed then:

 matrix(sapply(DF[-6], function(y) if (any(!is.na(y))) coef(lm(y ~ x, DF))[2] else NA))

Upvotes: 1

Metrics
Metrics

Reputation: 15458

#This is for the slope only. 
  nn<-lapply(paste0("y",1:5),function(i){
    if (all(is.na(y[[i]]))==FALSE) {bb<-lm(y[[i]]~x,data=y)
               return(bb[[1]][2])
     }else{
         return(NA)
    }
 })
     do.call(rbind,kk)
             x
[1,]        NA
[2,]  3.300000
[3,] -1.500000
[4,]  3.300000
[5,]  2.928571

    do.call(rbind,nn)

Upvotes: 0

Related Questions