2011-05-30 69 views
2

我在R A模型:如何實現C R模型++代碼

> s1 <- toys[1:10000,] 
> model <- glm(V11~V2+V3+V5+V7+V8+V9+V10,gaussian,s1) 
> model 

Call: glm(formula = V11 ~ V2 + V3 + V5 + V7 + V8 + V9 + V10, family = gaussian, 
    data = s1) 

Coefficients: 
(Intercept)   V2   V3   V5   V7   V8   V9   V10 
    -0.900106  0.006385 -0.005080  1.006324  0.229282  0.-0.049307 -0.186450 

Degrees of Freedom: 9999 Total (i.e. Null); 9992 Residual 
Null Deviance:  11050000 
Residual Deviance: 121200 AIC: 53340 

現在,我該如何設定此R型爲C函數? (帶有鏈接的RTFM就足夠了)

也許我只需要將來自R模型的所有係數乘以它們各自的輸入並添加所有項以得到最終結果?

float model(float v2, float v3, ... float v10) 
{ 
    return -0.900106 * v2 + 0.006385 * v3 + .. + (-0.186450) * v10; 
} 

我需要獨立的代碼不依賴於任何外部來源

+1

正是你想要做的:一個計算給定輸入數據的迴歸係數的程序,還是一個輸出給定一組參數的預測的程序? – chl 2011-05-30 08:16:34

+0

@chl給出了由R估計的迴歸係數,我想用C實現這個迴歸模型,以便從C代碼返回預測結果。 – 2011-05-30 08:20:16

+0

您錯過了您提供的代碼片段中的截取術語。對於存儲在x1,x2,...中的觀測值,這應該爲y = -0.900 + 0.006 * x1 - 0.005 * x2 ...我會相應地更新我的答案。 – chl 2011-05-30 08:29:02

回答

4

你問了一個線性迴歸模型(在這裏,R glm()代表廣義線性模型,但由於您使用的是身份鏈接,你最終得到一個線性迴歸)。 C中有幾種實現方式,例如apophenia庫,它具有一組不錯的統計函數,並綁定了MySQL和Python。 GSLALGLIB庫也有專用算法。

但是,對於輕量級和幾乎獨立的C代碼,我建議看看snpMatrix BioC軟件包的源代碼中提供的glm_test.c


在更新的問題之後,似乎您更希望根據一組迴歸參數預測結果。然後,假設假設模型的一般形式是y = b0 + b1 * x1 + b2 * x2 + ... + bp * xp,其中b0是截距,b1,...,bp是迴歸係數根據數據估計),計算相當簡單,因爲它相當於一個加權和:把你的p個預測值的每個觀察值乘以b(不要忘記截距項!)。

您可以使用R predict()函數仔細檢查結果;這裏有兩個預測,一個名爲V1V2,100個觀測和新值的預測結果的規則網格的例子(您可以使用您自己的數據以及):

> df <- transform(X <- as.data.frame(replicate(2, rnorm(100))), 
            y = V1+V2+rnorm(100)) 
> res.lm <- lm(y ~ ., df) 
> new.data <- data.frame(V1=seq(-3, 3, by=.5), V2=seq(-3, 3, by=.5)) 
> coef(res.lm) 
(Intercept)   V1   V2 
0.006712008 0.980712578 1.127586352 
> new.data 
    V1 V2 
1 -3.0 -3.0 
2 -2.5 -2.5 
... 
> 0.0067 + 0.9807*-3 + 1.1276*-3 # with approximation 
[1] -6.3182 
> predict(res.lm, new.data)[1] 
     1 
-6.318185