R在因子的每个级别内执行线性回归

时间:2013-10-10 15:05:54

标签: r

我想计算斜率并调整两个变量之间的R平方(indiv_mass_log2bo和total_number_sum)。我的问题是我有一个1000个湖泊的庞大数据库,这两个变量都是在这里得到的。所以,我认为它可以用函数for,但我不知道如何计算它。

在这里,我附上1000个湖泊中的两个:

    lake_name        indiv_mass_log2bo  total_number_sum
   621974-134428_Bandsj�n   3,00    15,00
   621974-134428_Bandsj�n   4,00    45,00
   621974-134428_Bandsj�n   5,00    51,00
   621974-134428_Bandsj�n   6,00    98,00
   621974-134428_Bandsj�n   7,00    27,00
   623161-140769_Lerjesj�n  4,00    8,00
   623161-140769_Lerjesj�n  5,00    5,00
   623161-140769_Lerjesj�n  6,00    7,00
   623161-140769_Lerjesj�n  7,00    12,00
   623161-140769_Lerjesj�n  8,00    3,00

2 个答案:

答案 0 :(得分:1)

的内容
library(plyr)
sumFun <- function(x) {
  fit <- lm(total_number_sum ~ indiv_mass_log2bo, data=x)
  data.frame(slope=coef(fit)[2],adjrsq=summary(fit)$adj.r.sq)
} 
ddply(myData,"lake",sumFun)

答案 1 :(得分:1)

每个湖执行一项操作的最简单方法是从中创建data.table(您必须安装data.table包):

library(data.table)
lakes.dt = data.table(lakes)

然后编写一个执行线性回归并获得所需结果的函数,将它们作为列表返回:

linreg = function(formula) {
    m = lm(formula)
    list(slope=coefficients(m)[2], adj.r2=summary(m)$adj.r.squared)
}

并使用by=在每个湖泊内执行操作:

regression.results = lakes.dt[, linreg(total_number_sum ~ indiv_mass_log2bo), by=lake_name]