2017-11-28 11 views
2

私は3つのデータフレームdfLON、dfMOS、dfATAを持っています。 yは連続変数、a、b、cはバイナリカテゴリであり、またNAもあります。データフレームのリストをlm()に渡して結果を表示

データセットごとに1つずつ、別々の線形回帰モデルを作成したいと考えています。

私の現在のコードでは、データフレームのリストを作成してlm()に渡しました。しかし、例えばfitdfLON <- DfList[[1]]より結果を見るより簡潔な方法がありますか?私はこの例では3つのデータフレームを提供しましたが、実際には〜25なので、25回タイプする必要があります!

ご協力いただければ幸いです。

開始点(DFS):

dfLON <- data.frame(y=c(1.23,2.32,3.21,2.43),a=c(1,NA,1,2),b=c(1,1,2,2),c=c(2,1,2,1)) 
dfMOS <- data.frame(y=c(4.56,6.54,4.43,5.78),a=c(2,1,2,1),b=c(2,1,1,2),c=c(1,2,1,2)) 
dfATA <- data.frame(y=c(1.22,6.54,3.23,4.23),a=c(2,2,2,1),b=c(1,2,1,2),c=c(1,NA,1,2)) 

現在のコード:

Mylm <- function(df){ 
fit <- lm(y ~ a + b + c, data=df) 
    return(fit) 
} 
DfList <- lapply(list(dfLON, dfMOS, dfATA), Mylm) 

fitdfLON <- DfList[[1]] 
fitdfMOS <- DfList[[2]] 
fitdfATA <- DfList[[3]] 
+0

; '次に参照項目:' DfList $ fitdfLON; DfList $ fitdfMOS; DfList $ fitdfATA' – Parfait

答えて

1

の名前を持つベクトルを提供することができますが多くの異なるデータセットのモデルでは、箒のライブラリを使用してそれらをきちんと整えるのが理にかなっています。これにより、モデルごとにクリーンなデータフレームが生成され、出力またはダウンストリーム分析で使用できます。

最も単純な例:

library(broom) 

Mylm <- function(df){ 
    fit <- lm(y ~ a + b + c, data=df) 
    tidy(fit) # tidy the fit object 
} 

list(dfLON, dfMOS, dfATA) %>% lapply(Mylm) 

#[[1]] 
#   term estimate std.error statistic p.value 
#1 (Intercept)  0.03  NaN  NaN  NaN 
#2   a -0.78  NaN  NaN  NaN 
#3   b  1.98  NaN  NaN  NaN 
# 
#[[2]] 
#   term estimate std.error statistic p.value 
#1 (Intercept) 8.2975 0.969855 8.5554025 0.07407531 
#2   a -1.6650 0.445000 -3.7415730 0.16626155 
#3   b -0.3150 0.445000 -0.7078652 0.60785169 
# 
#[[3]] 
#   term estimate std.error statistic p.value 
#1 (Intercept) 6.235 3.015000 2.067993 0.2867398 
#2   a -2.005 1.740711 -1.151828 0.4551559 

そして、あなたは今、1つの合成データフレームにすべてを統合するpurrrからmap_dfr()機能でこれを組み合わせることができます、あなたを

library(purrr) 

# note the named list entries; these will go into the "model" column 
# without them, you'd just get a model number 
list("LON" = dfLON, "MOS" = dfMOS, "ATA" = dfATA) %>% 
    map_dfr(Mylm, .id = "model") 

# model  term estimate std.error statistic p.value 
#1 LON (Intercept) 0.0300  NaN  NaN  NaN 
#2 LON   a -0.7800  NaN  NaN  NaN 
#3 LON   b 1.9800  NaN  NaN  NaN 
#4 MOS (Intercept) 8.2975 0.969855 8.5554025 0.07407531 
#5 MOS   a -1.6650 0.445000 -3.7415730 0.16626155 
#6 MOS   b -0.3150 0.445000 -0.7078652 0.60785169 
#7 ATA (Intercept) 6.2350 3.015000 2.0679934 0.28673976 
#8 ATA   a -2.0050 1.740711 -1.1518281 0.45515586 

そして、物事をよりコンパクトにしますmap_dfrの中でその場で機能を定義することができます。あなたがやっていることがすべて線形モデルに合っているときには適切だと思われます。 setNames(lapply(リスト(dfLON、dfMOS、dfATA)、Mylm)、C( "fitdfLON"、 "fitdfMOS"、fitdfATA ")) - ` DfList <:単に代わりに別のオブジェクトの名前のリストを使用し

list("LON" = dfLON, "MOS" = dfMOS, "ATA" = dfATA) %>% 
    map_dfr(~ tidy(lm(y ~ a + b + c, data = .)), 
      .id = "model") 

# model  term estimate std.error statistic p.value 
#1 LON (Intercept) 0.0300  NaN  NaN  NaN 
#2 LON   a -0.7800  NaN  NaN  NaN 
#3 LON   b 1.9800  NaN  NaN  NaN 
#4 MOS (Intercept) 8.2975 0.969855 8.5554025 0.07407531 
#5 MOS   a -1.6650 0.445000 -3.7415730 0.16626155 
#6 MOS   b -0.3150 0.445000 -0.7078652 0.60785169 
#7 ATA (Intercept) 6.2350 3.015000 2.0679934 0.28673976 
#8 ATA   a -2.0050 1.740711 -1.1518281 0.45515586 
1

data.frameの名前が一般的なパターンを持っている場合は、あなたがするmgetlsの組み合わせを使用することができますそれらを抽出し、を使用してlapply

fit = lapply(mget(ls(pattern = "^df[A-Z]{3}")), function(x) lm(y ~ a + b + c, data = x)) 
fit$dfATA 

#Call: 
#lm(formula = y ~ a + b + c, data = x) 

#Coefficients: 
#(Intercept)   a   b   c 
#  6.235  -2.005   NA   NA 

あなただけのすべての係数をしたい場合は、代わりにls(pattern = "df[A-Z]{3}")

do.call(rbind, 
     lapply(X = mget(ls(pattern = "^df[A-Z]{3}")), 
       FUN = function(x) lm(formula = y ~ a + b + c, data = x)[[1]])) 
#  (Intercept)  a  b c 
#dfATA  6.2350 -2.005  NA NA 
#dfLON  0.0300 -0.780 1.980 NA 
#dfMOS  8.2975 -1.665 -0.315 NA 

を行うことができ、あなたが実行しているときはいつでも、あなたはまた、単にすべてのdata.frame

関連する問題