循环线性回归时出错
An error while looping a linear regression
我想 运行 一个循环,它将 运行 每个变量的每个类别,并为每个回归生成一个预测,以便从中推导出预测变量的总和目标变量。这是我的玩具数据和代码:
df <- read.table(text = "target birds wolfs snakes
3 9 7 a
3 8 4 b
1 2 8 c
1 2 3 a
1 8 3 a
6 1 2 a
6 7 1 b
6 1 5 c
5 9 7 c
3 8 7 c
4 2 7 b
1 2 3 b
7 6 3 c
6 1 1 a
6 3 9 a
6 1 1 b ",header = TRUE)
我写了这段代码(下面),它的目的是得到上面写的计算结果,但是我在 :
代码如下:
b <- list()
for(i in c("a","b",'c')){
lmModel <- lm(target ~ birds+wolfs, data = subset(df, snakes == i) )
b[i] <- sum(predict(lmModel,newdata=subset(df, snakes == i))) - sum(df$target[which(df$snakes=='a'),])
}
b <- as.numeric(b)
b
我收到这个错误:
Error in df$target[which(df$snakes == "a"), ] :
incorrect number of dimensions
我该如何解决这个问题?
问题出在你这里混合了子集类型:df$target[which(df$snakes=='a'),]
一旦使用$
,输出就不再是data.frame,两个参数[
子集不再有效。您最好将其压缩为:
sum(df[df$snakes=="a","target"])
[1] 23
至于您的模型,您可以创建一个以 snakes
作为协变量的模型,然后使用该模型的预测对蛇组求和:
lm(target~birds+wolfs+snakes+0,df)
Call:
lm(formula = target ~ birds + wolfs + snakes + 0, data = df)
Coefficients:
birds wolfs snakesa snakesb snakesc
-0.08593 -0.23461 5.15458 5.09446 6.25448
tapply(predict(lm(target~birds+wolfs+snakes+0,df)),df$snakes,sum)
a b c
23 20 22
并获得 b
变量的最终输出,
tapply(predict(lm(target~birds+wolfs+snakes+0,df)),df$snakes,sum) - sum(df[df$snakes=="a","target"])
a b c
1.776357e-14 -3.000000e+00 -1.000000e+00
但请注意,a 值存在细微的数值差异。
或者,要检查,您可以通过 lm
:
的参数指定数据子集
sum(predict(lm(target~birds+wolfs,data=df,subset=snakes=="a")))
[1] 23
sum(predict(lm(target~birds+wolfs,data=df,subset=snakes=="b")))
[1] 20
sum(predict(lm(target~birds+wolfs,data=df,subset=snakes=="c")))
[1] 22
我想 运行 一个循环,它将 运行 每个变量的每个类别,并为每个回归生成一个预测,以便从中推导出预测变量的总和目标变量。这是我的玩具数据和代码:
df <- read.table(text = "target birds wolfs snakes
3 9 7 a
3 8 4 b
1 2 8 c
1 2 3 a
1 8 3 a
6 1 2 a
6 7 1 b
6 1 5 c
5 9 7 c
3 8 7 c
4 2 7 b
1 2 3 b
7 6 3 c
6 1 1 a
6 3 9 a
6 1 1 b ",header = TRUE)
我写了这段代码(下面),它的目的是得到上面写的计算结果,但是我在 :
代码如下:
b <- list()
for(i in c("a","b",'c')){
lmModel <- lm(target ~ birds+wolfs, data = subset(df, snakes == i) )
b[i] <- sum(predict(lmModel,newdata=subset(df, snakes == i))) - sum(df$target[which(df$snakes=='a'),])
}
b <- as.numeric(b)
b
我收到这个错误:
Error in df$target[which(df$snakes == "a"), ] : incorrect number of dimensions
我该如何解决这个问题?
问题出在你这里混合了子集类型:df$target[which(df$snakes=='a'),]
一旦使用$
,输出就不再是data.frame,两个参数[
子集不再有效。您最好将其压缩为:
sum(df[df$snakes=="a","target"])
[1] 23
至于您的模型,您可以创建一个以 snakes
作为协变量的模型,然后使用该模型的预测对蛇组求和:
lm(target~birds+wolfs+snakes+0,df)
Call:
lm(formula = target ~ birds + wolfs + snakes + 0, data = df)
Coefficients:
birds wolfs snakesa snakesb snakesc
-0.08593 -0.23461 5.15458 5.09446 6.25448
tapply(predict(lm(target~birds+wolfs+snakes+0,df)),df$snakes,sum)
a b c
23 20 22
并获得 b
变量的最终输出,
tapply(predict(lm(target~birds+wolfs+snakes+0,df)),df$snakes,sum) - sum(df[df$snakes=="a","target"])
a b c
1.776357e-14 -3.000000e+00 -1.000000e+00
但请注意,a 值存在细微的数值差异。
或者,要检查,您可以通过 lm
:
sum(predict(lm(target~birds+wolfs,data=df,subset=snakes=="a")))
[1] 23
sum(predict(lm(target~birds+wolfs,data=df,subset=snakes=="b")))
[1] 20
sum(predict(lm(target~birds+wolfs,data=df,subset=snakes=="c")))
[1] 22