2011-05-30 113 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