2015-06-15 5 views
0

Я хотел бы запустить цикл, который будет выполняться для каждой категории одной из переменных и произвести прогноз на каждую регрессию, чтобы сумма переменной прогнозирования была выведена из целевой переменной .Здесь является ли моя игрушка данные и код:Ошибка при циклировании линейной регрессии

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 

Как я могу решить эту проблему?

+2

'ФР [который (DF $ змея == 'а'), "мишени"] или' df $ target [which (df $ snakes == 'a')] ' –

+0

Спасибо, @ Andriy.I использовал df $ target [который (df $ snakes == 'a')], и он работает. – mql4beginner

+1

Вы можете попробовать 'x <- lmList (Petal.Length ~ Petal.Width | Виды, data = iris); x @ .Data', чтобы построить модель, предсказать для каждого 'змеи' и вычислить разницу за один раз. –

ответ

1

Проблема не возникает из вас смесей Подменят тип здесь: 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 

, но обратите внимание, что есть небольшое численное несоответствие для значения.

В качестве альтернативы, и проверить, можно указать подмножество данных с помощью аргумента 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 
Смежные вопросы