我有一个数据框
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))
答案 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)
x
),并预测df$y
。 coef()
将产生一个数字向量。 (对于每个data.fram单元存储两个数字,最初看起来很奇怪。)答案 1 :(得分:0)
问题中的代码存在以下问题:
apply
一次传递一行,所以x [1,]实际上只是x
- 没错,但没有意义x
只有一行,所以不能要求第5行apply
包括最后一行,它会对自己回归那行似乎毫无意义df
将其反转。对于传统的取向,当一个引用变量时,指的是平面矢量。问题的方向df[i, ]
是一行数据框而不是我们想要的普通向量。coef
函数比在问题中所做的那样弄乱lm
对象的内部结构。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)
很抱歉,如果我误解了你的问题。
如果您想要模型生成的预测值,则可以使用
拟合(模型)