2012-12-11 39 views
-3
require(fracdiff) 
#load your data, n is the sample size 

x<-matrix(scan("data.txt", n =), n, 1, byrow = TRUE) 

x<-log(x) 
x<-x-mean(x) 
n<-length(x) 


#select the truncation 
m<-round(n^(0.7)) 

perdx<-px[2:n] 
fn<-function(h) 
    { 
     lambda<-freq[1:m]^(2*h-1) 
     Gh=mean(perdx[1:m]*lambda) 
     Rh=log(Gh)-(2*h-1)*mean(log(freq[1:m])) 
     return(Rh) 
    } 
    est<-optimize(fn,c(0,1.5),tol = 0.00001) 
    hhat<-est$minimum 
    b <- hhat-0.5 
    b 

我有這個功能寫在R和I想爲m,其中m < -round(N ^(0.7))其中,從0.3-0.8運行n的功率(do循環默認值是0.7,所以我給函數提供了不同的m值),並且最終得到b的字符串(每個b的冪爲從0.3-0.8開始),但到目前爲止我一直不成功。此外,我想繪製關於m的b的不同值。我真的希望任何人都可以建議我如何得到結果。任何建議非常感謝。謝謝。循環在功能,使用R

+6

請給出'freq'和'perdx' [讓示例可重現](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – Roland

+0

-1因爲1)這仍然不可重複; 2)在某人(我)回答之後,您更改了問題的參數; 3)爲什麼要求(fracdiff)'?代碼中的每個函數都在'base'中。 – plannapus

回答

2

首先,一些假的數據:

set.seed(1983) 
freq <- rnorm(100, mean=10) 
perdx <- rnorm(100, mean=100, sd=10) 

然後你的函數(略縮短,修改後:你需要添加m作爲參數,因爲它會在每次迭代中改變),矢量m和空載體b (你要分配的前期向量的長度):

m <- 1:100 
b <- vector(length=length(m)) 
fn <- function(h,m){ 
    lambda <- freq[1:m]^(2*h-1) 
    Gh <- mean(perdx[1:m]*lambda) 
    log(Gh)-(2*h-1)*mean(log(freq[1:m])) 
    } 

最後你的循環:

for(i in seq_along(m)){b[i] <- optimize(fn,c(0,1.5),tol = 0.00001, m=m[i])$minimum - 0.5} 

b 
    [1] 0.370809995 0.143004969 0.295652288 0.341975500 0.155323568 -0.004270843 -0.004463482 -0.005151013 -0.019702428 -0.066622938 -0.071558276 -0.051269281 -0.010162819 -0.011613268 
[15] -0.043173232 -0.023702358 -0.017404588 -0.041314701 -0.041849379 -0.039659543 -0.042926431 -0.041149212 -0.050584172 -0.051101425 -0.051999900 -0.053473729 -0.007245899 -0.023556513 
[29] -0.026109458 -0.035935971 -0.063366257 -0.048185532 -0.051862241 -0.051659993 -0.078318886 -0.080683266 -0.082146068 -0.088776082 -0.095815094 -0.097276217 -0.099827675 -0.090215664 
[43] -0.091023273 -0.090649640 -0.091877778 -0.091318363 -0.083812376 -0.091700899 -0.086337626 -0.105456723 -0.105972890 -0.101094946 -0.101748039 -0.101323129 -0.070511638 -0.081105305 
[57] -0.072667430 -0.072361640 -0.069692202 -0.067384208 -0.072985712 -0.063617816 -0.064122242 -0.067135980 -0.070663150 -0.069359528 -0.069691113 -0.084422380 -0.073379583 -0.072209507 
[71] -0.069132825 -0.067681419 -0.063782326 -0.057532656 -0.063031479 -0.054001810 -0.053523184 -0.051783114 -0.053388449 -0.055742505 -0.052429781 -0.058399275 -0.059529803 -0.059389065 
[85] -0.058834476 -0.043061836 -0.045186752 -0.048336234 -0.055597368 -0.065307991 -0.060903775 -0.062518358 -0.062898386 -0.059452595 -0.051983381 -0.049742105 -0.050124722 -0.049212744 
[99] -0.041458672 -0.043251041 
+0

它確實有效,非常感謝您的幫助 – user1893912

+0

不客氣。我稍微修改了它(從'for(in 1:100)'到'for(in 1:length(m))',所以你可以用你想要的任何東西代替'm'。作爲一個整數向量,因爲你會用'freq'和'perdx'來索引它,你的新例子會變成:'m < - round(n ^(seq(0.3,0.8,by = 0.01)))'for例如: – plannapus

+1

你可以使用'seq_along(m)'而不是'1:length(m)'。 – Roland