2015-03-24 4 views
-1

Я пытаюсь выполнить следующий код:R: моделирование данных

data_greene<-read.delim(file.choose(),header=T) 
result_b2_HC0<-matrix(1:2000,ncol=4) 
for (i in 1:500){ 
    X1<-data_greene[[3]]*10^-4 
    X2<-X1^2 
    e<-rnorm(50,0,1) 
    sigma2<-exp(5.30+5.30*X1) 
    lambda<-max(sigma2)/min(sigma2) 
    Y<-1+1*X1+0*X2+sqrt(sigma2)*e 
    lms<-lmsreg(Y~X1+X2) 
    yhat<-lms$fitted 
    resid<-lms$residual 
    s<-abs(resid) 
    lms2<-lmsreg(s~yhat) 
    shat<-lms2$fitted 
    w1<-1/shat^2 
    scale<-lms$scale[1]  
    stdres<-resid/scale 

    e=abs(stdres) 
    w2<-NULL 
    for (i in 1:50){ 
    if(e[i]<=1.345) w2[i]<-1 else w2[i]<-1.345/e[i] 
    } 

    w<-w1*w2 

    WLS<-lm(Y~X1+X2,weights=w) 
    res1<-WLS$residual 

    HCCMEHC0<-function(Y,X1,X2){ 
    X<-cbind(1,X1,X2) 
    W<-diag(w) 
    inv<-solve(t(X)%*%W%*%X) 
    psi0<-diag(res1^2) 
    HC0<-inv%*%t(X)%*%W%*%psi0%*%W%*%X%*%inv 
    return(HC0) 
    } 
    result_b2_HC0[i,1]<-WLS$coef[3] 
    result_b2_HC0[i,2]<-sqrt(HCCMEHC0(Y,X1,X2)[3,3]) 
    result_b2_HC0[i,3]<-result_b2_HC0[i,1]/result_b2_HC0[i,2] 
    result_b2_HC0[i,4]<-2*pt(-abs(result_b2_HC0[i,3]),df=47) 
} 
result_b2_HC0 

Я бы ожидать, что матрица будет завершена, но результат появляется только в строке 50 в матрице. Что я делаю не так?

+1

вы должны проверить свою переменную 'i', которая используется в первом цикле и вложенном из одного. –

+0

Не могли бы вы указать, какой тип данных вы используете. В. Есть ли проблема с самими файлами? – oaxacamatt

+1

это было бы намного проще просеивать, если вы исправили свою пробел – rawr

ответ

2

Вы используете одну и ту же переменную i в двух вложенных циклах. Измените второй цикл, чтобы вместо этого использовать переменную j.

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

e=abs(stdres) 
w2<-NULL 
for (i in 1:50){ 
    if(e[i]<=1.345) w2[i]<-1 else w2[i]<-1.345/e[i] 
} 

в

e=abs(stdres) 
w2<-ifelse(e <= 1.345, 1, 1.345/e) 

Это чище, легче читать, и быстрее.

+0

спасибо @parasietje –

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