2013-11-26 2 views
1

Прошу прощения, возможно, решение в моей проблеме очень просто, но я все еще новичок в R, и любая помощь здесь оценена!В цикле я не могу суммировать результаты в матрице

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

n<-c(10,8,7,5) 
n_goal<-c(8,9,9,4) 
w<-c(0.1,0.1,0.1,0.1) 
matrix<-mat.or.vec(6,4) 
FI<-function(n_t) { 
    (((n_goal[1]-n[1]+W[1]-f[1]+n_t[1])^2)+((n_goal[2]-n[2]+W[2]-f[2]+n_t[2]-n_t[1])^2)+ 
    ((n_goal[3]-n[3]+W[3]-f[3]+n_t[3]-n_t[2])^2)+((n_goal[4]-n[4]+W[4]-f[4]-n_t[3])^2)) 
} 
for (i in 1:6) { 
    W<-c(n*w) 
    sf<-c(1,1,1,1) 
    f1<-W%*%sf 
    f<-c(f1,0,0,0) 
    out<-nlm(FI, n_t<-c(0,0,0), hessian=TRUE) 
    for (i in 1:3) { 
     if(out$estimate[i]<0) 
      out$estimate[i]=0 
    } 
    n<-c(n-W+f-c(out$estimate,0)+c(0,out$estimate)) 
    matrix[i, ]<-n 
    print(n) 
} 
matrix 

n является выходным я хочу хранить в матрице в каждом цикле, чтобы впоследствии сюжет.

(Каждый n будет точка, и я хотел бы иметь 6 отдельно указывает --- шесть 4 размеры векторов)

Проблема здесь: Я получаю неправильно матрица:

> print(matrix) 
     [,1] [,2]  [,3]  [,4] 
[1,] 0.000000 0 0.000000 0.000000 
[2,] 0.000000 0 0.000000 0.000000 
[3,] 8.000002 9 8.999999 3.999998 
[4,] 0.000000 0 0.000000 0.000000 
[5,] 0.000000 0 0.000000 0.000000 
[6,] 0.000000 0 0.000000 0.000000 

только третья строка имеет правильные номера, все остальные имеют ноль, а печать (п) кажется правильным

[1] 8.0 9.0 8.5 4.5 
[1] 8.00 9.00 8.95 4.05 
[1] 8.000003 9.000000 8.999999 3.999998 
[1] 8.000002 9.000000 8.999999 3.999998 
[1] 8.000002 9.000000 8.999999 3.999998 
[1] 8.000002 9.000000 8.999999 3.999998 

на самом деле я хочу, последняя матрица будет то же самое с печатью (п).

Кроме того, я попытался создать кадр данных, но мне это сложно, поскольку выходы - это векторы, а не одиночные числа.

ответ

0

, не получая в глубь, что ваша функция пытается сделать ...

print(n) Если действительно дает правильный ответ (т.е. каждый цикл правильно), то вы, вероятно, хотите out <- rbind(out, n) команду:

так псевдокод может быть

#start of code 
out <- vector() 
# rest of variables 
FI <- blah blaha..{ 
#etc 
for (i in 1:6) 
{ 
#etc..rst of loop 
# not print (n) 
out<- rbind(out,n) 
} 

return(out) 
} 

или аналогичный.

Надеюсь, это поможет!

+0

Спасибо большое! Я надеюсь, что это сработает! – user3035550

+0

ОК, пожалуйста, закройте Q, если это то, что вы хотите. –

+0

к сожалению, он не работает. В любом случае, спасибо за ваш совет – user3035550

0

У вас есть некоторые ошибки в ваших оптимизациях. Поскольку nlm предназначен для линейных оптимизаций, я сначала попытался упростить минимизированную функцию для использования векторных функций R. Я также избегаю использования глобальных переменных, чтобы избежать побочного эффекта.

FIV <- function(n_t,n_goal,f,W) { 
    n_th <- c(n_t,0) 
    n_tt <- c(0,n_t) 
    sum((n_goal-n+W-f+n_th-n_tt)^2) 
} 

Для ясности и лучшей производительности, тогда я изолирую статические инструкции инициализации от основного цикла.

## initilizations 
n <- c(10,8,7,5) 
n_goal <- c(8,9,9,4) 
w <- c(0.1,0.1,0.1,0.1) 
matrix <-mat.or.vec(6,4) 
sf <- c(1,1,1,1) 

Для петли, нет необходимости использовать for здесь. Используйте replicate, так как вы повторяете одну и ту же задачу без использования индекса и потому, что хотите сохранить окончательный результат в матрице.

replicate(6,{ 
    W <- c(n*w) 
    f1 <- W%*%sf 
    f <- c(f1,0,0,0) 
    out<- nlm(FIV, c(0,0,0), n_goal,f,W,hessian=TRUE) 
    est <- out$estimate 
    est[est<0] <- 0 
    c(n-W+f-c(est,0)+c(0,est)) 
}) 

# [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 8.0 8.0 8.0 8.0 8.0 8.0 
# [2,] 9.0 9.0 9.0 9.0 9.0 9.0 
# [3,] 8.5 8.5 8.5 8.5 8.5 8.5 
# [4,] 4.5 4.5 4.5 4.5 4.5 4.5 

EDIT Вы можете использовать sapply также и обновлять n на каждой итерации (обратите внимание на использование глобального присваивания <<-, поскольку она является глобальной переменной)

sapply(1:6,function(x){ 
    W <- c(n*w) 
    f1 <- W%*%sf 
    f <- c(f1,0,0,0) 
    out<- nlm(FIV, c(0,0,0), n_goal,f,W,hessian=TRUE) 
    est <- out$estimate 
    est[est<0] <- 0 
    n <<- c(n-W+f-c(est,0)+c(0,est)) 
    n 
}) 
+0

Ну, изменения действительно полезны, спасибо! проблема в том, что n изменяется на каждой итерации. Вот почему вы нашли матрицу с теми же столбцами. Могу ли я использовать этот код для? – user3035550

+0

@ пользователь3035550 да конечно. Но как вы меняете? лучше заменить 'replicate'' sapply' в этом случае. Что-то вроде: 'sapply (1: 6, function (x) {n <- something; the_rest_of_replicate_code})' – agstudy

+0

В каждом цикле у меня есть n <-c (n-W + fc (out $ оценка, 0) + c (0, out $ оценка)), где начальное n равно n <- c (10,8,7,5). Следующий n будет (8.0 9.0 8.5 4.5), и я должен использовать это, чтобы найти следующий n .. Это моя проблема! – user3035550

Смежные вопросы