在每个数据框行上应用lm函数的R代码

3

我试图对数据框中的两列进行简单的线性回归,针对每一行。经过一些研究,我感觉我已经接近成功了,但我的函数仍然不能工作。请看一下:

set.seed(1)
DF <- data.frame(A=rnorm(50, 100, 3),
                 B=rnorm(50, 100, 3))

resultlist   <- apply(DF, 1, function(y) lm(y ~ x))
resultcoeffs <- apply(DF, 1, function(y) lm(y ~ x)$coefficients)

你有什么实现此目标的建议吗?感谢你提前的帮助。
1个回答

4

每行只有一个观察结果。请注意,由于自由度不足,您将得到NA的估计。

这个想法是:

 mapply(function(x,y) lm(y~x)$coefficients, DF[,1], DF[,2])

或者

 apply(DF1, 1, function(x) lm(x[2]~x[1])$coefficients)

编辑

假设您的每行有许多观测值,即 xy 变量跨越许多列。

 mapply(function(x,y) lm(y~x)$coefficients, as.data.frame(t(DFNew[1:3])),
                             as.data.frame(t(DFNew[4:6])))

或者

 apply(DFNew, 1, function(x) lm(x[4:6]~x[1:3])$coefficients)

数据

set.seed(25)
DFNew <- as.data.frame(matrix(sample(1:50,10*6, replace=TRUE), ncol=6))

谢谢@akrun。第一组函数正是我在寻找的。然而,我刚刚意识到我的数据框中有一些NA值。因此这些函数不再起作用。在执行DF[1,1] <- NA之后再试一下。 - thiagoveloso
在这种情况下,您是否希望从进行lm的行中排除具有NAs的行? - akrun
是的,理想情况下,在那些行上使用lm会返回NA。我尝试添加na.action=na.omit,但仍然不起作用。 - thiagoveloso
如果你想排除那些行,可以尝试使用DF1 <- DF[!rowSums(is.na(DF)),],然后对DF1进行操作。对于被删除的行,你可以从which(!!rowSums(is.na(DF)))中获取索引。 - akrun
那个运行得非常好。再次感谢@akrun。现在尝试去睡一会儿吧 ;) - thiagoveloso
@ThiagoV.dosSantos 另一个选项是创建 if else 条件。例如:mapply(function(x,y) if(any(is.na(c(x,y)))) NA else lm(y~x)$coefficients, DF[,1], DF[,2]) - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接