2016-12-30 213 views
-1

我剛剛開始學習R,似乎無法使此循環正常工作。我有一個包含250行和503列(y)的數據框,另一個數據框包含250行和1列(x)。R中的循環 - 線性迴歸

我想獲得一個循環運行503個單獨的迴歸,而不必單獨輸入即ie。

(output_1 <- lm(y$1st column ~ x)) 
(output_2 <- lm(y$2nd column ~ x)) 

在每個迴歸的所有250行中。

我想這個循環:

for (i in 1:503) { 
output_loop <- lm(y[,i]~x) 
} 
output_total <- cbind(output$coefficients) 

但這只是給了我一個監聽和一個係數,相對於503所截獲和503倍的係數。

每個數據幀的行都有以yyyy-mm-dd格式排列的時間標記,但我不認爲這會影響迴歸,因爲所搜尋的截距和係數輸出與時間無關。

我已經使用鹼性LM也嘗試:

(output <- lm(y~x)) 
output_total <- cbind(output$coefficients) 

,這給503次攔截和503倍的係數,但是輸出是錯誤的,當我點檢查了一些列的輸出(如上述運行個人迴歸) 。

對這個循環的任何幫助非常感謝!

謝謝

+0

流明(Y〜x),其中x大於一列是多重回歸,係數將不匹配來自503個獨立迴歸中的每一個的係數。 – Seth

回答

0

我不知道你這個接近的最好方式,但在這裏,我想會實現你所描述的東西。

# create some toy data to match your description 

set.seed(340) 
y <- data.frame(replicate(503, runif(250, 0, 1))) 
x <- data.frame(v1=runif(250, 0, 1)) 


out <- data.frame(NULL)    # create object to keep results 
for (i in 1:length(y)) { 
    m <- summary(lm(y[,i] ~ x[,1])) # run model 
    out[i, 1] <- names(y)[i]   # print variable name 
    out[i, 2] <- m$coefficients[1,1] # intercept 
    out[i, 3] <- m$coefficients[2,1] # coefficient 
} 
names(out) <- c("y.variable", "intercept", "coef.x") 
head(out) 

# y.variable intercept  coef.x 
# 1   X1 0.4841710 -0.015186852 
# 2   X2 0.4972775 -0.002306964 
# 3   X3 0.4410326 0.096450185 
# 4   X4 0.4547249 0.041582039 
# 5   X5 0.5039661 0.062429142 
# 6   X6 0.5331573 -0.092806309 
+0

您的示例不可重現(請嘗試使用'y < - data.frame(replicate(5,runif(250,0,1)))''代替)。但正如亞倫所評論的那樣,你可以一步完成這個任務而不需要循環。 'coef(lm(as.matrix(y)〜as.matrix(x)))' – user20650

+0

我得到一個循環不是必需的(他們是否曾經?),但有時循環使得它更容易理解正在發生的事情。也許不是這種情況。但我不明白爲什麼這個例子不可重現。如果我重新啓動R並再次運行,我會得到相同的結果。我錯過了什麼? –

+1

重新舉例說明,第一行在y定義之前使用sapply(也許你在重新啓動時會在工作空間中加載) – user20650

0

您的循環已關閉,您只需創建一個地點以獲取結果。

output_loop=list(NA) 
for (i in 1:503) { 
output_loop[[i]] <- lm(y[,i]~x) 

} 

如果你只是想在一個data.frame係數再重組的事情,從每個模型趕上只是兩個係數

output_loop=data.frame(int=NA,slope=NA) 
for (i in 1:503) { 
    output_loop[i,] <- coefficients(lm(y[,i]~x)) 

} 
+0

這個工程!謝謝。如果我在控制檯輸入 「output_loop」 它給我所有503攔截並係數如 '[[503]] 召喚: LM(式= Y [,I]〜X) 係數: (截距)x' 但是我會失去所有503列的標題。有沒有辦法保留列的標題,並有兩行的截距和係數?我試圖變化: 'output_total < - as.matrix(output_loop)' 沒有運氣。 再次感謝 – ejt

+0

有幾個很好的策略。如果你想要的只是截取和斜率,那麼只需將列表中的輸出組織到數據框中即可。如果你想從迴歸輸出中得到更多的東西,那麼我設置的列表可以幫你。我添加了數據框架結構的結果,所以你有兩個。 – Seth

0
# libraries 
library('purrr') 
library('data.table') 

# data 
set.seed(340) 
df1 <- data.frame(x=runif(250, 0, 1), 
        replicate(503, runif(250, 0, 1))) 
setDT(df1) 
df1 <- melt.data.table(df1, id = 'x', variable.factor = FALSE, value.name = 'y') 

# apply lm() on data df1 
model_lm_rsqr <- df1 %>% 
    split(.$variable) %>% 
    map(~ lm(y ~ x, data = .)) %>% 
    map(summary) %>% 
    map_dbl("r.squared") 

model_lm_coeff <- df1 %>% 
    split(.$variable) %>% 
    map(~ lm(y ~ x, data = .)) %>% 
    map(summary) %>% 
    map("coefficients") 

# outputs 
model_lm_rsqr['X1'] 
# X1 
# 7.381324e-05 

model_lm_coeff[['X1']] 
# Estimate Std. Error t value  Pr(>|t|) 
# (Intercept) 0.500224626 0.03534444 14.1528503 9.867274e-34 
# x   -0.008564851 0.06330103 -0.1353035 8.924817e-01 


rbindlist(l = lapply(map(.x = model_lm_coeff, .f = ~ {t(.x[,1])}), as.data.frame), idcol = TRUE) 

# .id (Intercept)   x 
# 1: X1 0.5002246 -0.008564851 
# 2: X10 0.4759053 0.035537332 
# 3: X100 0.5200009 -0.078890569 
# 4: X101 0.4804617 0.096970266 
# 5: X102 0.5593092 -0.077299502 
# ---        
# 499: X95 0.5413627 -0.017625063 
# 500: X96 0.5016745 -0.093123400 
# 501: X97 0.5449859 -0.060117246 
# 502: X98 0.4670116 0.110287578 
# 503: X99 0.5121481 -0.042537902