循环线性回归时出错

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