web-dev-qa-db-ja.com

線形回帰と結果のデータフレームへの保存

データフレーム内のいくつかの変数で線形回帰を実行しています。カテゴリ変数によって線形回帰をサブセット化し、各カテゴリ変数に対して線形回帰を実行してから、t統計量をデータフレームに格納できるようにしたいと思います。可能であればループなしでこれを実行したいと思います。

これが私がやろうとしていることのサンプルです:

  a<-  c("a","a","a","a","a",
         "b","b","b","b","b",
         "c","c","c","c","c")     
  b<-  c(0.1,0.2,0.3,0.2,0.3,
         0.1,0.2,0.3,0.2,0.3,
         0.1,0.2,0.3,0.2,0.3)
  c<-  c(0.2,0.1,0.3,0.2,0.4,
         0.2,0.5,0.2,0.1,0.2,
         0.4,0.2,0.4,0.6,0.8)
      cbind(a,b,c)

次の線形回帰を実行し、t統計量を非常に簡単に引き出すことから始めることができます。

  summary(lm(b~c))$coefficients[2,3]

ただし、列aがa、b、またはcの場合に回帰を実行できるようにしたいと思います。次に、t-statsを次のようなテーブルに保存したいと思います。

variable t-stat
a        0.9
b        2.4
c        1.1

それが理にかなっていることを願っています。何か提案があれば教えてください!

7
Trexion Kameha

plyrパッケージとddply()への投票です。

plyrFunc <- function(x){
  mod <- lm(b~c, data = x)
  return(summary(mod)$coefficients[2,3])
  }

tStats <- ddply(dF, .(a), plyrFunc)
tStats
  a         V1
1 a  1.6124515
2 b -0.1369306
3 c  0.6852483
5
Steven

これは、dplyrパッケージのbroomtidy()を使用したソリューションです。 tidy()は、さまざまな統計モデルの出力(lmglmanovaなど)を整然としたデータフレームに変換します。

library(broom)
library(dplyr)

data <- data_frame(a, b, c)

data %>% 
  group_by(a) %>% 
  do(tidy(lm(b ~ c, data = .))) %>% 
  select(variable = a, t_stat = statistic) %>% 
  slice(2)

#   variable     t_stat
# 1        a  1.6124515
# 2        b -0.1369306
# 3        c  0.8000000  

または、切片と勾配項のt統計量の両方を抽出します。

data %>% 
  group_by(a) %>% 
  do(tidy(lm(b ~ c, data = .))) %>% 
  select(variable = a, term, t_stat = statistic)

#   variable        term     t_stat
# 1        a (Intercept)  1.2366939
# 2        a           c  1.6124515
# 3        b (Intercept)  2.6325081
# 4        b           c -0.1369306
# 5        c (Intercept)  1.4572335
# 6        c           c  0.8000000
11
alex23lemm

lmListパッケージのnlme関数を使用して、データのサブセットにlmを適用できます。

# the data
df <- data.frame(a, b, c)

library(nlme)
res <- lmList(b ~ c | a, df, pool = FALSE)
coef(summary(res))

出力:

, , (Intercept)

   Estimate Std. Error  t value   Pr(>|t|)
a 0.1000000 0.08086075 1.236694 0.30418942
b 0.2304348 0.08753431 2.632508 0.07815663
c 0.1461538 0.10029542 1.457233 0.24110393

, , c

     Estimate Std. Error    t value  Pr(>|t|)
a  0.50000000  0.3100868  1.6124515 0.2052590
b -0.04347826  0.3175203 -0.1369306 0.8997586
c  0.15384615  0.1923077  0.8000000 0.4821990

T値のみが必要な場合は、次のコマンドを使用できます。

coef(summary(res))[, "t value", -1]
#          a          b          c 
#  1.6124515 -0.1369306  0.8000000  
5
Sven Hohenstein

splitを使用してデータをサブセット化し、lapplyによるループを実行します

dat <- data.frame(b,c)
dat_split <- split(x = dat, f = a)
res <- sapply(dat_split, function(x){
  summary(lm(b~c, data = x))$coefficients[2,3]
})

結果をニーズに合わせて再形成します。

data.frame(variable = names(res), "t-stat" = res) 

  variable     t.stat
a        a  1.6124515
b        b -0.1369306
c        c  0.8000000
3
Rentrop

あなたはこれを行うことができます:

a<-  c("a","a","a","a","a",
       "b","b","b","b","b",
       "c","c","c","c","c")     
b<-  c(0.1,0.2,0.3,0.2,0.3,
       0.1,0.2,0.3,0.2,0.3,
       0.1,0.2,0.3,0.2,0.3)
c<-  c(0.2,0.1,0.3,0.2,0.4,
       0.2,0.5,0.2,0.1,0.2,
       0.4,0.2,0.4,0.6,0.8)
df <- data.frame(a,b,c)


t.stats <- t(data.frame(lapply(c('a','b','c'), 
             function(x) summary(lm(b~c,data=df[df$a==x,]))$coefficients[2,3])))
colnames(t.stats) <- 't-stat'
rownames(t.stats) <- c('a','b','c')

出力:

> t.stats
      t-stat
a  1.6124515
b -0.1369306
c  0.8000000

私が間違っていない限り、あなたがあなたの出力で与える値は正しいものではありません。

または:

t.stats <- data.frame(t.stats)
t.stats$variable <- rownames(t.stats)

> t.stats[,c(2,1)]
  variable     t.stat
a        a  1.6124515
b        b -0.1369306
c        c  0.8000000

Data.frameと別の列が必要な場合。

2
LyzandeR