如何不均匀地归一化数据集

How to normalise a dataset unevenly

提问人:Xandian97 提问时间:10/25/2023 最后编辑:Xandian97 更新时间:10/25/2023 访问量:68

问:

所以我有一个预期寿命值在 30 到 100 之间的数据集。我想在 0-1 之间使它们正常化,但我想不均匀地进行?

基本上,我有四个定义的间隔/断点值,创建了 5 个类:

断点 年龄 归一化值
最小值 30 0
BP1型 57 0.2
BP2型 62 0.4
BP3型 66 0.6
BP4型 71 0.8
麦克斯 100 1

我可以轻松地将它们重新分类为这五个类,但我不知道如何使用这些断点计算归一化值。所有五个班级的范围都是0.2,但每个班级的年龄范围会有所不同,例如.class一个班级,0-0.2,年龄范围为27岁,但第二类,0.2-0.4,范围只有5岁。

示例数据:

ages <- floor(runif(50, min = 30, max = 100))

编辑:

所以在这张图上,x 是以年为单位的预期寿命,y 是归一化值 - 我想计算每个 x 值的 y 的确切值。LE to Normalised Values graph

R 归一化

评论

0赞 Derf 10/25/2023
您能否提供分类区间的下限和上限?$30-56$ 是 $0$ 类的分类间隔吗?
0赞 Xandian97 10/25/2023
哦,当然,五个年龄等级是:30-57 岁、57-62 岁、62-66 岁、66-71 岁和 71-100 岁,等效的标准化等级是 0-0.2、0.2-0.4、0.4-0.6、0.6-0.8 和 0.8-1

答:

4赞 one 10/25/2023 #1

一种标准方法是使用逻辑回归:

glmfit <- glm(Normalised_value~Age,data=df,family = binomial())
plot(glmfit)

predict(glmfit,newdata=data.frame(Age=30:100),type="response")

          1           2           3           4           5           6           7 
0.001038676 0.001270899 0.001554960 0.001902391 0.002327270 0.002846769 0.003481828 
          8           9          10          11          12          13          14 
0.004257952 0.005206175 0.006364213 0.007777825 0.009502425 0.011604952 0.014166036 
         15          16          17          18          19          20          21 
0.017282440 0.021069773 0.025665399 0.031231419 0.037957508 0.046063272 0.055799610 
         22          23          24          25          26          27          28 
0.067448397 0.081319557 0.097744402 0.117063988 0.139611296 0.165686430 0.195524878 
         29          30          31          32          33          34          35 
0.229260322 0.266885403 0.308216030 0.352866476 0.400242921 0.449561353 0.499891678 
         36          37          38          39          40          41          42 
0.550224198 0.599549040 0.646935614 0.691599168 0.732945010 0.770586518 0.804338777 
         43          44          45          46          47          48          49 
0.834193745 0.860284578 0.882846413 0.902179147 0.918615680 0.932497075 0.944154716 
         50          51          52          53          54          55          56 
0.953898634 0.962010835 0.968742352 0.974312922 0.978912346 0.982702836 0.985821857 
         57          58          59          60          61          62          63 
0.988385104 0.990489415 0.992215484 0.993630305 0.994789335 0.995738372 0.996515163 
         64          65          66          67          68          69          70 
0.997150770 0.997670717 0.998095963 0.998443694 0.998728001 0.998960424 0.999150415 
         71 
0.999305707 

plot(df$Age,df$Normalised_value)
lines(30:100,predict(glmfit,newdata=data.frame(Age=30:100),type="response"))

源语言:

我们可以利用 和 ,它创建分段线性样条回归:splines::bslm

library(splines)

spline_fit <- lm(Normalised_value ~ bs(Age, knots=c(57,62,66,71),degree=1),data=df)
newdata <- data.frame(Age=30:100)
newdata$normalized <- predict(spline_fit,newdata=newdata)
newdata

   Age   normalized
1   30 1.416396e-16
2   31 7.407407e-03
3   32 1.481481e-02
4   33 2.222222e-02
5   34 2.962963e-02
6   35 3.703704e-02
7   36 4.444444e-02
8   37 5.185185e-02
9   38 5.925926e-02
10  39 6.666667e-02
11  40 7.407407e-02
12  41 8.148148e-02
13  42 8.888889e-02
14  43 9.629630e-02
15  44 1.037037e-01
16  45 1.111111e-01
17  46 1.185185e-01
18  47 1.259259e-01
19  48 1.333333e-01
20  49 1.407407e-01
21  50 1.481481e-01
22  51 1.555556e-01
23  52 1.629630e-01
24  53 1.703704e-01
25  54 1.777778e-01
26  55 1.851852e-01
27  56 1.925926e-01
28  57 2.000000e-01
29  58 2.400000e-01
30  59 2.800000e-01
31  60 3.200000e-01
32  61 3.600000e-01
33  62 4.000000e-01
34  63 4.500000e-01
35  64 5.000000e-01
36  65 5.500000e-01
37  66 6.000000e-01
38  67 6.400000e-01
39  68 6.800000e-01
40  69 7.200000e-01
41  70 7.600000e-01
42  71 8.000000e-01
43  72 8.068966e-01
44  73 8.137931e-01
45  74 8.206897e-01
46  75 8.275862e-01
47  76 8.344828e-01
48  77 8.413793e-01
49  78 8.482759e-01
50  79 8.551724e-01
51  80 8.620690e-01
52  81 8.689655e-01
53  82 8.758621e-01
54  83 8.827586e-01
55  84 8.896552e-01
56  85 8.965517e-01
57  86 9.034483e-01
58  87 9.103448e-01
59  88 9.172414e-01
60  89 9.241379e-01
61  90 9.310345e-01
62  91 9.379310e-01
63  92 9.448276e-01
64  93 9.517241e-01
65  94 9.586207e-01
66  95 9.655172e-01
67  96 9.724138e-01
68  97 9.793103e-01
69  98 9.862069e-01
70  99 9.931034e-01
71 100 1.000000e+00

评论

0赞 Xandian97 10/25/2023
我想我已经让它工作了,并将符号转换回正常的十进制数 - 但值只是断点,例如 0、0.2、0.4 等。我在我的问题中添加了一个图表,试图让它更清楚地说明我想要什么。
0赞 Xandian97 10/25/2023
太棒了——正是我需要的!