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

R 循环内的线性模型(用于子集数据的循环),r,loops,gradient,subset,lm,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] 但我的

我在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]
}
我的猜测是,它没有意识到with函数中存在[i]


我找不到一种方法来做这件事,或者想不出另一种方法来做。如果您有任何建议,我们将不胜感激。

我强烈推荐
dplyr
broom
套餐解决方案:

set.seed(44)

dt = data.frame(x = rnorm(40, 5, 5),
                y = rnorm(40, 3, 4),
                z = rep(c("a","b"), 20))

library(dplyr)
library(broom)

dt %>%
  group_by(z) %>%            # group by column z
  do(tidy(lm(y~x, data=.)))  # for each group create model using corresponding x and y values

# Source: local data frame [4 x 6]
# Groups: z [2]
# 
#        z        term    estimate std.error  statistic    p.value
#   (fctr)       (chr)       (dbl)     (dbl)      (dbl)      (dbl)
# 1      a (Intercept)  3.54448459 1.8162699  1.9515186 0.06673401
# 2      a           x -0.18140655 0.2260252 -0.8025944 0.43267918
# 3      b (Intercept)  1.69024601 1.1960922  1.4131402 0.17467413
# 4      b           x  0.02647677 0.1914492  0.1382966 0.89154143

您可以提取所需的
lm
输出的任何信息。

我强烈推荐
dplyr
broom
包解决方案:

set.seed(44)

dt = data.frame(x = rnorm(40, 5, 5),
                y = rnorm(40, 3, 4),
                z = rep(c("a","b"), 20))

library(dplyr)
library(broom)

dt %>%
  group_by(z) %>%            # group by column z
  do(tidy(lm(y~x, data=.)))  # for each group create model using corresponding x and y values

# Source: local data frame [4 x 6]
# Groups: z [2]
# 
#        z        term    estimate std.error  statistic    p.value
#   (fctr)       (chr)       (dbl)     (dbl)      (dbl)      (dbl)
# 1      a (Intercept)  3.54448459 1.8162699  1.9515186 0.06673401
# 2      a           x -0.18140655 0.2260252 -0.8025944 0.43267918
# 3      b (Intercept)  1.69024601 1.1960922  1.4131402 0.17467413
# 4      b           x  0.02647677 0.1914492  0.1382966 0.89154143

您可以提取所需的
lm
输出的任何信息。

我强烈推荐
dplyr
broom
包解决方案:

set.seed(44)

dt = data.frame(x = rnorm(40, 5, 5),
                y = rnorm(40, 3, 4),
                z = rep(c("a","b"), 20))

library(dplyr)
library(broom)

dt %>%
  group_by(z) %>%            # group by column z
  do(tidy(lm(y~x, data=.)))  # for each group create model using corresponding x and y values

# Source: local data frame [4 x 6]
# Groups: z [2]
# 
#        z        term    estimate std.error  statistic    p.value
#   (fctr)       (chr)       (dbl)     (dbl)      (dbl)      (dbl)
# 1      a (Intercept)  3.54448459 1.8162699  1.9515186 0.06673401
# 2      a           x -0.18140655 0.2260252 -0.8025944 0.43267918
# 3      b (Intercept)  1.69024601 1.1960922  1.4131402 0.17467413
# 4      b           x  0.02647677 0.1914492  0.1382966 0.89154143

您可以提取所需的
lm
输出的任何信息。

我强烈推荐
dplyr
broom
包解决方案:

set.seed(44)

dt = data.frame(x = rnorm(40, 5, 5),
                y = rnorm(40, 3, 4),
                z = rep(c("a","b"), 20))

library(dplyr)
library(broom)

dt %>%
  group_by(z) %>%            # group by column z
  do(tidy(lm(y~x, data=.)))  # for each group create model using corresponding x and y values

