2016-12-30 26 views
-1

私はRの学習を始めたばかりで、このループを働かせるようには見えません。私は250行と503列(y)と250行と1列(x)を含む別のデータフレームを含むデータフレームを持っています。R - 線形回帰のループ

私は503回の回帰を個別に実行する必要なくループを実行しようとしています。

(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個の係数とは対照的に、これは、私の1つの切片とつの係数を与えました。

各データフレームの行には、yyyy-mm-ddの形式でアライメントされたタイムマーカーがありますが、これはインターセプトと係数出力が時間とは無関係なので回帰に影響しないとは思われません。

私も基本的なLMを使用してみましたが

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

、これは私がスポットいくつかの列に対する出力をチェックすると、しかし、出力が間違っている503をインターセプトし、503個の係数を与える(上記のように、個々の回帰を実行しています) 。

このループのヘルプは大歓迎です!

は、私はあなたがこれに最善の方法を近づいてわからないんだけど、ここで私はあなたが説明したものを達成すると思い何かあなたに

+0

LM(Y〜x)は、xがより各モデルからちょうど2つの係数をキャッチします1つの列が重回帰である場合、係数は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)))'を使用してください)。しかし、Aaronのコメントによれば、これをループなしで一段階で行うことができます。 – user20650

+0

ループは必須ではありませんが、時にはループによって何が起きているのかがわかりやすくなります。おそらくこの場合はそうではないでしょう。しかし私は例が再現性がない理由に従わない。 Rを再起動してもう一度実行すると、同じ結果が得られます。私は何かが欠けていますか? –

+1

あなたの例では、最初の行はyが定義される前にsapplyを使っています(再起動時に作業領域にyがロードされている可能性があります)。 – 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

これは機能します!ありがとうございました。 LM(式= Y [私]〜x)の 係数::私は、コンソールで "output_loop" と入力した場合、それは私のすべての503インターセプトや係数など '[[503]] コールを与える (Intercept)x ' しかし、私はすべての503列のヘッダーを失うでしょう。列のヘッダーを保持し、切片と係数の2つの行を保持する方法はありますか?私はバリエーションを試しています: '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