2015-09-18 100 views
-2

我需要在R中運行使用Lm()的簡單迴歸。它很簡單,因爲我只有一個獨立變量。然而,問題在於我需要爲數據框中的列的許多依賴項測試此自變量。迴歸在R與循環

所以基本上我有一個共同的X和衆多的Y,我需要提取截距和斜率並將它們全部存儲在數據框中。

在excel中,這可以通過截取和斜率函數,然後跨列拖動。我需要R中基本相同的東西,我當然可以運行單獨的迴歸,但要求我需要在一個迴路中運行所有這些迴路,並將截距和斜率的估計存儲在一起。

我仍然學習R和任何幫助,這將是偉大的。謝謝:)

+0

我覺得必須有相當數量的副本或者此近愚弄的,但我可以」現在找到他們。 @羅蘭的答案非常好,但。 –

回答

2

函數包nlme是爲此設計的。

讓我們用iris數據集爲例:

DF <- iris[, 1:4] 
# Sepal.Length Sepal.Width Petal.Length Petal.Width 
#1   5.1   3.5   1.4   0.2 
#2   4.9   3.0   1.4   0.2 
#3   4.7   3.2   1.3   0.2 
#4   4.6   3.1   1.5   0.2 
#5   5.0   3.6   1.4   0.2 
#6   5.4   3.9   1.7   0.4 
#... 

首先,我們必須重塑它。在本例中,我們需要Sepal.Length作爲依賴項,其他列作爲預測項。

library(reshape2) 
DF <- melt(DF, id.vars = "Sepal.Length") 
# Sepal.Length variable value 
#1   5.1 Sepal.Width 3.5 
#2   4.9 Sepal.Width 3.0 
#3   4.7 Sepal.Width 3.2 
#4   4.6 Sepal.Width 3.1 
#5   5.0 Sepal.Width 3.6 
#6   5.4 Sepal.Width 3.9 
#... 

現在我們可以做適合。

library(nlme) 
mods <- lmList(Sepal.Length ~ value | variable, 
       data = DF, pool = FALSE) 

我們現在可以爲每個模型提取截距和斜率。

coef(mods) 
#    (Intercept)  value 
#Sepal.Width  6.526223 -0.2233611 
#Petal.Length 4.306603 0.4089223 
#Petal.Width  4.777629 0.8885803 

,並獲得通常的T型臺:

summary(mods) 
# Call: 
# Model: Sepal.Length ~ value | variable 
# Data: DF 
# 
# Coefficients: 
# (Intercept) 
#    Estimate Std. Error t value  Pr(>|t|) 
# Sepal.Width 6.526223 0.47889634 13.62763 6.469702e-28 
# Petal.Length 4.306603 0.07838896 54.93890 2.426713e-100 
# Petal.Width 4.777629 0.07293476 65.50552 3.340431e-111 
# value 
#    Estimate Std. Error t value  Pr(>|t|) 
# Sepal.Width -0.2233611 0.15508093 -1.440287 1.518983e-01 
# Petal.Length 0.4089223 0.01889134 21.646019 1.038667e-47 
# Petal.Width 0.8885803 0.05137355 17.296454 2.325498e-37 

或者R平方值:

summary(mods)$r.squared 
#[1] 0.01382265 0.75995465 0.66902769 

但是,如果你需要的東西更有效,你可以使用包數據.table連同lm的主力lm.fit

library(data.table) 
setDT(DF) 
DF[, setNames(as.list(lm.fit(cbind(1, value), 
          Sepal.Length)[["coefficients"]]), 
       c("intercept", "slope")), by = variable] 
#  variable intercept  slope 
#1: Sepal.Width 6.526223 -0.2233611 
#2: Petal.Length 4.306603 0.4089223 
#3: Petal.Width 4.777629 0.8885803 

當然這些機型的R.squared值只是平方Pearson相關係數:

DF[, .(r.sq = cor(Sepal.Length, value)^2), by = variable] 
#  variable  r.sq 
#1: Sepal.Width 0.01382265 
#2: Petal.Length 0.75995465 
#3: Petal.Width 0.66902769 
+0

這很有幫助:)想知道是否有辦法得到每個迴歸的R平方值。摘要(mods)僅返回第一種方法的T和p值分別爲 – user36176

+0

'summary(mods)$ r.squared'或DF [,。(r.sq = cor(Sepal.Length,value)^ 2 ),by = variable]'爲第二種方法。 – Roland