簡體   English   中英

從R中的大列表中提取回歸系數

[英]Extract regression coefficients out of large list in R

我有一個大約100列的大型數據框,並按年份將其拆分。 我想將前一年的x [i]作為自變量作為x [i]的回歸,將下一年作為因變量:xS = a0 + a1xP + e

我的代碼如下所示:

     d1 <- structure(list(Date=c("2012-01-01", "2012-06-01",
                            "2013-01-01", "2013-06-01", "2014-01-01", "2014-06-01"),
                     x1=c(NA, NA, 17L, 29L, 27L, 10L), 
                     x2=c(30L, 19L, 22L, 20L, 11L,24L), 
                     x3=c(NA, 23L, 22L, 27L, 21L, 26L),
                     x4=c(30L, 28L, 23L,24L, 10L, 17L), 
                     x5=c(NA, NA, NA, 16L, 30L, 26L)),
                row.names=c(NA, 6L), class="data.frame")
                rownames(d1) <- d1[, "Date"]   
                d1 <- d1[,-1]


df2012 <- d1[1:2,]
df2013 <- d1[3:4,]
df2014 <- d1[4:5,]

condlm <- function(i){    
  if(sum(is.na(df2012[,i]))==dim(df2013)[1]) # ignore the columns     only containing NA's
    return()
  else
    lm.model <- lm(df2013[,i]~df2012[,i])
  summary(lm.model)
}

lms <- lapply(1:dim(df2013)[2], condlm)
lms


zzq <- sapply(lms, coef)
zzq <- do.call(rbind.data.frame, zzq)
zzq <- zzq[grepl("(Intercept)", rownames(zzq)) ,] 

編輯2:

lms給我以下輸出:

[[1]]
NULL

[[2]]

Call:
lm(formula = df2013[, i] ~ df2012[, i])

Residuals:
ALL 2 residuals are 0: no residual degrees of freedom!

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  16.5455         NA      NA       NA
df2012[, i]   0.1818         NA      NA       NA

Residual standard error: NaN on 0 degrees of freedom
Multiple R-squared:      1, Adjusted R-squared:    NaN 
F-statistic:   NaN on 1 and 0 DF,  p-value: NA


[[3]]

Call:
lm(formula = df2013[, i] ~ df2012[, i])

Residuals:
ALL 1 residuals are 0: no residual degrees of freedom!

Coefficients: (1 not defined because of singularities)
            Estimate Std. Error t value Pr(>|t|)
(Intercept)       27         NA      NA       NA
df2012[, i]       NA         NA      NA       NA

Residual standard error: NaN on 0 degrees of freedom
  (1 observation deleted due to missingness)


[[4]]

Call:
lm(formula = df2013[, i] ~ df2012[, i])

Residuals:
ALL 2 residuals are 0: no residual degrees of freedom!

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)     38.0         NA      NA       NA
df2012[, i]     -0.5         NA      NA       NA

Residual standard error: NaN on 0 degrees of freedom
Multiple R-squared:      1, Adjusted R-squared:    NaN 
F-statistic:   NaN on 1 and 0 DF,  p-value: NA


[[5]]
NULL

[[1]][[5]]給我NULL

有沒有辦法修改函數condlm,這給了我NA而不是NULL嗎? 最后,用zzq <- zzq[grepl("(Intercept)", rownames(zzq)) ,]提取截距后zzq <- zzq[grepl("(Intercept)", rownames(zzq)) ,]我的數據框zzq應該如下所示:

             Estimate Std. Error t value Pr(>|t|) 
(Intercept)  NA              NaN     NaN      NaN
(Intercept)2 16.54545        NaN     NaN      NaN
(Intercept)3 27.00000        NaN     NaN      NaN
(Intercept)4 38.00000        NaN     NaN      NaN
(Intercept)5 NA              NaN     NaN      NaN

謝謝

您可以通過以下修改來獲得標准錯誤,p值等:

condlm <- function(i){    
  if(sum(is.na(df2012[,i]))==dim(df2013)[1]) # ignore the columns     only containing NA's
    return()
  else
    lm.model <- lm(df2013[,i]~df2012[,i])
    summary(lm.model)
}


lms <- lapply(1:dim(df2013)[2], condlm)
lms

但是請注意,由於示例中當前數據的結構方式,因此您沒有足夠的數據來獲取std的數值。 錯誤等),因為您的模型擬合不足。

例如,使用您的樣本數據,我們將獲得以下內容(部分輸出)

> lms
[[1]]
NULL

[[2]]

Call:
lm(formula = df2013[, i] ~ df2012[, i])

Residuals:
ALL 2 residuals are 0: no residual degrees of freedom!

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  16.5455         NA      NA       NA
df2012[, i]   0.1818         NA      NA       NA

Residual standard error: NaN on 0 degrees of freedom
Multiple R-squared:      1, Adjusted R-squared:    NaN 
F-statistic:   NaN on 1 and 0 DF,  p-value: NA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM