R 循环内的线性模型(用于子集数据的循环)
我在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] 但我的
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)
Clearycoef_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)
Clearycoef_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)
Clearycoef_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您可以轻松地这样做不?如果你愿意的话,我会修改它,把它全部放在一个向量中。赫罗卡,这似乎很好用。非常感谢你!!赫罗卡,这似乎很好用。非常感谢你!!赫罗卡,这似乎很好用。非常感谢你!!赫罗卡,这似乎很好用。非常感谢你!!