# Source: local data frame [4 x 6]
# Groups: z [2]
# 
#        z        term    estimate std.error  statistic    p.value
#   (fctr)       (chr)       (dbl)     (dbl)      (dbl)      (dbl)
# 1      a (Intercept)  3.54448459 1.8162699  1.9515186 0.06673401
# 2      a           x -0.18140655 0.2260252 -0.8025944 0.43267918
# 3      b (Intercept)  1.69024601 1.1960922  1.4131402 0.17467413
# 4      b           x  0.02647677 0.1914492  0.1382966 0.89154143
您可以提取所需的
lm
输出的任何信息。

这似乎有效:

unique_z = unique(df$z)
coef_vec = vector(mode = "list", length = length(unique_z))

coef_vec[1] = 
for (i in unique_z){
  coef_vec[i] = 
    coef(
      with(
        subset(df, z==i), 
      {lm(y~x)}))[2]
}

print(coef_vec)
Cleary
coef_vec[i]
对应于
unique_z[i]
中的z值,因此您可以将系数与其
z
值匹配。

这似乎有效:

unique_z = unique(df$z)
coef_vec = vector(mode = "list", length = length(unique_z))

coef_vec[1] = 
for (i in unique_z){
  coef_vec[i] = 
    coef(
      with(
        subset(df, z==i), 
      {lm(y~x)}))[2]
}

print(coef_vec)
Cleary
coef_vec[i]
对应于
unique_z[i]
中的z值,因此您可以将系数与其
z
值匹配。

这似乎有效:

unique_z = unique(df$z)
coef_vec = vector(mode = "list", length = length(unique_z))

coef_vec[1] = 
for (i in unique_z){
  coef_vec[i] = 
    coef(
      with(
        subset(df, z==i), 
      {lm(y~x)}))[2]
}

print(coef_vec)
Cleary
coef_vec[i]
对应于
unique_z[i]
中的z值,因此您可以将系数与其
z
值匹配。

这似乎有效:

unique_z = unique(df$z)
coef_vec = vector(mode = "list", length = length(unique_z))

coef_vec[1] = 
for (i in unique_z){
  coef_vec[i] = 
    coef(
      with(
        subset(df, z==i), 
      {lm(y~x)}))[2]
}

print(coef_vec)

Cleary
coef_vec[i]
对应于
unique_z[i]
中的z值,因此您可以将系数与其
z
值进行匹配。

在base-R中,仅获得您显然感兴趣的梯度的命名向量:

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

gradient.lm在base-R中,为您提供仅包含您显然感兴趣的渐变的命名向量:

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

gradient.lm在base-R中,为您提供仅包含您显然感兴趣的渐变的命名向量:

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

gradient.lm在base-R中,为您提供仅包含您显然感兴趣的渐变的命名向量:

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


gradient.lm使用
z==unique.z[i]
而不是
z==i]
(给函数这样的变量命名通常是不好的做法(
data.frame
))使用
z==unique.z[i]
而不是
z==i]
(给函数这样的变量命名通常是不好的做法(
data.frame
)使用
z==unique.z[i]
而不是
z==i]
(给函数(
data.frame
)等变量命名通常是不好的做法)使用
z==unique.z[i]
而不是
z==i]
(给函数(
data.frame
)等变量命名通常是不好的做法)您的解决方案不会返回或分配任何内容。@Heroka您可以轻松地执行吗?不?如果您愿意,我会修改它,将其全部放在一个向量中。您的解决方案不会返回或分配任何内容。@Heroka您可以轻松地这样做不?如果您愿意,我会修改它,将其全部放在一个向量中。您的解决方案不会返回或分配任何内容。@Heroka您可以轻松地这样做不?如果您愿意,我会修改它,将其全部放在一个向量中。您的解决方案不会返回或分配任何内容。@Heroka您可以轻松地这样做不?如果你愿意的话,我会修改它,把它全部放在一个向量中。赫罗卡,这似乎很好用。非常感谢你!!赫罗卡,这似乎很好用。非常感谢你!!赫罗卡,这似乎很好用。非常感谢你!!赫罗卡,这似乎很好用。非常感谢你!!