循环内的线性模型(用于子集数据的循环)

时间:2015-09-09 13:37:03

标签: r loops gradient subset lm

我(我认为应该是)R中的一个直接问题,似乎无法让它发挥作用。希望你能帮忙。

我有一个数据框,例如:

x  y  z
1  2  a
2  3  a
3  4  a
4  5  b
5  6  b
6  7  b      etc...

我为每个z值子集(例如a,b ...)拟合线性模型(y~x)并提取梯度。

当我使用with语句选择'a'时,它会起作用:

coef(with(subset(data.frame, z == "a"), {lm(y ~ x)
}))[2]

但我的问题是我在Z列中有超过1000个唯一值。所以我试图设置一个循环(我知道R用户讨厌循环!)依次为z的每个值执行此操作并将结果返回到数据框中。代码是:

gradient.lm = NULL

unique.z <- as.matrix((unique(data.frame$z)))
count.z <- nrow(unique.z)

for (i in 1:count.z) {
  gradient.lm[i] = coef((with(subset(data.frame, z == [i]), {lm(y ~ z)
  })))[2]
}

但这不起作用,并给我错误代码:

> for (i in 1:count.z) {
+   activity.lm[i] = coef((with(subset(data.frame, z == [i]), {lm(y ~ x)
Error: unexpected '[' in:
"for (i in 1:count.z) {
  activity.lm[i] = coef((with(subset(data.frame, z == ["
>   })))[2]
Error: unexpected '}' in "  }"
> }
Error: unexpected '}' in "}"

我的猜测是它没有意识到with函数中有[i]。

我无法找到一种方法来完成这项工作,或者想出另一种方法。如果您有任何建议,我们将非常感激。

1 个答案:

答案 0 :(得分:1)

在base-R中,为您提供一个只有您显然感兴趣的渐变的命名向量:

gradient.lm <- unlist(lapply(split(df,df$z),function(chunk){
  return(coef(lm(y~x, data=chunk))[[2]])
}))