R:使用apply系列在数据帧的每一行上应用lm

时间:2017-11-11 01:40:42

标签: r lm

我有一个数据框

x y z  
1 4 6  
2 5 7  
3 6 8  
4 7 9  
5 8 10   

下面的可重复示例:

x <- c(1,2,3,4,5)
y <- c(4,5,6,7,8)
z <- c(6,7,8,9,10)
df <- data.frame(x, y, z)
df

我试图在第1行到第4行之间使用lm进行线性回归。我试图在这里使用apply系列。我已经在SO中看到了其他链接,但是很难理解语法。这个link是一个很好的链接,但我很难理解语法。这是我的尝试。

apply(df, 1, function(x), lm(x[1,] ~ x[5,])$coefficients)

我不确定编写apply的语法是什么,它需要所有行。

如果有人也可以告诉我如何做同样薄的但是在数据帧的列上也有lm,我也会感激不尽。

df = data.frame(x=c(1:5), y= c(4:8), z=c(6:10))

3 个答案:

答案 0 :(得分:1)

我以两种方式对数据框进行不同的定义:(a)每个变量都是一列(在R中更自然),以及(b)向表中添加第四行,因此回归具有足够的度数自由我知道我回答的问题与你提出的问题略有不同,但我认为这种情况将更接近你所面对的现实世界。

library(magrittr)
predictors <- c("x1", "x2", "x3", "x4")
df <- tibble::tribble(
  ~x1, ~x2, ~x3, ~x4,  ~y,  
    1,   2,   3,   4,   5,
    4,   5,   6,   7,   8,
    6,   7,   8,   9,  10,
    7,   3,   8,   4,   8   # Added this row for stability
)

tidyverse函数似乎很适合我。

df %>% 
  dplyr::select(!!predictors) %>% 
  purrr::map( function(x) coef(lm(df$y ~ x))   ) %>% 
  tibble::enframe(name="predictor", value="coefficients") %>% 
  dplyr::mutate(
    int     = purrr::map_chr(.$coefficients, "(Intercept)"),
    slope   = purrr::map_chr(.$coefficients, "x")
  ) %>% 
  dplyr::select(predictor, int, slope)
  1. 第2行:仅使用预测变量(用于循环)
  2. 第3行:遍历每个预测变量(x),并预测df$ycoef()将产生一个数字向量。 (对于每个data.fram单元存储两个数字,最初看起来很奇怪。)
  3. 第4行:转换为tibble / data.frame以便于操作
  4. 第6行:在每个双变量系数集内,提取截距。
  5. 第7行:在每个双变量系数集中,提取斜率。

答案 1 :(得分:0)

问题中的代码存在以下问题:

  • apply一次传递一行,所以x [1,]实际上只是x - 没错,但没有意义
  • x [5,]是一个错误,因为x只有一行,所以不能要求第5行
  • apply包括最后一行,它会对自己回归那行似乎毫无意义
  • 通常将变量放在列中,将案例放在行中,但df将其反转。对于传统的取向,当一个引用变量时,指的是平面矢量。问题的方向df[i, ]是一行数据框而不是我们想要的普通向量。
  • 使用coef函数比在问题中所做的那样弄乱lm对象的内部结构。
  • 在海报同意的评论中,@ wibeasley表示df[i, ]是预测变量,即自变量(每个回归一个),df[5, ]是结果变量,即因变量。那是模型 df[5, ] = a + b * df[i, ] + error 对i的每个值进行单独回归(除了5)。在这种情况下,变量列在问题代码中公式的错误一侧。

1)解决我们遇到的这些问题:

DF <- as.data.frame(t(df))
nc <- ncol(DF)
sapply(DF[-nc], function(x)  coef(lm(DF[, nc] ~ x)))

,并提供:

            V1 V2 V3 V4
(Intercept)  4  3  2  1
x            1  1  1  1

2)如果您确实想用df来表达,那么:

nr <- nrow(df)
apply(df[-nr,], 1, function(x) coef(lm(t(df[nr, ]) ~ x)))

3)如果意图是df[5, ]是预测变量,那么我们根本不需要apply这样做(DF上面定义了nc):

coef(lm(as.matrix(DF[-nc]) ~ DF[[nc]]))

,并提供:

            V1 V2 V3 V4
(Intercept) -4 -3 -2 -1
DF[[nc]]     1  1  1  1

答案 2 :(得分:0)

很抱歉,如果我误解了你的问题。

如果您想要模型生成的预测值,则可以使用

  

拟合(模型)